我在实现此处描述的功能时遇到问题 这里.

这是我的 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});
}

在调用函数之前,我将方位角转换为弧度,并将距离(公里)转换为弧度距离 - 所以这不是问题。

但是,当我输入坐标时,例如:纬度 = 49.25705;经度=-123.140259;方位角 225(西南),距离 1 公里

我得到这个返回:纬度:-1.0085434360125864 LON:-3.7595299668539504

这显然不正确,有人能看出我做错了什么吗?

谢谢

有帮助吗?

解决方案

这些似乎是您的代码中的问题:

  1. 你需要转换 lat1lon1 在调用函数之前转换为弧度。
  2. 您可能正在缩放 radialDistance 错误地。
  3. 测试浮点数是否相等是危险的。精确算术后相等的两个数字在浮点算术后可能不完全相等。因此 abs(x-y) < threshold 比安全 x == y 用于测试两个浮点数 xy 为了平等。
  4. 我想你想转换 latlon 从弧度到度数。

这是我用 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

其他提示

从根本上来说,您的问题似乎是您以度数而不是弧度传递纬度、经度和方位角。尝试确保始终将弧度传递给函数并查看返回的结果。

附:查看讨论的类似问题 这里这里.

我认为有在算法中消息5提供的一个问题。

它的工作原理但是仅针对用于纬度,对于经度有,因为标志的问题。

为自己的数据会讲:

  

49.26 -123.14 225.0 1.0 49.25 -123.13

如果您的 -123.14°开始,往西走,你应该有远在西部的东西。在这里,我们回去就EAST(-123.13)!

在公式应该包括某处:

  

degreeBearing =((360-degreeBearing)%360)

弧度皈依之前。

当我实现了这一点,我得到的纬度是正确的,但经度是错误的。 例如起点:36.9460678N 9.434807E,轴承45.03334,距离15.0083313公里 其结果是37.0412865N 9.315302E 这进一步西湖比我的出发点,而不是进一步东部。事实上,它是因为如果所述轴承是315.03334度。

更多网页搜索导致我: HTTP://www.movable- type.co.uk/scripts/latlong.html 经度代码如下显示(在C#与弧度一切)

        if ((Math.Cos(rLat2) == 0) || (Math.Abs(Math.Cos(rLat2)) < EPSILON))
        {
            rLon2 = rLon1;
        }
        else
        {
            rLon2 = rLon1 + Math.Atan2(Math.Sin(rBearing) * Math.Sin(rDistance) * Math.Cos(rLat1), Math.Cos(rDistance) - Math.Sin(rLat1) * Math.Sin(rLat2));
        }

这似乎为我工作的罚款。希望这是有帮助的。

为Python代码由于 我试图将其设置在我的使用情况 在那里我试图找到一个点的两个人之间的纬度经度 从第一点的一组距离,所以它是相当similare你的代码 APPART我的轴承被动态计算

起始点(LAT1)lon1 / LAT1 = 55.625541,-21.142463

终点(LAT2)lon2 / LAT2 = 55.625792,-22.142248

我的结果应在lon3 / lat3是在这两个之间的点 偏偏我得到lon3 / lat3 = 0.0267695450609,0.0223553243666

我想这可能是在纬度经度的差异,但没有 当我添加或分吧这不是好

任何意见将是真正伟大 感谢

这是我的执行

距离= 0.001 小量= 0.000001

计算动态轴承

y = math.sin(distance) * math.cos(lat2);
x = math.cos(lat1)*math.sin(lat2) - math.sin(lat1)*math.cos(lat2)*math.cos(distance);
bearing = math.atan2(y, x)

计算lat3 lon3动态

rlat1 = (lat1 * 180) / math.pi
rlon1 = (lon1 * 180) / math.pi
rbearing = (bearing * 180) / math.pi
rdistance = distance / R # normalize linear distance to radian angle

rlat = math.asin( math.sin(rlat1) * math.cos(rdistance) + math.cos(rlat1) * math.sin(rdistance) * math.cos(rbearing) )
if math.cos(rlat) == 0 or abs(math.cos(rlat)) < epsilon: # Endpoint a pole
      rlon=rlon1
else:
    rlon = ( (rlon1 + math.asin( math.sin(rbearing)* math.sin(rdistance) / math.cos(rlat) ) + math.pi ) % (2*math.pi) ) - math.pi

lat3 = (rlat * math.pi)/ 180
lon3 = (rlon * math.pi)/ 180

一切工作按预期,但问题是,你的数学假设地球是一个球体,而实际上它近似于椭圆形。

有关“Vincenty公式”你喜欢的搜索引擎的快速拖网将有望证明是有用的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top