地理位置研发二三事

作者: 曲水流觞TechRill | 来源:发表于2017-01-25 17:56 被阅读571次

    GPS坐标系 火星坐标系 IP地址定位

    题图.PNG

    如果你要开发一个基于 GPS 甚至 IP 地址进行地址定位的功能时,你需要了解一下这些基本知识点,本人对真正的测绘专业不在行,如有疏漏欢迎指正。

    GPS 常用坐标系

    #1 WGS-84 国际标准: Google Earth、或者GPS模块使用该标准

    目前 GPS 的国际标准坐标系统, GPS 所发布的星历参数就是基于此坐标系统的。WGS-84 坐标系统的全称是World Geodical System-84(世界大地坐标系-84),它是一个地心地固坐标系统。WGS-84 坐标系统由美国国防部制图局建立,于1987 年取代了当时GPS所采用的坐标系统―WGS-72坐标系统而成为GPS 的所使用的坐标系统。WGS-84 坐标系的坐标原点位于地球的质心,Z 轴指向BIH1984.0 定义的协议地球极方向,X 轴指向BIH1984.0 的启始子午面和赤道的交点,Y 轴与X 轴和Z 轴构成右手系。

    Google Earth属于卫星照片,它不是地图,所以不受天朝测绘法的约束,因此Google Earth的坐标是真实坐标。

    #2 GCJ-02 中国坐标偏移标准: Google Map、高德、腾讯使用

    国测局02年发布的坐标体系。又称 “火星坐标”。在中国,必须至少采用GCJ-02对地理位置进行 首次 加密。比如谷歌,腾讯,高德都在用这个坐标体系。GCJ-02是国内最广泛使用的坐标体系,也是在正常坐标系下经过加入随机误差进行脱密处理后的坐标系。

    偏移的起因:
    天朝测绘局以国家安全为理由,用法律的形式对所有在天朝发行的地图类产品加了强制性规范,要求所有地图类产品都必须使用国家测绘局的一种加偏移的算法,对地图的真实坐标进行加偏移处理,之后才可能通过审批准许上市。因此,天朝的所有官方及商用地图的坐标都是偏移的,这种偏移属于非线性的,偏移量在300至500米不等,偏移方向也不定。这种加过偏移的地图坐标就是所谓“火星坐标”。

    但是实际上,这种偏移的算法已经被破解了,随便可以搜索得到,那为什么还要这个偏移,岂不是掩耳盗铃?
    知乎上一位同学说的在理:
    “因为这是原则问题,就比如说,有人开发了软件,别人破解了,然后你问了,既然有破解的为什么大家还要买收费的,一个道理。你破解是你的事情,这件事情犯法了,不要把犯法的事情当作理所应当。”

    #3 BD-09 百度坐标偏移标准: Baidu Map / Baidu SDK 使用

    百度自己定义的坐标体系,其实就是在火星坐标上来个二次加密而已。

    如果使用的是百度sdk那么可以获得百度坐标(BD-09)或者火星坐标(GCJ-02), 默认是BD-09
    如果使用的是ios的原生定位库,那么获得的坐标是WGS-84
    如果使用的是高德sdk,那么获取的坐标是GC-J02

    注:搜狗、图吧等也是自己的坐标体系标准,和百度类似。

    上面三种坐标体系是按照偏移加密来分别的,开发需要特别关心互相之间的转换,如果有多重数据来源的话。
    接下来的分类是球面和平面坐标:

    #1 经纬度

    球面坐标,对于北京来说,就是(116.38817139.935961)这样的坐标。比如腾讯、高德、百度都是这样的经纬度坐标。谷歌是经纬度顺序写反的经纬度坐标。
    如果是度分秒坐标,需要进行转换,才能得到上方的经纬度坐标。

    这里可以看到经纬度
    http://api.map.baidu.com/lbsapi/getpoint/index.html
    

    #2 墨卡托坐标

    平面坐标,相当于是直线距离,数字一般都比较大,像这样的。(215362.00021333335 99526.00034912192)
    墨卡托坐标,主要用于程序的后台计算。直线距离嘛,加加减减几乎计算方便。
    搜狗地图API就是直接使用的墨卡托坐标。

    什么是墨卡托投影?
    墨卡托(Mercator)投影,又名“等角正轴圆柱投影”,荷兰地图学家墨卡托(Mercator)在1569年拟定,假设地球被围在一个中空的圆柱里,其赤道与圆柱相接触,然后再假想地球中心有一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体展开,这就是一幅标准纬线为零度(即赤道)的“墨卡托投影”绘制出的世界地图。从球到平面,有个转换公式,这里就不再罗列。


    做个小实验,以东方明珠为参照物,对比下百度地图,腾讯地图,Google Map和Google Earth的经纬度偏差:

    百度拾取坐标系统

    直接搜索东方明珠,显示的经纬度值在右上角:
    121.506271,31.245414

    腾讯坐标拾取系统

    选择上海,搜索东方明珠,显示的经纬度为:
    31.239780,121.499680

    Google Map

    搜索东方明珠,在地图上右键,选择“这里有什么?”,会显示经纬度值为(谷歌的经纬度是颠倒的):
    31.239900,121.499723

    Google Earth

    搜索到东方明珠,在下方显示的经纬度是以度分秒显示的,31° 14′ 30.63″ 121° 29′ 42.61 ″ 找个转换工具变为如下的经纬度数:
    31.241841666666666,121.49516944444444

    将经纬度分别放到对方的系统里搜索,可以发现是有偏移的


    Google经纬度 In Baidu.PNG Baidu经纬度 In Google.PNG Google Earth in Google Map.PNG

    结论:百度地图自己的偏移加密方式, 谷歌地图和腾讯地图都是GCJ-02标准,谷歌Earth是国标的原始GPS经纬度。

    IP 地址定位技术

    # IP定位的原理

    简而言之就是通过IP地址来确定地理位置,它的基本原理是,利用IP设备的名字、注册信息或时延信息等来估计其地理位置。

    定位算法设计的基本原则是:在保证定位精度的前提下,尽量减少测量开销,同时兼具良好的扩展性,并能保护用户隐私。
    最初的定位算法通过向DNS服务器查询或者挖掘隐含在主机名中的信息来推测IP设备的地理位置之后,一些定位算法根据时延与地理距离之间的线性关系来估测主机位置,并通过拓扑信息来减小定位误差。近年来,基于概率的定位算法重新成为一个研究热点,通过寻找时延与地理距离的分布规律来进行定位。虽经不断改进,但这两类算法都不能精确地定位,因此,一些综合的定位算法使用了上述两类方法来进行交叉验证以提高精度.

    通常来说,IP定位最早是通过运营商实现,每个运营商申请到的IP段,在某个范围内使用。因此早期只能是国家为单位的基础数据。
    对于比较大的国家,就进一步划分,比如,中国电信固定将某些IP分配某些机房使用,而这些机房则具备地域属性,因此就可以知道某些IP的位置是哪个省市区。再进一步,网上有种测算路由的方式进行定位,就是由大范围逐个跳转,跟踪路由。从而对比找出IP所在的小范围。

    # IP定位的精度

    随着大数据发展,像百度收集了大量数据,数据实时分析。因此可以将手机收集到的精准GPS数据和当前所用IP数据成对上报给后端服务器,运算过之后,就可以得出某个IP的分布范围数据。

    如今,网络铺设已经有个相当多的特性,比如:
    直接给用户分配公网IP;
    为了缓解IP资源不足问题,给到用户的是私网IP,用户最终用代理的IP池的IP访问公网;
    IP资源利用率过低,几乎是一个省份用一个IP池进行代理给用户的手机网络上网;

    因此定位的误差从几十米到整个省份不等,但就目前类似百度的实力来说,定位到行政市一级理论上是完全没有问题的,甚至很多情况已经可以精准到几十米的程度了。

    # IP定位的API

    类似的免费IP定位服务有很多成熟API,比如 阿里云市场,淘宝IP库,百度开发者平台/百度API Store,纯真IP库等等,若希望稳定服务,也有对应的收费企业版,可选范围很多,精度都是到行政市一级的。

    目前个人倾向于阿里云市场的免费IP库 + 百度开发者平台双渠道接入,随时可以切换。

    下方的一个在线系统就调用了百度开发平台的IP精准定位服务,在PC端打开浏览器就可以定位到你的具体位置,偏差很小。
    https://www.opengps.cn/Data/IP/IPHighAccuracy.aspx
    可惜的是,目前该服务已关闭(http://lbsyun.baidu.com/index.php?title=webapi/ip-api)。

    参考文献:
    [IP定位技术的研究]:
    http://www.jos.org.cn/html/2014/7/4621.htm
    [openGPS.cn - 高精度IP定位原理,定位误差说明]:
    http://blog.csdn.net/cuitang1031/article/details/52787772

    相关文章

      网友评论

        本文标题:地理位置研发二三事

        本文链接:https://www.haomeiwen.com/subject/lugzbttx.html