前言最近在学习OSMID编辑器的过程中,发现近一两个月虽然对使用高德地图的开发很熟悉,但是对基础的了解却很少webGIS领域的知识少得可怜。于是,在阅读源码的过程中,经常对一些数据转换操作或者一些函数命名感到陌生,于是开始学习GIS基础知识。因为没有系统的学习大纲,所以需要一道题作为切入点,帮助大家一步步理解GIS相关知识。那么一个很容易想到的问题就产生了:地图是如何定位和显示点的?要知道我们生活在一个球形的天体上,我们经常使用的地图都是平面的,与球形无关。所以学习的第一步就是了解坐标系。众所周知,地球并不是一个标准的球体,而是一个近似的椭球体,越靠近赤道越宽。由于是三维物体,所以坐标系的定位一般需要x、y、z的三维坐标系来定义。但是为了更好的在球体上定位,采用了使用经纬度的方法。在GIS开发中,由经度、纬度和相对高度组成的坐标系称为地理坐标系(GeographicCoordinateSystem,简称GCS)。当我们平时使用手机地图或者网络地图的时候,展现在我们面前的都是平面地图。如果此时我们需要查看到某个餐厅有多远,手机会告诉我们距离是公里还是米,所以我们得到的两地??之间的距离就是平面距离,以米或公里为单位.此时的定位坐标系称为投影坐标系(简称PCS)。很显然,我们平时使用的平面地图肯定都做过这样的事情,就是将地理坐标系转换成投影坐标系。但是从直觉上来说,一个球体不可能展开成一个没有皱纹的连续平面,所以我们需要一定的数学方法进行换算。其实从投影坐标系的名字也可以看出,坐标系转换的方式就是投影。可以想象,3D物体被光线照射后的影子不是2D平面。当然,坐标系的转换绝对不是随意的投影。为了使投影后的坐标系具有一定的使用价值,投影方法一般都有一定的规则,如投影后的距离或角度不变。墨卡托投影墨卡托投影(MercatorProjection)是地理学家杰拉尔杜斯·墨卡托(GerardusMercator)于1569年提出的一种角度不变的投影方法,又称等角正切圆柱投影。.我们可以把地球想象成一个中空的圆柱体,地球的赤道与圆柱体相切。那么假设地球的中心有一个灯泡,灯泡的光可以穿透地球表面,照在圆柱体表面,那么地球球面上的大部分区域都会被投射出来相应地放到气缸上。此时将圆柱展开,以赤道投影为横坐标,以本初子午线投影为纵坐标,得到墨卡托投影构成的平面坐标系。我们可以看到投影具有以下特点:经纬度为平行直线,经纬度越高,投影区域变形越大,投影区域在投影点所在的位置也越大纬度无限接近极点。无穷大,所以纬度上限和下限分别为89°N和89°S。虽然区域有变形,但在各个方向都是等量扩张,所以保证了地图方向、角度和位置关系的正确性。网页墨卡托webMercator,又称伪墨卡托投影(PseudoMercatorProjection),属于一种非严格的墨卡托投影方法,最早由谷歌地图发明,随后被Bing、百度、OSM等所采用,被各种网络地图服务提供商,因此成为互联网电子地图最普遍的投影方式。它与墨卡托投影最大的区别在于,墨卡托投影是在地球是椭球体的基础上计算投影公式,而Web墨卡托投影在其计算公式中直接将椭球体变成球体,大大简化了投影变换的计算方法。计算公式为:其中x、y为投影坐标系、赤道半径、经度、纬度中的坐标值。此外,网络墨卡托投影通常默认为正方形。鉴于赤道的半径为6378137米,赤道的周长约为40075016.68557849,所以投影坐标系中X轴的范围为[-20037508.342789244,20037508.342789244],Y轴的范围为还有[-20037508.3427892344,75]可以通过上面的公式计算出纬度限制在[-85.0511287,85.0511287]范围内。对于日常地图使用,使用网络墨卡托投影的地图就足够了。但是,如果还有一些其他的要求,比如准确描述区域,一般会用到圆锥投影,比如Albers投影,Lambert投影等,这里不再详述。有兴趣的可以看看常用的地图投影方法[1]。EPSG上一节提到了地理坐标系和投影坐标系,也提到了一些投影方法。以墨卡托和网页墨卡托为例。前者把地球看成一个椭球体,而后者把地球看成一个球体。所以我们没有一个严格的标准和统一的方式来表达某一点的位置。没有统一标准的时候,就会有很多系统标准,当各种系统标准变得庞大,失去统一管理的时候,不同系统之间的坐标转换就会变得异常困难。EPSG[2]是一个管理这些坐标系的组织。EPSG通过WKID管理不同的坐标系。WKID简单理解为ID,每个坐标系都有一个唯一的ID。以一些常用的WKID为例:WGS84(WKID=4326)在介绍WGS84之前,我们需要明确一个概念:大地坐标系。大地坐标系是以参考椭球为基准建立的坐标系,也可以简单理解为地理坐标系的一种。大地坐标系又分为人参中心大地坐标系和地心大地坐标系。其中,偏心坐标系是以椭球体的几何中心为原点构建的坐标系,一般用于局部地区的大地测绘,而地心坐标系是以地球质心为原点构建的坐标系作为原点,一般用于整体地球用于大地测绘。WGS84属于地心大地坐标系,是世界上第一个统一的大地坐标系,所以也称为世界大地坐标系,我们常说的GPS定位系统就是建立在这个坐标系基础上的。除中国外,Google、Bing等很多电子地图都使用WGS84。CGCS2000(WKID=4490)我国在50年代和80年代分别建立了北京54和西安80参大地坐标系。后来,随着社会经济和科学的发展,中国测绘、地震部门和科学院有关单位重新建立了我国新一代地心大地坐标系,即CGCS2000,又称2000年国家大地坐标系。坐标系。与WGS84相比,两者在本质上可以说是一样的,只是计算过程中使用的参数略有不同。当这个差异映射到地图上时,只会有cm级别的差异,所以如果精度不需要严格在cm级别,两者可以默认兼容。WebMercator(WKID=3857)WebMercator也在EPSG的管理范围内。可见EPSG管理的坐标系不仅是地理坐标系,还有投影坐标系。事实上,EPSG并没有打算将web墨卡托纳入WKID,因为web墨卡托毕竟采用了一个不精确的假设,使得本来是等角投影的墨卡托变得近似等角,从而直接影响了投影坐标的精度。但随着WebMercator在网络上的广泛应用越来越受欢迎,EPSG不得不接受它。GCJ02和BD09GCJ02是中国国家测绘局制定的坐标系,其实质是在WGS84经纬度的基础上进行了一层加密。由于国家安全和保密的相关规定,我国所有对外地图系统都需要加密。因此,高德和谷歌的中国地图使用的是GCJ02坐标系。所以如果在GCJ02的坐标系中直接使用GPS的经纬度坐标,会得到错误的位置。比如在手机上下载一个GPS定位软件(部分硬件设备获取的GPS信息为原始GPS信息,一般地图软件的定位信息经过GCJ02加密),天安门广场的经纬度为39.907375、116.391349。但是在高德地图上,用这个坐标点定位其他地方:所以GCJ02坐标系在业界常被称为火星坐标系。而百度在GCJ02的基础上又加了一层加密,就是BD09。至于GCJ02的加密算法,并未对外公开。只有通过相关地图资质审核后,相关部门才会提供相应的加密算法。而国内一些有资质的厂商也提供了相应的API,供用户将WGS84坐标转换为GSJ02坐标。以高德API[3]为例,将WGS84的坐标点转换为GCJ02后,得到新的坐标点116.397588975695、39.908775499132,然后利用新的坐标点在高德地图上进行定位:另外,还有没有严格意义上的GCJ02转换算法到WGS84的逆转换。数据服务通过了解坐标系的原理,我们知道如何将三维地理坐标系转换为平面投影坐标系。但是光靠坐标系肯定是不够的。我们还需要在坐标系中呈现相应的数据,才能有一张完整的地图,所以我们要了解地图的常用数据服务。OGCOGC是一个国际组织,负责制定与空间信息和基于位置的服务相关的标准。严格来说,OGC并不是一个“官方”组织,但由于OGC拥有ESRI、谷歌、甲骨文等业内实力雄厚的公司作为其成员,因此它还与W3C、ISO、IEEE等协会或组织结成伙伴关系。因此,在GIS开发领域,大部分开发商或企业都会提供基于OGC标准的地图数据服务。地图数据服务中最明显的肯定是图片服务。一张图片用来承载一个地理信息数据应该很容易理解。因此,当地理信息数据被封装成图像信息,并能根据用户的请求动态返回时,这种服务就称为WMS(webmapservice)。除了图片资源之外,地图上还会有道路信息、POI信息等,而这些数据往往是灵活可编辑的,所以一定不能通过图片信息来传输,所以就有了矢量资源。一般地图的矢量数据会包含空间数据和属性数据。以常见的GeoJSON格式为例:102.0,0.5]//空间数据},"properties":{//属性数据"name":"xxsupermarket",}}]}这种向量提供给用户支持增删改查的服务数据的查询称为WFS(网络要素服务)。在实际应用中,WMS和WFS并不能完全满足要求。比如我打开一张世界地图,服务返回给我一张世界地图的图片,但是我想通过放大来定位我的家。那么,要实现这个功能,这张图片的分辨率会高的离谱.这个要求显然是不合理的,所以OGC在WMS服务器的基础上开发了WMTS(webmaptileservice),也就是我们常说的瓦片服务。另外,常见的瓦片服务是TMS(瓦片地图服务),但这种服务并不是OGC创建的协议。瓦片与WMS不同。瓦片服务提供的图片是事先准备好的静态图片。大家可以通过下面的示意图来了解瓦片。在上面的金字塔模型中,世界地图被划分为多层瓦片服务。该图层对应于地图的放大级别。在顶层,当地图最小化时,只提供一张图像来展示整个世界。如果用户进行放大操作,增加地图的放大倍数,世界地图会显示相应的二级图片,但显示的地理位置区域大小不变。只是原本展现整个世界的画面变得跟原来一样了。四张相同大小的图片展示整个世界。与原作相比,会更清晰。同样,如果用户继续放大,用于显示的图层的图片会越来越多,显示的细节也会越来越清晰。但由于屏幕尺寸范围有限,只能选择屏幕范围内的图片进行下载,避免了下载超大图片,减轻了业务压力,提升了体验性能。而这个分割后的图片就叫做tile。以高德地图为例,由于使用了web墨卡托投影,所以呈现的地图是正方形的。它的tile布局编码规则如下,其中z为缩放级别,每个tile的默认大小为256*256,第z级的tile个数为。高德地图的tile链接为http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}[4],其中z是缩放级别,x、y是该级别的图块代码。当放大倍数为3时(高德最小有意义的放大倍数为3),瓦片显示如下:当然瓦片排列规则不通用,不同厂商开发的瓦片服务不同。可能存在一些差异,因此在使用磁贴服务时要注意。定位渲染了解了坐标系和地图数据服务后,我们其实可以简单模拟一下地图上的点是如何渲染的。已知初始条件定义DOM容器的大小为1200*1000。初始缩放级别为12。中心定位点为天安门广场,在GCJ02坐标系中为116.397588、39.908775。Web墨卡托投影方块的边长计算容器要显示的地图面积因为放大倍数是12,所以横轴或纵轴上的瓦片数就是像素长度比。容器显示的地图区域是中心点。投影坐标点就是容器显示的地图区域。纵轴区间[4833585.295927367,4871803.810069955]计算要显示的tile。瓦片数计算公式1.瓦片数区间:-横轴瓦片数区间[3370,3374]-纵轴瓦片数区间[1550,1553]然后显示在屏幕可见区域的瓦片分布应该是:验证在ID编辑器上,设置背景为高德磁贴,设置缩放级别为12,中心定位在天安门广场,可以得到如下图显示内容,发现磁贴显示在screen和我们之前手动计算的结构是一致的。搞清楚地图的基本渲染逻辑后,其实可以对地图的渲染做一些神奇的改动,比如将游戏地图嵌入到世界地图中:参考[1]基于Web的地图算法研究与实现MercatorProjection[J].ComputerApplicationResearch,2012,29(12):4793-4796.【2】几种互联网地图服务(WMS、WFS、WMTS、TMS)背后的解释[5]【3】地理坐标系与中央坐标系[6][4]墨卡托投影?ArcGISPro|文献[7][5]浅谈GIS中的坐标系|转载[8]参考资料[1]常用地图投影方法:https://pro.arcgis.com/zh-cn/pro-app/latest/help/mapping/properties/list-of-supported-map-projections。htm[2]EPSG:https://epsg.io/[3]高德API:https://lbs.amap.com/api/webservice/guide/api/convert/[4]http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}:http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}[5]几种互联网地图服务(WMS、WFS、WMTS、TMS)背后的解读:https://zhuanlan.zhihu.com/p/398998331[6]人参坐标系和地心坐标系:https://www.jianshu.com/p/7bbbd86dec82[7]墨卡托投影-ArcGISPro|文档:https://pro.arcgis.com/zh-cn/pro-app/latest/help/mapping/properties/mercator.htm[8]浅谈GIS中的坐标系|转载:https://zhuanlan.知乎.com/p/98839097
