暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Globalization Design: 地理坐标系

万力王 2020-05-12
853
在互联网项目中,地理信息是常见的一种结构化信息。我们都知道可以用经纬度(longtitude, latitude)来表达地球上的任意一个位置,围绕这个点,其实有很多有意思的细节可以讨论。

一、地理坐标系  

GPS全球定位系统大家多少都听过,它通过24颗卫星可以精确地定位到地球上任意一个观测点的位置和高度。通常,我们用“经纬度”来表达地球表面上的一个位置,经度(longitude)把地球纵向划分,纬度(latitude)把地球横向划分,如果看作一个平面坐标系的话,那经度就是X轴,纬度就是Y轴。由于地球是个椭圆,几何意义上对椭圆参数的细微差异,会导致经纬度值的差异,这也就产生了不同坐标系标准。而对于GPS体系下,通过测量数据,定义了一套坐标系统,称为WGS84(World Geodetic System 1984),俗称地球坐标系。其坐标原点位于地球质心,下图简述了经纬度是如何而来的。我们既可以把经纬度用弧度的形式表示,也可以用角度的形式表示。由于GPS在全球范围内的广泛应用,这套坐标系标准也是在全球范围内公认的一套。

如同互联网一样,这套全知全能的系统最早源自美国军事项目。这在战略意义上来说,对我们国家是不利的,于是在中国领土范围内,中国国家测绘局,基于WGS84做了一定加密处理,从而在中国领土范围,制定了GCJ02,俗称火星坐标系。

二、地图、图层  

经纬度只是两个数字,要让这两个数字有实际地理位置上的感受,需要结合一些地理信息系统和应用。比如一款地图APP,它提供更全面的地理信息,山川河海,道路,商铺,酒店,机场等等,我们生活中看得到的每个地方都可以用一个经纬度来标示它在地球上的位置。像地图这样的应用,需要把这些信息描绘出来,这样我们就能更直观地把地理坐标系和实际工作生活结合起来,我们称之为图层。
我们刚有讲到,在中国领土范围内使用GCJ02坐标系,而其他地区使用WGS84,那问题来了,一个地图APP,它需要根据中国领土边界内做图层的偏移,特别在边境的地方,容易造成误差。总之,在中国大陆看到的中国大陆的地图图层必然是基于WGS84偏移过的GCJ02,BUT,港澳台根据不同的地图会有差异,大家在实践过程中需要注意下。
另外,不同的地图APP由于拥有的地理信息数据完整度和地域性特性的差异,从而有体验上的区别,比如百度地图在中国的体验非常好,但没有多语言,入境外国人的几乎没法使用;Google地图能支持多种语言,可惜在中国国内已经无法正常访问;澳门有部分是填海填出来的,Google地图图层并没有正确更新,导致街道跑到了海里。还有,在国际化场景下,领土争议地区使用的名字,需要根据用户地区来正确切换。


三、定位和精度  

我们现在几乎每部手机上都带有GPS芯片,其实就是个GPS信号接收器,通过接收器和多颗卫星间的信号传输时长,可以计算出接收器在地球上的位置。理论上来说GPS的精度可以到达厘米级别,但会因为建筑物阻挡,信号干扰,室内或地下,甚至太阳风暴等等造成精度大幅度降低。根据FAA(Federal Aviation Administration)2017年针对GPS的一份性能分析报告说明:GPS定位的精度95线大约1.89米(感兴趣的话可以去FAA官网找下这篇报告)。

由于GPS定位依赖卫星,在手机上的定位并不完全依赖GPS。所以除了GPS之外,还会通过WIFI Positioning System(WPS)以及运营商的基站信号来辅助定位。现在有一些定位数据服务商,比如Combain, LocationAPI, Mozilla等等,维护了全球上亿级别Wifi访问点(Wifi Access Point)信息和基站(Cell Tower)位置信息,在一些热点多的地方一般可以达到5~10米左右的精度。
另外GPS芯片硬件返回的都是WGS84坐标,所以在中国领土范围上,手机厂商或APP厂商会根据加密算法进行偏移,否则就无法和地图上的图层对应起来。虽然这在技术实现上造成不少麻烦,但这就是法律规定。

违反本法规定,未经批准擅自建立相对独立的平面坐标系统,或者采用不符合国家标准的基础地理信息数据建立地理信息系统的,给予警告,责令改正,可以并处五十万元以下的罚款;对直接负责的主管人员和其他直接责任人员,依法给予处分。

《中华人民共和国测绘法(2017修订)》第五十二条


四、两点间的距离  

空间里计算两点间的距离有两种方法,最简单的就是直线距离(就是勾股定理求斜边长):

这种算法比较简单快速。但我们知道地球是个椭圆,点到点实际上是一条弧线而不是直线,所以在某些要求高精度的场景,我们需要用球面距离公式来求这段弧线上。
除此之外,我们有时候需要估算点与点之间的交通距离,这需要由实际使用的交通工具、实际道路情况等等综合因素得出,一般地图软件提供商会提供类似导航API来提供相关数据,Google,百度等等大厂都有提供相关API。

五、空间索引  

经纬度是一个两元tuple,如果我们需要通过一个经纬度,快速查询到和这个坐标相关的数据,我们就需要把这个tuple进行数学变换成一元来构建索引。常见的空间索引算法有Geohash和Google S2(https://github.com/google/s2geometry)。
Geohash通过将经纬度转成一个字符串(1~12个字符/字节),字符串越是长代表精度越是高,我们可以使用这个网站直观地看到geohash的效果:http://www.movable-type.co.uk/scripts/geohash.html。通过这个方法,我们可以将全世界划分成N个大矩形,每个大矩形用一个字母代表,然后再在每个大矩形里划分成几个小矩形,用两个字符表示,第一个的字符继承了大矩形的字符,这样不断细分下去。它的pros是,我们只要简单地运用字符串的left()方法,就可以使用这种空间索引查询到关联信息;它的cons是在每个矩形的边界处的表达差异不稳定,在复杂的场景很难确定一个合适的精度。


Geohash是把地球当作二维平面来进行索引,而Google S2是把地球当作三维球面来进行索引。Google S2的核心原理是:假想把地球放到一个正方体中,然后把地球表面分别投影到正方体的6个面上,然后每个面再均匀分成N个正方形,然后通过各种坐标转换、映射等,最后构造成希尔伯特曲线,实现降维索引,每个不同精度的区域称为Cell,用一个uint64来表示。详细的实现逻辑可以参照官方文档。和Geohash相比,S2可以分成30级,每一级精度上的变化比较平缓,并且存储上只要8个字节,因此,对于地球上的任意一块封闭的不规则多边形区域,我们都可以用一组不同精度的S2 Cell来恰好覆盖。S2的库中还提供了各种几何运算的函数,可以方便进行各种复杂场景的计算。

(用152个cell来覆盖Florida。from http://s2geometry.io/devguide/examples/coverings)


到此我们简单讨论了和地理坐标相关的一些话题,这里只是总结了一些常见问题,其实还有很多细节没有讨论到,如有兴趣,我们可私信讨论。
文章转载自万力王,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论