当前位置:   article > 正文

国内地图数据纠偏实践:以高德地图为例_不同地图的纠偏算法

不同地图的纠偏算法

背景

在进行地图开发过程中,我们一般能接触到以下三种类型的地图坐标系:

1.WGS-84原始坐标系,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于WGS-84坐标系的;但是在国内是不允许直接用WGS84坐标系标注的,必须经过加密后才能使用;

2.GCJ-02坐标系,又名“火星坐标系”,是我国国测局独创的坐标体系,由WGS-84加密而成,在国内,必须至少使用GCJ-02坐标系,或者使用在GCJ-02加密后再进行加密的坐标系,如百度坐标系。高德和Google在国内都是使用GCJ-02坐标系,可以说,GCJ-02是国内最广泛使用的坐标系;

3.百度坐标系:bd-09,百度坐标系是在GCJ-02坐标系的基础上再次加密偏移后形成的坐标系,只适用于百度地图。(目前百度API提供了从其它坐标系转换为百度坐标系的API,但却没有从百度坐标系转为其他坐标系的API)

出现偏移现象的原因

按照国家统一的保密要求,任何一个地图产品都不允许使用GPS坐标,国内地图使用的坐标系统是GCJ-02。GCJ-02,国测局02年发布的坐标体系。又称“火星坐标”。在中国,必须至少使用GCJ-02的坐标体系。比如谷歌,腾讯,高德都在用这个坐标体系。

国内其他坐标体系。一般都是由GCJ-02进过偏移算法得到的。这种体系就根据每个公司的不同,坐标体系都不一样了。比如,百度和搜狗就使用自己的坐标体系,与其他坐标体系不兼容。(百度采用的是BD_09坐标)。

由于坐标系之间不兼容,所以如果在百度地图上定位的经纬度拿到高德地图上直接描点就肯定会发生偏移(因为采用不同的坐标加密的原因,即使在地图上看到的是同一个点,其代表的坐标数据也是不同的);只考虑国内的情况,高德地图和Google地图是可以不经过转换也能够准确显示的(在国内用的都是GCJ-02坐标系);

WGS84转GCJ02的加密算法可以从网上搜索到,经过测试,精度尚可,大概在10m级别(以高德地图为例,使用的数据的原坐标系是WGS84坐标系,经过加密形成的GCJ02坐标系数据)。

实践过程

需求说明

欲使用高德地图 android SDK开发某APP的一个功能模块:手机定位用户位置,将距离用户最近的建筑物面高亮显示。

由于高德地图对农村地区建筑物的标绘不够精细,所以采用了在其底图上(gcj02)叠加由Geoserver发布的房屋面shp数据(wgs84)。由于两数据坐标系不同,所以需要先对已有的建筑物面数据进行处理,将其加密成gcj02坐标系的数据。

实现将wgs84坐标加密为gcj02坐标

wgs84转化为gcj02的加密算法在网上可以搜索到,将其封装为方法,输入参数为wgs经纬度坐标,返回gcj02经纬度坐标。代码实现如下(C#):

//wgs84转火星坐标系
public double[] wgs84togcj02(double wgs_lon, double wgs_lat)
{
    if (out_of_china(wgs_lon, wgs_lat))
    {
        //不在国内
        double[] back = { wgs_lon, wgs_lat };
        return back;
    }
    else
    {
        double dwgs_lon = transformlon(wgs_lon - 105.0, wgs_lat - 35.0);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/148217
推荐阅读
相关标签
  

闽ICP备14008679号