最近做地图相关项目,才发现自己关于经纬度坐标系的理解太肤浅了。看了些不错的文章,摘录如下。
推演算式不难:
$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.388171, 39.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