得到当前点,距离和方位的纬度/经度

给定经纬度的现有点,以(KM)和方位(以度数换算为弧度)的距离,我想计算新的纬度/经度。 这个网站一遍又一遍地出现,但我无法得到公式为我工作。

上面链接的公式是:

lat2 = asin(sin(lat1)*cos(d/R) + cos(lat1)*sin(d/R)*cos(θ)) lon2 = lon1 + atan2(sin(θ)*sin(d/R)*cos(lat1), cos(d/R)−sin(lat1)*sin(lat2)) 

以上公式适用于MSExcel,其中 –

 asin = arc sin() d = distance (in any unit) R = Radius of the earth (in the same unit as above) and hence d/r = is the angular distance (in radians) atan2(a,b) = arc tan(b/a) θ is the bearing (in radians, clockwise from north); 

这里是我在Python中的代码。

 import math R = 6378.1 #Radius of the Earth brng = 1.57 #Bearing is 90 degrees converted to radians. d = 15 #Distance in km #lat2 52.20444 - the lat result I'm hoping for #lon2 0.36056 - the long result I'm hoping for. lat1 = 52.20472 * (math.pi * 180) #Current lat point converted to radians lon1 = 0.14056 * (math.pi * 180) #Current long point converted to radians lat2 = math.asin( math.sin(lat1)*math.cos(d/R) + math.cos(lat1)*math.sin(d/R)*math.cos(brng)) lon2 = lon1 + math.atan2(math.sin(brng)*math.sin(d/R)*math.cos(lat1), math.cos(d/R)-math.sin(lat1)*math.sin(lat2)) print(lat2) print(lon2) 

我明白了

 lat2 = 0.472492248844 lon2 = 79.4821662373 

需要将来自弧度的答案转换回度数。 以下工作代码:

 import math R = 6378.1 #Radius of the Earth brng = 1.57 #Bearing is 90 degrees converted to radians. d = 15 #Distance in km #lat2 52.20444 - the lat result I'm hoping for #lon2 0.36056 - the long result I'm hoping for. lat1 = math.radians(52.20472) #Current lat point converted to radians lon1 = math.radians(0.14056) #Current long point converted to radians lat2 = math.asin( math.sin(lat1)*math.cos(d/R) + math.cos(lat1)*math.sin(d/R)*math.cos(brng)) lon2 = lon1 + math.atan2(math.sin(brng)*math.sin(d/R)*math.cos(lat1), math.cos(d/R)-math.sin(lat1)*math.sin(lat2)) lat2 = math.degrees(lat2) lon2 = math.degrees(lon2) print(lat2) print(lon2) 

geopy库支持这个:

 import geopy from geopy.distance import VincentyDistance # given: lat1, lon1, b = bearing in degrees, d = distance in kilometers origin = geopy.Point(lat1, lon1) destination = VincentyDistance(kilometers=d).destination(origin, b) lat2, lon2 = destination.latitude, destination.longitude 

通过https://stackoverflow.com/a/4531227/37610find

可能有点晚回答,但经过testing其他答案,看来他们不能正常工作。 这是我们用于我们的系统的一个PHP代码。 全方位工作。

PHP代码:

lat1 =以度为单位的起点纬度

long1 =以度为单位的起点经度

d =以KM为单位的距离

angular度=度数

 function get_gps_distance($lat1,$long1,$d,$angle) { # Earth Radious in KM $R = 6378.14; # Degree to Radian $latitude1 = $lat1 * (M_PI/180); $longitude1 = $long1 * (M_PI/180); $brng = $angle * (M_PI/180); $latitude2 = asin(sin($latitude1)*cos($d/$R) + cos($latitude1)*sin($d/$R)*cos($brng)); $longitude2 = $longitude1 + atan2(sin($brng)*sin($d/$R)*cos($latitude1),cos($d/$R)-sin($latitude1)*sin($latitude2)); # back to degrees $latitude2 = $latitude2 * (180/M_PI); $longitude2 = $longitude2 * (180/M_PI); # 6 decimal for Leaflet and other system compatibility $lat2 = round ($latitude2,6); $long2 = round ($longitude2,6); // Push in array and get back $tab[0] = $lat2; $tab[1] = $long2; return $tab; } 

lon1和lat1度

brng =以弧度表示的轴承

d =以公里为单位的距离

R =地球半径,单位为公里

 lat2 = math.degrees((d/R) * math.cos(brng)) + lat1 long2 = math.degrees((d/(R*math.sin(math.radians(lat2)))) * math.sin(brng)) + long1 

我在PHP中实现了你的algorithm和我的基准。 这个版本在大约50%的时间内运行。 生成的结果是相同的,所以在math上似乎是相同的。

我没有testing上面的Python代码,所以可能会出现语法错误。

也迟到,但对于那些可能会发现这一点,你会得到更精确的结果使用geographiclib库。 查看测地问题描述和JavaScript示例,以便简单介绍如何使用以回答主题问题以及其他许多问题。 包括Python在内的各种语言的实现。 如果你关心准确性,比自己编码好得多; 在早些时候“使用图书馆”的build议比VincentyDistance更好。 正如文件所述:“重点在于返回准确的结果,并且接近四舍五入的误差(约5-15纳米)”。

只需交换atan2(y,x)函数中的值即可。 不是atan2(x,y)!

我将Python移植到Javascript。 这将返回Bing地图Location对象,您可以更改为任何你喜欢的。

 getLocationXDistanceFromLocation: function(latitude, longitude, distance, bearing) { // distance in KM, bearing in degrees var R = 6378.1, // Radius of the Earth brng = Math.radians(bearing) // Convert bearing to radian lat = Math.radians(latitude), // Current coords to radians lon = Math.radians(longitude); // Do the math magic lat = Math.asin(Math.sin(lat) * Math.cos(distance / R) + Math.cos(lat) * Math.sin(distance / R) * Math.cos(brng)); lon += Math.atan2(Math.sin(brng) * Math.sin(distance / R) * Math.cos(lat), Math.cos(distance/R)-Math.sin(lat)*Math.sin(lat)); // Coords back to degrees and return return new Microsoft.Maps.Location(Math.degrees(lat), Math.degrees(lon)); },