• 百度、谷歌高德等网络地图经纬度偏差纠正以及相关坐标系问题


     
    根据经验得到的:
    (1)百度地图的差别是(0.01185,-0.00328)
     
    如果百度地图的经纬度是(x,y)实际的应该是(x,y)+(-0.01185,-0.00328)=(x-0.01185,y-0.00328)
     
    (2)google Map的差别是(0.0143,-0.014)
    如果用getscreen截图,如果要截的范围为(x,y),输入getscreen的为(x-0.0143,y+0.014).
     
    后来经过自己验证,的却差不多。
     
    下面讲一下网络发布的地图的偏差问题:
     
     

    摘要:各种坐标体系之间如何转换?到底有哪些坐标体系?什么是火星坐标?为什么我的坐标在地图上显示会有偏移?本文详细解答以上问题。最后给出坐标拾取工具。

    一、坐标体系
    首先我们要明白,开发者能接触到哪些坐标体系呢?
    第一种分类:
    1、 GPS,WGS-84,原始坐标体系。一般用国际标准的GPS记录仪记录下来的坐标,都是GPS的坐标。很可惜,在中国,任何一个地图产品都不允许使用GPS坐标,据说是为了保密。GPS坐标形式如图,度分秒形式的经纬度:

    百度、谷歌高德等网络地图经纬度偏差纠正以及相关坐标系问题百度、谷歌高德等网络地图经纬度偏差纠正以及相关坐标系问题

    2、 GCJ-02,国测局02年发布的坐标体系。又称“火星坐标”。在中国,必须至少使用GCJ-02的坐标体系。比如谷歌,腾讯,高德都在用这个坐标体系。GCJ-02也是国内最广泛使用的坐标体系

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

    第二种分类:

    首先明白,所有坐标体系的原点,都是非洲。

    百度、谷歌高德等网络地图经纬度偏差纠正以及相关坐标系问题

    1、经纬度。这个是球面坐标,对于北京来说,就是(116.38817139.935961)这样的坐标。比如腾讯、高德、百度都是这样的经纬度坐标。谷歌是经纬度顺序写反的经纬度坐标。

    如果是度分秒坐标,需要进行转换,才能得到这样的经纬度坐标。详见坐标转换。

    2、墨卡托坐标。平面坐标,相当于是直线距离,数字一般都比较大,像这样的。(215362.00021333335 99526.00034912192)

    墨卡托坐标,主要用于程序的后台计算。直线距离嘛,加加减减几乎计算方便。

    搜狗地图API就是直接使用的墨卡托坐标。

    二、坐标转换

    在各种web端平台,或者高德、腾讯、百度上取到的坐标,都不是GPS坐标,都是GCJ-02坐标,或者自己的偏移坐标系。

    比如,你在谷歌地图API,高德地图API,腾讯地图API上取到的,都是GCJ-02坐标,他们三家都是通用的,也适用于大部分地图API产品,以及他们的地图产品。

    例外,百度API上取到的,是BD-09坐标,只适用于百度地图相关产品。

    例外,搜狗API上取到的,是搜狗坐标,只适用于搜狗地图相关产品。

    例外,谷歌地球,google earth上取到的,是GPS坐标,而且是度分秒形式的经纬度坐标。在国内不允许使用。必须转换为GCJ-02坐标。

    1、度分秒坐标转换为经纬度

    比如,在GPS记录仪,或者google earth上采集到的是39°31'20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39 + 31/60 + 20.51/3600 度。

    2、 GPS转换为GCJ-02坐标

    谷歌,高德,腾讯的地图API官网上,都不直接提供这样的坐标转换。如果要得到GCJ-02坐标,最好在他们的地图上直接取点,或者通过地址解析得到。(这个工具我后续会贴出来的。我就爱干这样的事情,哈哈。)

    不过,在网上搜到了这样的接口,该接口的type=1就是GPS转到GCJ-02的墨卡托坐标。请大家对接口保密,哈哈。详见:

    http://map.sogou.com/api/documentation/javascript/api2.5/interface_translate.html#late_intro

    3、GCJ-02与BD-09之间互转

    国测局GCJ-02坐标体系(谷歌、高德、腾讯),与百度坐标BD-09体系的转换,在CSDN上有很详细的讲解:

    http://blog.csdn.net/coolypf/article/details/8569813

    转换算法如下:

    #include   
      
    const double x_pi = 3.14159265358979324 * 3000.0 / 180.0;  
      
    void bd_encrypt(double gg_lat, double gg_lon, double &bd_lat, double &bd_lon)  
    {  
        double x = gg_lon, y = gg_lat;  
        double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi);  
        double theta = atan2(y, x) + 0.000003 * cos(x * x_pi);  
        bd_lon = z * cos(theta) + 0.0065;  
        bd_lat = z * sin(theta) + 0.006;  
    }  
      
    void bd_decrypt(double bd_lat, double bd_lon, double &gg_lat, double &gg_lon)  
    {  
        double x = bd_lon - 0.0065, y = bd_lat - 0.006;  
        double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi);  
        double theta = atan2(y, x) - 0.000003 * cos(x * x_pi);  
        gg_lon = z * cos(theta);  
        gg_lat = z * sin(theta);  
    }  

    js中使用Math.atan2(sqrt,sin,cos)方法即可

    不过也有更简单的算法,线性算法(lat和lng是经纬度,球面坐标):

    To_B是转到百度,To_G是转到GCJ-02。

    var TO_BLNG = function(lng){return lng+0.0065;};

    var TO_BLAT = function(lat){return lat+0.0060;};

    var TO_GLNG = function(lng){return lng-0.0065;};

    var TO_GLAT = function(lat){return lat-0.0060;};

    4、经纬纬度转成墨卡托

    网上也有详细讲解:

    http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=78245

    内容如下:

    在WebGIS的开发中经常用到的地图投影为Web墨卡托和WGS84,故歌地图,bingmaps,百度地图,mapabc,mapbar,以及ArcGIS online上的大部分地图为Web墨卡托地图,ArcGIS online上最开始发布的地图投影为WGS84。
    在开发过程中很多时候会遇到不同坐标系之间互转的问题,特别是底图使用Web墨卡托,定位(GPS,wifi等)信号坐标为WGS84坐标的时候,那么通用解决方案就是写一个坐标参考系的转换库,类似于proj4,但一般情况下很少用到那么多的参考系之间的互转,并且在客户端实现或者调用proj4都是一件很困难或者麻烦的事情,大多数情况下我们实现Web墨卡托坐标与WGS84坐标互转就可以了。
    下面是使用objective-c实现的Web墨卡托坐标与WGS84坐标互转程序,当然也可以使用其他语言来实现,使用起来比较简单和方便。

     

    //经纬度转墨卡托
    -(CGPoint )lonLat2Mercator:(CGPoint ) lonLat
    {
        CGPoint  mercator;
        double x = lonLat.x *20037508.34/180;
        double y = log(tan((90+lonLat.y)*M_PI/360))/(M_PI/180);
        y = y *20037508.34/180;
        mercator.x = x;
        mercator.y = y;
        return mercator ;
    }
    //墨卡托转经纬度
    -(CGPoint )Mercator2lonLat:(CGPoint ) mercator
    {
        CGPoint lonLat;
        double x = mercator.x/20037508.34*180;
        double y = mercator.y/20037508.34*180;
        y= 180/M_PI*(2*atan(exp(y*M_PI/180))-M_PI/2);
        lonLat.x = x;
        lonLat.y = y;
        return lonLat;
    }

    三、坐标偏移
    如果您的坐标在转换之后,还有偏移,那么考虑以下几个方面。
    A、原始坐标系弄错,比如以为自己是GPS坐标,但其实已经是GCJ-02坐标。
    解决方案:请确保采集到的数据是哪个坐标体系,需要转换到哪个坐标系,再进行坐标转换。
    B、原始坐标准确度不够
    解决方案:如果您是GPS坐标,请确保采集GPS数据时,搜到至少4颗以上的卫星。并且GPS数据准不准,还取决于周围建筑物的高度,越高越不准,因为有遮挡。
    如果本来就是GCJ-02坐标,在不同地图放大级别的时候,看到的地方可能不一样。比如你在地图级别4(国家)取到的坐标,放大到地图12级(街道)时,坐标就偏了。请确保在地图最大放大级别时,拾取坐标。
    C、度分秒的概念混淆
    比如,在google earth上采集到的是39°31'20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39 + 31/60 + 20.51/3600 度。
    D、经纬度顺序写反了
    有些公司(比如高德,百度,腾讯)是先经度,再纬度,即Point(lng lat)。但谷歌坐标的顺序恰好相反,是(lat lng)。

    四、坐标拾取工具
    既然在国内必须至少使用GCJ-02的坐标系,而GCJ-02,“火星坐标”是在国内最广泛使用的坐标体系。那么,我们就来看看,如何直接获取到GCJ-02坐标呗。
    请大家把这段代码保存到记事本里,然后后缀名改为.html,记得用UTF-8编码来保存。然后双击这个文件,就能打开网页了。

     

     


    说明:

    1、鼠标滚轮可以缩放地图,拖动地图。

    2、点击地图,即可获得GCJ-02的经纬度坐标,地址。

    打开之后,是这样的:

    百度、谷歌高德等网络地图经纬度偏差纠正以及相关坐标系问题

    点击一下地图,即可获得GCJ-02坐标,地址:百度、谷歌高德等网络地图经纬度偏差纠正以及相关坐标系问题

    demo地址:http://zhaoziang.com/amap/picpoint.html

     

    来源:http://blog.sina.com.cn/s/blog_80a9926b0101ktoa.html

  • 相关阅读:
    leetcode——202.快乐数
    leetcode——136. 只出现一次的数字
    leetcode——74.搜索二维矩阵
    leetcode——240.搜索二维矩阵
    leetcode——414.第三大的数
    020 迭代器模式
    019 模板模式
    018 中介者模式
    017 命令模式
    016 责任链模式
  • 原文地址:https://www.cnblogs.com/elves/p/4912788.html
Copyright © 2020-2023  润新知