JS实现根据两点位置的经纬度获取距离
// 经纬度转换成三⾓函数中度分表形式。
function rad(d) {
return d * Math.PI / 180.0;
}
// 根据经纬度计算距离,参数分别为第⼀点的纬度,经度;第⼆点的纬度,经度
function getDistance(lat1, lng1, lat2, lng2) {
var radLat1 = rad(lat1);
var radLat2 = rad(lat2);
var a = radLat1 - radLat2;
var b = rad(lng1) - rad(lng2);
var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
s = s * 6378.137; // EARTH_RADIUS;
s = und(s * 10000) / 10000; //输出为公⾥
var distance = s;
var distance_str = "";
if (parseInt(distance) >= 1) {
distance_str = Fixed(1) + "km";
} else {
distance_str = distance * 1000 + "m";
}
/
/Fixed(4);
console.info('lyj 距离是', s);
console.info('lyj 距离是', distance_str);
return s;
}
解析(转⾃:)原⽂时C,我这⾥转为JS
这些经纬线是怎样定出来的呢?地球是在不停地绕地轴旋转(地轴是⼀根通过地球南北两极和地球中⼼的
假想线),在地球中腰画⼀个与地轴垂直的⼤圆圈,使圈上的每⼀点都和南北两极的距离相等,这个圆圈
就叫作“⾚道”。在⾚道的南北两边,画出许多和⾚道平⾏的圆圈,就是“纬圈”;构成这些圆圈的线段,
叫做纬线。我们把⾚道定为纬度零度,向南向北各为90度,在⾚道以南的叫南纬,在⾚道以北的叫北纬。
北极就是北纬90度,南极就是南纬90度。纬度的⾼低也标志着⽓候的冷热,如⾚道和低纬度地地区⽆冬,
两极和⾼纬度地区⽆夏,中纬度地区四季分明。
其次,从北极点到南极点,可以画出许多南北⽅向的与地球⾚道垂直的⼤圆圈,这叫作“经圈”;构成这
些圆圈的线段,就叫经线。公元1884平⾯坐标图年,国际上规定以通过英国伦敦近郊的格林尼治天⽂台的
经线作为计算经度的起点,即经度零度零分零秒,也称“本初⼦午线”。在它东⾯的为东经,共180度;
在它西⾯的为西经,共180度。因为地球是圆的,所以东经180度和西经180度的经线是同⼀条经线。各国
公定180度经线为“国际⽇期变更线”。为了避免同⼀地区使⽤两个不同的⽇期,国际⽇期变线在遇陆地时
略有偏离。
每⼀经度和纬度还可以再细分为60分,每⼀分再分为60秒以及秒的⼩数。利⽤经纬线,我们就可以确定
地球上每⼀个地⽅的具体位置,并且把它在地图或地球仪上表⽰出来。例如问北京的经纬度是多少?我们
很容易从地图上查出来是东经116度24分,北纬39度54分。在⼤海中航⾏的船只,只要把所在地的经度测
出来,就可以确定船在海洋中的位置和前进⽅向。纬度共有90度。⾚道为0度,向两极排列,圈⼦越⼩,
度数越⼤。
横线是纬度,竖线是经度。
当然可以计算,四元⼆次⽅程。
经度和纬度都是⼀种⾓度。经度是个两⾯⾓,是两个经线平⾯的夹⾓。因所有经线都是⼀样长,为了度量
经度选取⼀个起点⾯,经1884年国际会议协商,决定以通过英国伦敦近郊、泰晤⼠河南岸的格林尼治皇家
天⽂台(旧址)的⼀台主要⼦午仪⼗字丝的那条经线为起始经线,称为本初⼦午线。本初⼦午线平⾯是起
点⾯,终点⾯是本地经线平⾯。某⼀点的经度,就是该点所在的经线平⾯与本初⼦午线平⾯间的夹⾓。在
⾚道上度量,⾃本初⼦午线平⾯作为起点⾯,分别往东往西度量,往东量值称为东经度,往西量值称为西
经度。由此可见,⼀地的经度是该地对于本初⼦午线的⽅向和⾓距离。本初⼦午线是0°经度,东经度的最
⼤值为180°,西经度的最⼤值为180°,东、西经180°经线是同⼀根经线,因此不分东经或西经,⽽统称
180°经线。
纬度是个线⾯⾓。起点⾯是⾚道平⾯,线是本地的地⾯法线。所谓法线,即垂直于参考扁球体表⾯的线。
某地的纬度就是该地的法线与⾚道平⾯之间的夹⾓。纬度在本地经线上度量,由⾚道向南、北度量,向北
量值称为北纬度,向南量值称为南纬度。由此可见,⼀地的纬度是该地对于⾚道的⽅向和⾓距离。⾚道是
0°纬线,北纬度的最⼤值为90°,即北极点;南纬度的最⼤值为90°,即南极点。
经纬度互换
度(DDD):E 108.90593度    N 34.21630度
如何将度(DDD):: 108.90593度换算成度分秒(DMS)东经E 108度54分22.2秒?转换⽅法是将108.90593整数位不变取108(度),⽤0.90593*60=54.3558,取整数位54(分),0.3558*60=21.348再取整数位21(秒),故转化为108度54分21秒.
同样将度分秒(DMS):东经E 108度54分22.2秒换算成度(DDD)的⽅法如下:108度54分22.2秒=108+(54/60)+(22.2/3600)=108.90616度
因为计算时⼩数位保留的原因,导致正反计算存在⼀定误差,但误差影响不是很⼤。1秒的误差就是⼏⽶的样⼦。GPS车友可以⽤上述⽅法换算成⾃⼰需要的单位坐标。
经纬度换算成⽶
纬度分为60分,每⼀分再分为60秒以及秒的⼩数。
纬度线投射在图上看似⽔平的平⾏线,但实际上是不同半径的圆。有相同特定纬度的所有位置都在同⼀个纬线上。
⾚道的纬度为0°,将⾏星平分为南半球和北半球。
纬度是指某点与地球球⼼的连线和地球⾚道⾯所成的线⾯⾓,其数值在0⾄90度之间。位于⾚道以北的点的纬度叫北纬,记为N,位于⾚道以南的点的纬度称南纬,记为S。
纬度数值在0⾄30度之间的地区称为低纬地区,纬度数值在30⾄60度之间的地区称为中纬地区,纬度数值在60⾄90度之间的地区称为⾼纬地区。
⾚道、南回归线、北回归线、南极圈和北极圈是特殊的纬线。
纬度1秒的长度
地球的⼦午线总长度⼤约40008km。平均:
纬度1度 = ⼤约111km
三角函数查询表
纬度1分 = ⼤约1.85km
纬度1秒 = ⼤约30.9m
根据地球上任意两点的经纬度计算两点间的距离
地球是⼀个近乎标准的椭球体,它的⾚道半径为6378.140千⽶,极半径为 6356.755千⽶,平均半径6371.004千⽶。如果我们假设地球是⼀个完美的球体,那么它的半径就是地球的平均半径,记为R。如果以0度经线为基准,那么根据地球表⾯任意两点的经纬度就可以计算出这两点间的地表距离(这⾥忽略地球表⾯地形对计算带来的误差,仅仅是理论上的估算值)。设第⼀点A的经纬度为(LonA, LatA),第⼆点B的经纬度为(LonB, LatB),按照0度经线的基准,东经取经度的正值(Longitude),西经取经度负值(-Longitude),北纬取90-纬度值(90-Latitude),南纬取90+纬度值(90+Latitude),则经过上述处理过后的两点被计为(MLonA, MLatA)和(MLonB, MLatB)。那么根据三⾓推导,可以得到计算两点距离的如下公式:
C = sin(MLatA)*sin(MLatB)*cos(MLonA-MLonB) + cos(MLatA)*cos(MLatB)
Distance = R*Arccos(C)*Pi/180
这⾥,R和Distance单位是相同,如果是采⽤6371.004千⽶作为半径,那么Distance就是千⽶为单位,
如果要使⽤其他单位,⽐如mile,还需要做单位换算,1千⽶=0.621371192mile
如果仅对经度作正负的处理,⽽不对纬度作90-Latitude(假设都是北半球,南半球只有澳洲具有应⽤意义)的处理,那么公式将是:
C = sin(LatA)*sin(LatB) + cos(LatA)*cos(LatB)*cos(MLonA-MLonB)
Distance = R*Arccos(C)*Pi/180
以上通过简单的三⾓变换就可以推出。
如果三⾓函数的输⼊和输出都采⽤弧度值,那么公式还可以写作:
C = sin(LatA*Pi/180)*sin(LatB*Pi/180) + cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)*Pi/180)
Distance = R*Arccos(C)*Pi/180
也就是:
C = sin(LatA/57.2958)*sin(LatB/57.2958) + cos(LatA/57.2958)*cos(LatB/57.2958)*cos((MLonA-MLonB)
/57.2958)
Distance = R*Arccos(C) = 6371.004*Arccos(C) kilometer = 0.621371192*6371.004*Arccos(C) mile = 3958.758349716768*Arccos(C) mile
在实际应⽤当中,⼀般是通过⼀个个体的来查该对应的地区中⼼的经纬度,然后再根据这些经纬度来计算彼此的距离,从⽽估算出某些体之间的⼤致距离范围(⽐如酒店旅客的分布范围-各个旅客的对应的经纬度和酒店的经纬度所计算的距离范围-等等),所以,通过查询经纬度这样⼀个数据库是⼀个很有⽤的资源。