地图坐标详解及转换方法

大家都知道,美国GPS使用的是WGS84的坐标系统,以经纬度的形式来表示地球平面上的某一个位置,这应该是国际共识。但在我国,出于国家安全考虑,国内所有导航电子地图必须使用国家测绘局制定的加密坐标系统,即将一个真实的经纬度坐标加密成一个不正确的经纬度坐标,我们在业内将前者称之为地球坐标,后者称之为火星坐标

地图坐标详解及转换方法_第1张图片

下面是百度官方对百度坐标为何有偏移的解释

  国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私。百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换。

一、坐标体系

首先我们要明白,开发者能接触到哪些坐标体系呢?

第一种分类:

1、  GPS,WGS-84,原始坐标体系

一般用国际标准的 GPS记录仪 记录下来的坐标,都是GPS的坐标。很可惜,在中国,任何一个地图产品都不允许使用GPS坐标,据说是为了保密。GPS坐标形式如图,度分秒形式的经纬度:

地图坐标详解及转换方法_第2张图片地图坐标详解及转换方法_第3张图片

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

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


第二种分类:

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

地图坐标详解及转换方法_第4张图片

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上有很详细的讲解:

关于 GCJ-02 和 BD-09 ,请参考 http://developer.baidu.com/map/question.htm#qa0043 。

算法代码如下,其中 bd_encrypt 将 GCJ-02 坐标转换成 BD-09 坐标, bd_decrypt 反之

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);  
}

不过也有更简单的算法,线性算法(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.地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法

WGS-84  GCJ-02 的转换(即 GPS 加偏)算法是一个普通青年轻易无法接触到的公开秘密。这个算法的代码在互联网上是公开的,详情请使用 Google 搜索 "wgtochina_lb" 

整理后的算法代码请参考 https://on4wp7.codeplex.com/SourceControl/changeset/view/21483#353936 。代码如下

using System;namespace Navi
{    class EvilTransform
    {        const double pi = 3.14159265358979324;        //
        // Krasovsky 1940
        //
        // a = 6378245.0, 1/f = 298.3
        // b = a * (1 - f)
        // ee = (a^2 - b^2) / a^2;
        const double a = 6378245.0;        const double ee = 0.00669342162296594323;        //
        // World Geodetic System ==> Mars Geodetic System
        public static void transform(double wgLat, double wgLon, out double mgLat, out double mgLon)
        {            if (outOfChina(wgLat, wgLon))
            {
                mgLat = wgLat;
                mgLon = wgLon;                return;
            }            double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);            double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);            double radLat = wgLat / 180.0 * pi;            double magic = Math.Sin(radLat);
            magic = 1 - ee * magic * magic;            double sqrtMagic = Math.Sqrt(magic);
            dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
            dLon = (dLon * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);
            mgLat = wgLat + dLat;
            mgLon = wgLon + dLon;
        }        static bool outOfChina(double lat, double lon)
        {            if (lon < 72.004 || lon > 137.8347)                return true;            if (lat < 0.8293 || lat > 55.8271)                return true;            return false;
        }        static double transformLat(double x, double y)
        {            double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs(x));
            ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
            ret += (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0;
            ret += (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0;            return ret;
        }        static double transformLon(double x, double y)
        {            double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.Sqrt(Math.Abs(x));
            ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
            ret += (20.0 * Math.Sin(x * pi) + 40.0 * Math.Sin(x / 3.0 * pi)) * 2.0 / 3.0;
            ret += (150.0 * Math.Sin(x / 12.0 * pi) + 300.0 * Math.Sin(x / 30.0 * pi)) * 2.0 / 3.0;            return ret;
        }
    }
}

知道了这个算法之后,就可以离线进行 Google 地图偏移校正,不必像之前那么麻烦。至于 GCJ-02  WGS-84 的转换(即 GPS 纠偏),可以使用二分法。

如何将非高德坐标转换为高德坐标系

Dear 开发者:

如果你苦闷于如何将非高德坐标转换为高德坐标系时,请看这里。

当你在高德定位、规划路径等众多优质服务面前徘徊,请必须看这里!!

喜大普奔的消息来了!坐标转换服务在千呼万唤中,终于bulingbuling 登场。

坐标转换后,使用JS API、SDK再无烦恼,大BOSS再也不用担心我的工作,soeasy!

解决开发者的问题就是我们的使命,一切开发者的障碍必须肃清。

坐标转换service:

一.适用对象:

苦苦纠结于如何将GPS、mapbar、baidu坐标转换为高德坐标系的开发者们。

二.转换方法:

1.      首先当然还是需要人手一个的百宝key。注意:权限君升级权限系统后,调用坐标转换接口的童鞋们需要重新申请。注意:绑定服务需选择REST服务接口

地图坐标详解及转换方法_第5张图片

2.      调用坐标转换接口,接口请求攻略如下:

1)  服务协议为GET请求

2)  请求地址:http://restapi.amap.com/v3/assistant/coordinate/convert?parameters

3)  请求参数:

地图坐标详解及转换方法_第6张图片

z转换成功


将非百度坐标转换为百度坐标接口

http://developer.baidu.com/map/changeposition.htm

http://developer.baidu.com/map/question.htm#qa0043



你可能感兴趣的:(坐标转换)