关于如何将地球经纬度坐标系统转换成程序中常用到的平面2D坐标系统,网上的文章很多,参考http://www.cnblogs.com/beniao/archive/2010/04/18/1714544.html(本文图1 图3来自此处).谷歌地图采用的投影方式为“墨卡托投影法”(维基百科网址http://en.wikipedia.org/wiki/Mercator_projection),大概意思就是将地球放在一个圆柱中,让地球赤道和圆柱壁相接触,在地球中心放一盏灯,地球上的图像在圆柱壁上会产生阴影,然后将圆柱壁展开,得到的一张“长方形地图”即为转换之后的平面2D地图,描述很简单,实际展开后的地图还进行了其他处理。

图1

可以想象到,地球上的经度经过灯光的照射之后,在圆柱壁上生成的阴影应该是均匀分步的,而纬度就不一样了,纬度经过灯光照射之后,离赤道越近的分布越密,离赤道越远的分步越稀,到了地球两极(南极和北极),就会趋向无穷稀,因此谷歌地图并没有包含地球两极的区域(北边到北纬85度,南边到南纬85度,大概)。

谷歌地图包含的地球范围为 经度:0度~东经180,0度~西经180(共360度),纬度:0度~北纬85,0度~南纬85(共170度)。注:以上0经度表示通过英国的本初子午线,0纬度指赤道。转换成平面2D图之后,原点(0,0)在左上方(跟程序中一致),用像素作为单位,这样一来,地球上任何一个点(经度,纬度)都能转换成平面2D坐标系统中的一个点(x,y),转换算法已经提供了,直接可以拿来使用。前面说到,经度和纬度在圆柱壁上的阴影分步密度不同,纬度远离赤道分步越稀,因此,虽然经度范围为360度(-180~180,西经为负,东经为正,自西往东,经度越来越大),远远大于纬度170度(-85~85,南纬为负,北纬为正),但是映射到圆柱壁之后生成的图片的长宽却是相等的(这个也有后期经过处理的原因),实质上,谷歌地图的长宽确实是相同的。

由于平面地图是可以放大缩小的,因此地图不可能使用同一张图,这样放大后就会失真,谷歌地图的做法就是给地图预先定义缩放等级(0级~22级,常用的0~17),每一个缩放级别均对应许许多多的小方块图片(称为瓦片),这些小方块都是256*256像素,然后将这些瓦片拼接起来生成一张大的清晰的地图。谷歌地图的缩放级别与瓦片数目有一个对应关系:瓦片数目=2的n次方*2的n次方(n为缩放级别)。也就是说,当缩放级别为0时,整个世界地图只1*1张256*256的图,当缩放级别为1,整个世界地图包含2*2张256*256大小的图,当缩放级别为2,整个世界地图包含4*4张256*256大小的图。下图为缩放级别为0时,坐标对应关系:

图2

当缩放级别改变时,整个世界地图组成变化如下图:

图3

谷歌地图背景显示原理就是将每个缩放级别下的瓦片下载下来,然后拼接在一起,如果我们知道了下载瓦片的方法,那么我们也能模拟一个类似谷歌地图的显示界面。下面提供的一个demo演示了如何根据你提供的两个经纬度点(左上角,右下角),以及缩放级别,下载这两点包含区域的瓦片,最后拼接起来。

demo不做过多说明,代码中注释很详细,注意一下几点:

  • 谷歌地图提供API,通过http请求,给出瓦片的列、行以及缩放级别,就可以下载对应的瓦片,

国内地址:http://mt0.google.cn/vt/lyrs=m@234000000&hl=zh-CN&gl=CN&src=app&x=0&y=0&z=0

国外地址:http://mts0.googleapis.com/vt?lyrs=m&x=0&y=0&z=0

其中,地址前面的mt0可以是mt1、mt2、mt3,分别为不同服务器,对应的,mts0可以为mts1、mts2、mts3。x、y、z分别表示瓦片的列号、行号以及缩放级别。

lyrs表示地图类型:

m:路线图

t:地形图

p:带标签的地形图

s:卫星图

y:带标签的卫星图

  • demo中填写的左上角和右下角点的经纬度范围分别为(-180~180)和(-85~85),而且左上角点的经度一定要小于右下角的经度,左上角的纬度一定要大于右下角的纬度,至于为什么,原因就是必须能通过这两点确定一个区域。demo程序中未作判断。
  • 不要选择区域过大,或者缩放级别过大,因为包含的要下载瓦片太多,程序没做任何性能优化,可能出现bug。线程不宜太多,太多反而速度慢。如果下载图片有失败的,可以重新下载几次,可以完善一下,比如只下载上次失败的图片。
  • demo针对google map,其他地图类似。本人公司实际项目中用到了从谷歌地图中下载下来的这些瓦片,模仿谷歌地图显示原理做了一个地图显示模块。

效果图:

图4 demo主界面

图5 下载完成的瓦片

图6 拼接瓦片成一张大图

源码下载地址:http://files.cnblogs.com/xiaozhi_5638/GoogleMapDownLoader.rar

VS2010 win7调试通过,希望有帮助!

作者:周见智 
出处:http://www.cnblogs.com/xiaozhi_5638/ 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。C#

C#版谷歌地图下载器设计与实现相关推荐

  1. 谷歌地图下载器中“地图艺术照”

    最经在网上流传的[8张谷歌地图"谷歌地图艺术照",颠覆艺术界对地球的认知]的确火了一把,是把用谷歌卫星地图截取的图片进行了对称镜像.地图中分别是:中国的三峡大坝:美国明尼苏达州东百 ...

  2. 谷歌地图下载器中地图艺术照

    最经在网上流传的[8张谷歌地图"谷歌地图艺术照",颠覆艺术界对地球的认知]的确火了一把,是把用谷歌卫星地图截取的图片进行了对称镜像.地图中分别是:中国的三峡大坝:美国明尼苏达州东百 ...

  3. 谷歌卫星地图下载器有哪些那款好用

    众所周知,谷歌卫星地图以其"影像清晰.更新迅速.时间近.精度高"的特点受到了广大地图爱好者的喜爱,为了能够将其下载 ,谷歌卫星地图下载器也随之应运而生,目前市面上有很多款谷歌卫星地 ...

  4. 那些年,我们用过的地图下载器

    作为地信.遥感.地质.测绘等专业的同学,下载电子地图.遥感影像应该都接触过,现在XX地图下载器广告满天飞,虽然各位同学唯唯诺诺,还是被群主踢出了.现在把自己那些年珍藏的地图下载器分享给大家.对各种下载 ...

  5. 万能地图下载器与Oruxmaps完美结合制作离线地图

    对于喜欢户外登山和需要野外寻线的朋友,由于野外没有网络,需要手持设备内的地图是离线地图,离线地图可以通过水经注万能地图下载器获取,今天以手机使用Oruxmaps为例,介绍如何制作Oruxmaps离线地 ...

  6. 万能地图下载器带你看城市30年的变迁

    谷歌地图去年推出的历史影像功能,用户可以在软件里查看某个地方从1984年到2016年的所有卫星照片,30多年的地表变化.城市发展,一览无遗. 据小编所知,这一功能是谷歌地图与美国地质调查局进行的一次合 ...

  7. 如何将万能地图下载器下载的卫星地图加载到Autodesk InfraWorks 360内进行道路规划设计

    最近有遇到朋友想要将万能地图下载器内下载的卫星地图加载到Autodesk InfraWorks 360内进行道路规划设计,查找了相关的资料,找到了如何加载进入的方法,给大家分享一下,希望对大家能够有所 ...

  8. 太乐地图下载器 V5.0.5 破解版

    博主今天给大家带来太乐地图下载器 V5.0.5 破解版 需要的小伙伴下载使用哦:http://download.csdn.net/download/shujujiegougou/9514304?utm ...

  9. 太乐地图下载器5.0.5(破解版)

    简介 太乐地图下载器是一款地图.高程下载类GIS软件,支持将下载的地图.高程等数据进行多种专业格式转换,或发布为地图服务,旨在辅助用户提高工作效率,轻松构建自己的地图应用.可应用于学术科研.工程.规划 ...

最新文章

  1. 离线安装k8s 1.9.0
  2. base64 linux_每个Linux新手都应该记住的10个基本Linux命令
  3. python第三方库有哪些常用的、请列举15个-阿里巴巴Python开发工程师面试题
  4. 使用js代码将HTML Table导出为Excel
  5. oracle primavera p6 下载,【项目管理软件套装】Oracle Primavera P6 Enterprise
  6. sqlite4java下载_使用sqlite4java的UnsatisfiedLinkError,没有sqlite4java-osx-amd64
  7. 看故事学知识,这篇Java代理的文章妙啊!
  8. ldaptemplate 分页_UI设计干货分享:设计语言 - 侧边导航栏/分页
  9. 发现个好玩的,去页面敲键盘,页面键变色
  10. Elastic Search + Logstash + Kibana 初学者日志
  11. qt编写的android菜单,Qt for Android实现与webview的交互
  12. Benchmark与Profiler---性能调优得力助手
  13. mysql group by 用法解析(详细)
  14. python读取hive方案分析
  15. 机器学习CS229极简的6张速查表
  16. python for line in sys.stdin读文件,按行处理
  17. 彻底解决 linux 下 buff/cache 占用过高的问题
  18. MATLAB求解矩阵特征值的六种方法
  19. php curl添加授权Authorization 验证头
  20. 自己做饭吃,怎样从极耗时的买菜、择菜、洗菜、切菜、配菜中解脱出来?

热门文章

  1. 巨头争相布局的AI医疗,随着热潮褪去AI赛道会变宽松点吗?
  2. Git push之后回滚
  3. PPP咨询:明确纳入工程咨询
  4. awk 指定列后面插入一列
  5. 谷粒商城异步编排(三十二)
  6. Python字符串类型以及应用
  7. http访问接口post和get方法类
  8. 计算机屋内设计主要是学什么的,2021建筑室内设计主要学什么 主要课程有哪些...
  9. classes是什么意思怎么读_英语单词class怎么读,class的音标是什么,class是什么意思 - 音标网...
  10. “你没有权限查看该对象的安全属性,即使你是管理用户“