一、需求分析
实际工作中,很多公司或个人都需要一些幅面较大的地图,使用PS或AI等绘图工具,在上面标记一些内容,用以分析需求、理清思路、表达问题。当前,国内大的地图供应商有天地图、百度、高德等,都在网上提供电子地图浏览功能,但要实现地图拼接,普通用户也只能束手无策了。如何利用地图商提供的电子地图进行地图拼接出一幅大图,是一个很现实的需求。
二、设计思路
国内最权威的图源为“天地图”。“天地图”是国家测绘地理信息局建设的地理信息综合服务网站。百度百科所述,“天地图”集成了来自国家、省、市(县)各级测绘地理信息部门,以及相关政府部门、企事业单位 、社会团体、公众的地理信息公共服务资源,向各类用户提供权威、标准、统一的在线地理信息综合服务。它是“数字中国”的重要组成部分,是国家地理信息公共服务平台的公众版。
此次我们主要以天地图的拼接为例,制作一个地图拼接工具。主要的思路为:制作一个地图浏览器,增加范围框选工具,对所选范围内的地图进行下载和自动拼接,最终生成大图。
这里有一个坑不得不提一下,就是天地图需要在开发管理平台申请key才能调用其资源,但每个key每天只有10000次的访问,超出配额是常用的事。解决方案有3个,一是通过工商企业或政府机构身份申请key,最大支持到300万和500万次;二是多申请几个key,无法继续下去时换一个key;三是使用国外地图服务商,谷歌已经完全无法访问了,但还有一些网站可以访问,需要注意:国外网站在处理我领土边境问题上有错误,使用时需谨慎。
本文主要包括以下内容:1.主要知识点;2.软件框架;3.图源配置;4.数据交互;5.地图采集与拼接。
三、主要知识点
1.墨卡托投影
1569年,荷兰地图学家墨卡托(Gerhardus Mercator 1512-1594)为了提升航海家的地图使用效果,将地球的球形转换到平面上,提出了墨卡托投影。
墨卡托投影的原理为:设想一个与地轴方向一致的圆柱切于或割于地球,按等角条件将经纬网投影到圆柱面上,将圆柱面展为平面后,得平面经纬线网。投影后经线是一组竖直的等距离平行直线,纬线是垂直于经线的一组平行直线。各相邻纬线间隔由赤道向两极增大。一点上任何方向的长度比均相等,即没有角度变形,而面积变形显著,随远离基准纬线而增大。该投影具有等角航线被表示成直线的特性,故广泛用于编制航海图和航空图等[1]。
墨卡托投影最大问题在于,越往南北两极,变形越厉害,如下图所示,赤道的小圆,越往两极越大,实际面积是一致的。所以才有墨卡托投影下“如格陵兰岛比实际面积扩大了N倍”的说法。
2.Web墨卡托
2005年,google发布了谷歌地图,立即风靡全球,后成为众多地图厂商学习的蓝本。其主要采用的是TMS(Tile map service),其实在这之前,常见地图服务还有WMS、WFS、WCS、WMTS等,请各位百度。
我们都知道,要是把一大片地图加载到计算机里,速度奇慢无比,如果1:5W的世界地图使用一个图片文件的话,可能会无法打开。但其实每次在计算机屏幕视野内,我们看到地图的内容受屏幕限制而很有限,要么看到全局,要么看到局部,始终就那么大范围。这时,完全可以采取一种办法,来提高地图显示效率。于是工程师们采取了两个办法:分层和切片。分层,即根据比例尺不同,把地图划分为若干层;切片,即每一层按一定大小切成很多碎片(tile),又称为瓦片。下面结合图进行讲解:
为了把地球转换在平面上,首先要进行墨卡托投影。
如上图,假如我们把地球按照墨卡托投影展开到一张平面图上,将其大小设置为4个256×256像素的瓦片,定义为第一层,其坐标从左上角开始,x轴向右,y轴向下,z表示层,则放大一层后,每个瓦片又会分为4个256×256像素的瓦片,如图红框对应,以此类推。
那么像素与经纬度坐标是如何对应的呢?
那么这些瓦片的级别是按照什么规则来分的呢?这就要牵扯出地图学中另一个重要的概念——比例尺(即地图上的一厘米代表着实际上的多少厘米)。到了web地图中我们把比例尺转换成另一个概念——分辨率(Resolution,图上一像素代表实际多少米)。比例尺跟分辨率的换算举个例子:
//示例来自:http://www.cnblogs.com/naaoveGIS/
//这里的像素是设备像素 现在假设地图的坐标单位是米,dpi为96 ;
1英寸=2.54厘米;
1英寸=96像素;
最终换算的单位是米;
如果当前地图比例尺为1:125000000,则代表图上1米等于实地125000000米;
米和像素间的换算公式:
1英寸=0.0254米=96像素
1像素=0.0254/96 米
则根据1:125000000比例尺,图上1像素代表实地距离是 125000000*0.0254/96 = 33072.9166666667米。
上面这个例子同样可以由分辨率换算出比例尺。所以在互联网地图中我们先不去关心比例尺,只关心分辨率的概念,假设瓦片的大小为256像素,每一级别的瓦块数目为2^n * 2^n。分辨率计算公式为:
r=6378137(地球半径)
resolution=2*PI*r/(2^zoom*256)
r为Web墨卡托投影时选取的地球半径,2*PI*r代表地球周长,地球周长除以该级别下所有瓦片像素得到分辨率。
注意这里的像素实际并不是设备像素,而是一种参照像素(web中的css像素或者是安卓上的设备无关像素),比如在某些高清屏下(window.devicePixelRatio = 3),一参照像素宽度等于3设备像素,这时候可能实际瓦片大小是512设备像素的,但是在显示时仍然要把它显示成256参照像素(css像素)。[2]
以整个世界范围,赤道作为标准纬线,本初子午线作为中央经线,两者交点为坐标原点,向东向北为正,向西向南为负。
X轴:由于赤道半径为6378137米,则赤道周长为2*PI*r = 2*20037508.3427892,因此X轴的取值范围:[-20037508.3427892,20037508.3427892]。
Y轴:由墨卡托投影的公式可知,同时上图也有示意,当纬度φ接近两极,即90°时,y值趋向于无穷。这是那些“懒惰的工程师”就把Y轴的取值范围也限定在[-20037508.3427892,20037508.3427892]之间,搞个正方形。
懒人的好处,众所周知,事先切好静态图片,提高访问效率云云。俺只是告诉你为什么会是这样子。因此在投影坐标系(米)下的范围是:最小(-20037508.3427892, -20037508.3427892 )到最大 (20037508.3427892, 20037508.3427892)。
对应的地理坐标系:
按道理,先讲地理坐标系才是,比如球体还是椭球体是地理坐标系的事情,和墨卡托投影本关联不大。简单来说,投影坐标系(PROJCS)是平面坐标系,以米为单位;而地理坐标系(GEOGCS)是椭球面坐标系,以经纬度为单位。具体可参考《坐标系、坐标参照系、坐标变换、投影变换》。
经度:这边没问题,可取全球范围:[-180,180]。
纬度:上面已知,纬度不可能到达90°,懒人们为了正方形而取的-20037508.3427892,经过反计算,可得到纬度85.05112877980659。因此纬度取值范围是[-85.05112877980659,85.05112877980659]。
因此,地理坐标系(经纬度)对应的范围是:最小(-180,-85.05112877980659),最大(180, 85.05112877980659)。至于其中的Datum、坐标转换等就不再多言。[3]
4.常见的投影及坐标系
我们经常会看到地理信息软件里有EPSG:XXXX。EPSG成立于1986年,EPSP的英文全称是European Petroleum Survey Group,中文名称为欧洲石油调查组织。这个组织成立于1986年,2005年并入IOGP(International Association of Oil & Gas Producers),中文名称为国际油气生产者协会,维护并发布坐标参照系统的数据集参数,以及坐标转换描述。该数据集被广泛接受并使用,通过一个Web发布平台进行分发,同时提供了微软Acess数据库的存储文件,通过SQL 脚本文件,mySQL, Oracle 和PostgreSQL等数据库也可使用。
① EPSG:4326
在世界地图方面,EPSG:4326是比较著名的一个,因为由美国主导的GPS系统就是在用它,它还有一个名气更大的别名叫作WGS84,WGS(World Geodetic System)是世界大地测量系统的意思,由于是1984年定义的,所以叫WGS84,之前的版本还有WGS72、WGS66、WGS60。
② EPSG:3857
另一个比较知名的编码是EPSG:3857,这也是一张世界地图,目前主要是各大互联网地图公司以它为基准,世界上类似谷歌、bing等公司都使用该坐标系,这也是本文主要涉及的坐标系。
③ BD09
BD09经纬度投影属于百度坐标系,它是在标准经纬度的基础上进行GCJ-02加偏之后,再加上百度自身的加偏算法,也就是在标准经纬度的基础之上进行了两次加偏。该坐标系的坐标值为经纬度格式,单位为度。
④ 北京54坐标系
中国成立以后,我国大地测量进入了全面发展时期,在全国范围内开展了正规的,全面的大地测量和测图工作,迫切需要建立一个参心大地坐标系。由于当时的"一边倒"政治趋向,故我国采用了前苏联的克拉索夫斯基椭球参数,并与前苏联1942年坐标系进行联测,通过计算建立了我国大地坐标系,定名为1954年北京坐标系。因此,1954年北京坐标系可以认为是前苏联1942年坐标系的延伸。T.A的原点不在北京而是在前苏联的普尔科沃。
自北京54坐标系统建立以来,在该坐标系内进行了许多地区的局部平差,其成果得到了广泛的应用。但是随着测绘新理论·新技术的不断发展,人们发现该坐标系存在很多缺点,为此,我国在1978年在西安召开了"全国天文大地网整体平差会议",提出了建立属于我国自己的大地坐标系,即后来的1980西安坐标系。
⑤ 西安80坐标系
1978年4月在西安召开全国天文大地网平差会议,确定重新定位,建立我国新的坐标系。为此有了1980年国家大地坐标系。1980年国家大地坐标系采用地球椭球基本参数为1975年国际大地测量与地球物理联合会第十六届大会推荐的数据,即IAG 75地球椭球体。该坐标系的大地原点设在我国中部的陕西省泾阳县永乐镇,位于西安市西北方向约60公里。后续还有CGCS2000坐标系,可自行百度。
⑥ GCJ02
GCJ-02是由中国国家测绘局(G表示Guojia国家,C表示Cehui测绘,J表示Ju局)制订的地理信息系统的坐标系统。它其实就是对真实坐标系统进行人为的加偏处理,按照特殊的算法,将真实的坐标加密成虚假的坐标,而这个加偏并不是线性的加偏,所以各地的偏移情况都会有所不同。而加密后的坐标也常被大家称为“火星坐标系统”。该坐标系的坐标值为经纬度格式,单位为度。这里的GCJ02经纬度投影,也就是在WGS84经纬度的基础之上,进行GCJ-02加偏。[4]
四、主要思路
知识点搞清楚后,思路就很简单了。我们要想获取一个大范围的地图,只需要知道其范围,然后确定哪些瓦片,最后合并到一起就可以了。流程如下:
框选范围→获取经纬度→确定目标层→计算瓦片范围→按顺序下载瓦片→合并大图。
下一章,开始实操。
知识点参考资料:
[1].百度百科
[2].我的小树林《web地图呈现原理》,博客园
[3]. Liyan_gis《墨卡托及Web墨卡托投影》,CSDN
[4].南水之源《地理投影,常用坐标系详解、WGS84、WGS84 Web墨卡托、WGS84 UTM、北京54坐标系、西安80坐标系、CGCS2000坐标系》,博客园