按照经纬度计算两点之间距离(怕怕系列副产品之一) - CNode技术社区

按照经纬度计算两点之间距离(怕怕系列副产品之一)
发布于 14 年前 作者 olddog 12360 次浏览 最后一次编辑是 9 年前

使用者需要根据实际情况,稍做修改。废话不多说,直接上代码。

var sphereDistance = function (a, b) {
 var ax = null;
 var ay = null;
 var bx = null;
 var by = null;
 for (var key in a) {
 if (ax == null) {
 ax = a[key] * (Math.PI / 180);
 } else if (ay == null) {
 ay = a[key] * (Math.PI / 180);
 }
 
 }
 for (var key in b) {
 if (bx == null) {
 bx = b[key] * (Math.PI / 180);
 
 } else if (by == null) {
 by = b[key] * (Math.PI / 180);
 
 }
 
 }
 var sin_x1 = Math.sin(ax), cos_x1 = Math.cos(ax);
 var sin_y1 = Math.sin(ay), cos_y1 = Math.cos(ay);
 var sin_x2 = Math.sin(bx), cos_x2 = Math.cos(bx);
 var sin_y2 = Math.sin(by), cos_y2 = Math.cos(by);
 var cross_prod = cos_y1 * cos_x1 * cos_y2 * cos_x2 + cos_y1 * sin_x1 * cos_y2 * sin_x2 + sin_y1 * sin_y2;
 if (cross_prod >= 1 || cross_prod <= -1) {
 if (!(Math.abs(cross_prod) - 1 < 0.000001)) {
 return false;
 }
 return cross_prod > 0 ? 0 : Math.PI;
 }
 return Math.acos(cross_prod);
};
8 回复

以前写的用于计算两点坐标距离的PHP代码:

// 计算两坐标点间距离,单位:千米
define('EARTH_RADIUS', 6378.137);	// 地球半径
function getDistance($lat1, $lng1, $lat2, $lng2) {
 $radLat1 = deg2rad($lat1);
 $radLat2 = deg2rad($lat2);
 $a = $radLat1 - $radLat2;
 $r = deg2rad($lng1) - deg2rad($lng2);
 $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($r / 2), 2)));
 $s = $s * EARTH_RADIUS;
 $s = round($s * 10000) / 10000;
 return $s;
}

计算方法好像跟你这个不一样的呐

@@,我是从MongoDB的函数库里直接扒下来的,我试验了下,用着还成

《HTML5高级程序设计》里面有一个相关知识的函数。。

请教一个问题:地球是圆的,对吧 ^_^ 即2个经纬度之间是弧形,如果所求的距离很大,如何解决这个误差?谢谢~

这个就是呀

平面的是

 var distance = function (a, b) {
 var ax = null;
 var ay = null;
 var bx = null;
 var by = null;
 for (var key in a) {
 if (ax == null) {
 ax = a[key];
 } else if (ay == null) {
 ay = a[key];
 }
 }
 for (var key in b) {
 if (bx == null) {
 bx = b[key];
 } else if (by == null) {
 by = b[key];
 }
 }
 return Math.sqrt(Math.pow(by - ay, 2) + Math.pow(bx - ax, 2));
}

@olddog 收藏!最好再搞个带注释的,呵呵~

@olddog 参数细节能详细点儿吗,谢谢~

此函数仅计算球面距离。 希望计算大地坐标系中两点距离的同学可使用Vincenty公式:

http://www.movable-type.co.uk/scripts/latlong-vincenty.html

回到顶部

AltStyle によって変換されたページ (->オリジナル) /