文档章节

.NET开发笔记(二十三) 谷歌地图下载

IT周见智
 IT周见智
发布于 2015/06/05 17:18
字数 1496
阅读 21
收藏 1

关于如何将地球经纬度坐标系统转换成程序中常用到的平面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调试通过,希望有帮助!

© 著作权归作者所有

IT周见智

IT周见智

粉丝 10
博文 61
码字总数 185891
作品 0
西青
私信 提问
加载中

评论(1)

后来者居上
后来者居上
合成出错了,有关调用实时(JIT)调试而不是此对话框的详细信息,
请参见此消息的结尾。

************** 异常文本 **************
System.ArgumentException: 参数无效。
在 System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)
在 System.Drawing.Bitmap..ctor(Int32 width, Int32 height)
在 GoogleMapDownLoader.Form1.linkLabel1_LinkClicked(Object sender, LinkLabelLinkClickedEventArgs e) 位置 D:\周智2011\VS\网上下载demo\GoogleMapsNet_Test_Project\GoogleMapsNet Test Project\GoogleMapDownLoader\Form1.cs:行号 145
在 System.Windows.Forms.LinkLabel.OnLinkClicked(LinkLabelLinkClickedEventArgs e)
在 System.Windows.Forms.LinkLabel.OnMouseUp(MouseEventArgs e)
在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
在 System.Windows.Forms.Control.WndProc(Message& m)
在 System.Windows.Forms.Label.WndProc(Message& m)
在 System.Windows.Forms.LinkLabel.WndProc(Message& msg)
在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow
Tensorflow教程(十三) tf.Variable() 和tf.get_variable()

1 简介 tf.Variable() tf.get_variable() 2 区别 1、使用tf.Variable时,如果检测到命名冲突,系统会自己处理。使用tf.get_variable()时,系统不会处理冲突,而会报错 2、基于这两个函数的特...

致Great
2018/06/20
0
0
自定义操作RxJava 学习笔记

二十三,有点让我想起《风云》里面的剑二十三式 RxJava提供了一套非常强大的操作集。如果计算所有重载次数,Rx上的运算符数量超过300。其中少数运算符必不可少,这意味着没有它们就无法实现R...

woshixin
2018/09/19
21
0
分享33本关于.net方面的学习书籍(免费下载)

分享33本关于.net方面的学习书籍(免费下载) 1、程序员大本营.Net版(中文文档) 2、NHibernate2.0中文文档 3、C#+WinForm视频播放器(AxWindowsMediaPlayer) 4、C#+简单视频播放器 5、ASP.NET...

邓剑彬
2012/12/02
1K
2
互联网地图牌照首批名单公布:谷歌未入选

6月30日消息,国家测绘局日前公布了互联网地图牌照首次名单,百度、搜狗、图盟科技、图为先科技等23家单位获得甲级测绘资质。值得注意的是,不久前提出申请的谷歌并不在列。 国家测绘局称如公...

红薯
2010/06/30
1K
8
Python进阶(五十二)-Flask使用pymysql连接MySQL数据库

Python进阶(五十二)-Flask使用pymysql连接MySQL数据库 IDE说明 Python:3.5 Flask:0.12.1 Pymysql:0.7.10 MySQL:5.5 前言   之前在做Python Web开发时,选择的是Django框架,后台的自动化实...

sunhuaqiang1
2017/05/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈java过滤器Filter

一、简介 Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断如是否有权限访问页面等。其工作原理是,只要你在web.xml...

青衣霓裳
19分钟前
3
0
技术产品研发型企业的发展困境

目前中小企业想要发展自己的业务,必须使用到底层架构技术,于是企业多采用三种技术方案,一、招相关技术人员,并为之长期投入技术成本;二、使用相关开源技术框架,并培养相关业务人员;三、...

数蚕
43分钟前
5
0
《2019网络安全行业人才发展研究报告》出炉

随着大安全时代的到来,网络安全已经从虚拟空间延伸到现实空间。当今网络战愈演愈烈,网络军备赛即将来临。网络空间领域的战争归根到底还是人才的竞争。面对新形势,建立高效的网络安全人才培...

360网络安全大学
45分钟前
1
0
酒德利商城开发程序逻辑

<textarea name="Content" rows="2" cols="20" id="Content" class="t14" style="font-family:宋体;font-size:10.5pt;"></textarea> 酒德利商城开发zhao·I5OI3I5I74O微/电,酒德利批发零售,......

洋哥说
55分钟前
2
0
十款强大的IDEA插件-Java开发者的利器

xl_echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075)交流学习。 百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!! 插件一...

xlecho
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部