经纬度坐标系相关知识

最近做地图相关项目,才发现自己关于经纬度坐标系的理解太肤浅了。看了些不错的文章,摘录如下。

距离计算

推演算式不难:


$s = acos(cos($radLat1) * cos($radLat2) * cos($radLng1 - $radLng2) + sin($radLat1) * sin($radLat2)) * $R;

但一般推荐使用所谓的google算法,计算效率更高:


$s = 2*asin(sqrt(pow(sin(($radLat1-$radLat2)/2),2)+cos($radLat1)*cos($radLat2)*pow(sin(($radLng1-$radLng2)/2),2)))*$R;

注:上面式子中$radLat1、$radLng1,$radLat2,$radLng2 为弧度,$R为地球平均半径,大约为6371.393km。

关于坐标系

尽量都是经纬度,但也不一样,有如下一些:

1、 GPS,WGS-84,原始坐标体系。一般用国际标准的GPS记录仪记录下来的坐标,都是GPS的坐标。据说在中国,任何一个地图产品都不允许使用GPS坐标,可能是为了保密。

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

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

经纬度其实是球面坐标,其实还有其他的坐标方式:

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

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

一些特别的位置

各种坐标系的原点都是非洲:

本初子午线,即0度经线,亦称格林威治子午线或格林尼治子午线,是位于英国格林尼治天文台的一条经线(亦称子午线):

坐标转换

GCJ-02与BD-09之间互转:


#include <math.h>  
  
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;};

坐标拾取

百度官方提供:http://api.map.baidu.com/lbsapi/getpoint/index.html

高德官方提供:http://lbs.amap.com/console/show/picker

网友Demo:http://zhaoziang.com/amap/picpoint.html

 

发表于 2016-03-09 01:13   修改于 2017-12-11 19:19   评论:0   阅读:271  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo