17

所以:我有以下函数,改编自网上找到的公式,它采用两个纬度/经度坐标并找到它们之间的距离(以英里为单位)(沿着球形地球):

public static double distance (double lat1, double lon1, double lat2, double lon2) {
        double theta = toRadians(lon1-lon2);
        lat1 = toRadians(lat1);
        lon1 = toRadians(lon1);
        lat2 = toRadians(lat2);
        lon2 = toRadians(lon2);

        double dist = sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(theta);
        dist = toDegrees(acos(dist)) * 60 * 1.1515 * 1.609344 * 1000;

        return dist;
    }

据我所知,这很好用。

我需要的是第二个函数,它使用完全相同的地球几何模型,采用单个纬度/经度对 [A]、航向和距离,并输出一个新的纬度/经度对 [B] 使得如果您从 [A] 点开始,并以给定的航向行进给定的距离,您将在 [B] 点结束。

这就是我的几何技能完全离开我的事实发挥作用的地方:)

任何帮助将非常感激!

谢谢,-丹

4

1 回答 1

15

我从The Aviation Formulary获得了大部分此类公式。

他给出的公式是:

给定径向和距离的纬度/经度

如果:

 lat=asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
 IF (cos(lat)=0)
    lon=lon1      // endpoint a pole
 ELSE
    lon=mod(lon1-asin(sin(tc)*sin(d)/cos(lat))+pi,2*pi)-pi
 ENDIF 

此算法仅限于 dlon < pi/2 的距离,即那些在经度上延伸不到地球圆周四分之一的距离。如果允许更大的距离,则需要一个完全通用但更复杂的算法:

    lat =asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
     dlon=atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(lat))
     lon=mod( lon1-dlon +pi,2*pi )-pi

请注意,他使用“tc”代表真实航向(从北顺时针以弧度表示),并且他给出的距离是沿地球表面的弧度弧度。公式的第一部分对此进行了解释(以及从海里来回转换的公式)。此外,请查看该页面上的“实施说明”和“工作示例”。

于 2008-12-18T16:03:57.010 回答