JavaScript实现地球表面两点间距离计算:大圆距离与椭球修正公式
本文介绍如何使用JavaScript计算地球表面两点间的距离。首先讲解基于球面假设的大圆距离公式及其JS实现,指出其在相对点处理时的局限性。随后提供基于地球椭球模型的修正公式代码,以提高计算精度。文章包含完整的函数定义、参数说明及关键变量解释,适用于地理信息系统开发中的距离测算场景。
基于球面假设的大圆距离计算
利用JavaScript实现根据经纬度计算地球表面两点间距离的功能。
近期项目中需要计算地球表面两点间的距离,因此使用JavaScript进行了具体实现。
计算地球表面两点间距离通常有两种主要方法。
第一种方法
第一种方法假设地球是一个光滑的球体,计算任意两点间的距离,这种距离被称为大圆距离(The Great Circle Distance)。
具体计算公式如下。
使用JavaScript语言实现该公式的代码如下。
具体代码实现如下:
var EARTH_RADIUS = 6378137.0; //单位M
var PI = Math.PI;
function getRad(d){
return d*PI/180.0;
}
/**
/* caculate the great circle distance */
/* @param {Object} lat1 */
/* @param {Object} lng1 */
/* @param {Object} lat2 */
/* @param {Object} lng2 */
*/
function getGreatCircleDistance(lat1,lng1,lat2,lng2){
var radLat1 = getRad(lat1);
var radLat2 = getRad(lat2);
var a = radLat1 - radLat2;
var b = getRad(lng1) - getRad(lng2);
var s = 2*Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) + Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
s = s*EARTH_RADIUS;
s = Math.round(s*10000)/10000.0;
return s;
} 该公式在大多数情况下结果较为准确,但在处理球面上相对点(antipodal points)时会出现问题。
存在一个修正的公式由于实际需求中未遇到此类极端情况,故未深入探究其具体错误表现,相关信息可在Wiki上查阅。
基于地球椭球模型的修正公式
此外,我们知道地球并非完美的球体,而是一个椭球体,因此存在另一种更精确的计算公式。
相关代码实现如下:
/**
/* approx distance between two points on earth ellipsoid */
/* @param {Object} lat1 */
/* @param {Object} lng1 */
/* @param {Object} lat2 */
/* @param {Object} lng2 */
*/
function getFlatternDistance(lat1,lng1,lat2,lng2){
var f = getRad((lat1 + lat2)/2);
var g = getRad((lat1 - lat2)/2);
var l = getRad((lng1 - lng2)/2);
var sg = Math.sin(g);
var sl = Math.sin(l);
var sf = Math.sin(f);
var s,c,w,r,d,h1,h2;
var a = EARTH_RADIUS;
var fl = 1/298.257;
sg = sg*sg;
sl = sl*sl;
sf = sf*sf;
s = sg*(1-sl) + (1-sf)*sl;
c = (1-sg)*(1-sl) + sf*sl;
w = Math.atan(Math.sqrt(s/c));
r = Math.sqrt(s*c)/w;
d = 2*w*a;
h1 = (3*r -1)/2/c;
h2 = (3*r +1)/2/s;
return d*(1 + fl*(h1*sf*(1-sg) - h2*(1-sf)*sg));
} 使用此公式计算出的结果比第一种方法更为精确,但最终结果的精度仍取决于传入坐标的精度。
JS运算符优先级与结合性的区别是什么?
2026-11-05 13:22:02
JS Map怎么只遍历Key或Value
2026-11-05 13:00:36
D3.js 与 ECharts 选型对比:灵活性 vs 开发效率
2026-11-05 09:45:01
为什么JS中typeof []返回object:数组类型检测误区解析
2026-11-04 19:50:47
D3.js 新手入门:环境搭建与第一个条形图实现
2026-11-04 10:49:48
