我在实现此处描述的功能时遇到问题。
这是我的Java实现:
private static double[] pointRadialDistance(double lat1, double lon1, double radianBearing, double radialDistance) { double lat = Math.asin(Math.sin(lat1)*Math.cos(radialDistance)+Math.cos(lat1) *Math.sin(radialDistance)*Math.cos(radianBearing)); double lon; if(Math.cos(lat) == 0) { // Endpoint a pole lon=lon1; } else { lon = ((lon1-Math.asin(Math.sin(radianBearing)*Math.sin(radialDistance)/Math.cos(lat)) +Math.PI) % (2*Math.PI)) - Math.PI; } return (new double[]{lat, lon}); }
在调用函数之前,我将方位角转换为弧度,并将距离(km)转换为弧度距离-因此这不是问题。
但是,当我输入坐标时:lat = 49.25705; lon = -123.140259; 方位角为225(西南),距离为1km
我得到这个返回:lat:-1.0085434360125864 lon:-3.7595299668539504
它显然是不正确的,任何人都可以看到我在做什么错吗?
谢谢
看来这些是您的代码中的问题:
lat1
lon1
radialDistance
abs(x-y) < threshold
x == y
x
y
lat
lon
这是我在Python中实现的代码:
#!/usr/bin/env python from math import asin,cos,pi,sin rEarth = 6371.01 # Earth's average radius in km epsilon = 0.000001 # threshold for floating-point equality def deg2rad(angle): return angle*pi/180 def rad2deg(angle): return angle*180/pi def pointRadialDistance(lat1, lon1, bearing, distance): """ Return final coordinates (lat2,lon2) [in degrees] given initial coordinates (lat1,lon1) [in degrees] and a bearing [in degrees] and distance [in km] """ rlat1 = deg2rad(lat1) rlon1 = deg2rad(lon1) rbearing = deg2rad(bearing) rdistance = distance / rEarth # normalize linear distance to radian angle rlat = asin( sin(rlat1) * cos(rdistance) + cos(rlat1) * sin(rdistance) * cos(rbearing) ) if cos(rlat) == 0 or abs(cos(rlat)) < epsilon: # Endpoint a pole rlon=rlon1 else: rlon = ( (rlon1 - asin( sin(rbearing)* sin(rdistance) / cos(rlat) ) + pi ) % (2*pi) ) - pi lat = rad2deg(rlat) lon = rad2deg(rlon) return (lat, lon) def main(): print "lat1 \t lon1 \t\t bear \t dist \t\t lat2 \t\t lon2" testcases = [] testcases.append((0,0,0,1)) testcases.append((0,0,90,1)) testcases.append((0,0,0,100)) testcases.append((0,0,90,100)) testcases.append((49.25705,-123.140259,225,1)) testcases.append((49.25705,-123.140259,225,100)) testcases.append((49.25705,-123.140259,225,1000)) for lat1, lon1, bear, dist in testcases: (lat,lon) = pointRadialDistance(lat1,lon1,bear,dist) print "%6.2f \t %6.2f \t %4.1f \t %6.1f \t %6.2f \t %6.2f" % (lat1,lon1,bear,dist,lat,lon) if __name__ == "__main__": main()
这是输出:
lat1 lon1 bear dist lat2 lon2 0.00 0.00 0.0 1.0 0.01 0.00 0.00 0.00 90.0 1.0 0.00 -0.01 0.00 0.00 0.0 100.0 0.90 0.00 0.00 0.00 90.0 100.0 0.00 -0.90 49.26 -123.14 225.0 1.0 49.25 -123.13 49.26 -123.14 225.0 100.0 48.62 -122.18 49.26 -123.14 225.0 1000.0 42.55 -114.51