使用经纬度和海拔(高程)计算两点之间的距离

2024-05-12 17:53:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用经纬度和海拔来计算两点之间的距离。

为了得到我的距离,我使用了euklides公式:

D=√((Long1-Long2)²+(Lat1-Lat2)²+(Alt1-Alt2)²)

我的点是地理坐标,当然海拔是我离海的高度。 我只有lat和液化天然气,我用谷歌API高程来获取我的高度。

我正在开发一个计算我(滑雪板上)行驶距离的应用程序。我使用的每一个应用程序,都会得到包含高度的行驶距离。就像“Endomondo”或“Garmin”,我无法在二维空间中获得距离,因为真实距离将与我返回的距离不同。

哪个公式最适合计算我的距离?当然包括海拔高度。

我正在用Python和PostGis编写我的应用程序。


Tags: 应用程序距离高度公式经纬度地理坐标试图用海拔
3条回答

可以使用geopy包或Vincenty's公式直接粘贴坐标来计算单位坐标之间的距离,例如米。假设结果是d米。然后行驶的总距离是sqrt(d**2 + h**2),其中h是海拔高度的变化,单位为米。

我使用了约翰·穆塔菲斯提供的解决方案,但没有得到正确的答案。公式需要一些修正。您将在http://electron9.phys.utk.edu/vectors/3dcoordinates.htm处获得从极坐标到笛卡尔坐标(x,y,z)的转换。 使用上述公式将球坐标(极坐标)转换为笛卡尔坐标并计算欧氏距离。

我在控制台应用程序中使用了下面的c。 考虑跟踪虚拟lat long

       double lat_1 = 18.457793 * (Math.PI / 180);
       double lon_1 = 73.3951930277778 *(Math.PI/180);
       double alt_1 = 270.146;

       double lat_2 = 18.4581253333333 * (Math.PI / 180);
       double lon_2 = 73.3963755277778 * (Math.PI / 180);
       double alt_2 = 317.473;

       const Double r = 6376.5 *1000;//redius of earth in meaters

       double x_1 = r * Math.Sin(lon_1) * Math.Cos(lat_1);
       double y_1 = r * Math.Sin(lon_1) * Math.Sin(lat_1);
       double z_1 = r * Math.Cos(lon_1);

       double x_2 = r * Math.Sin(lon_2) * Math.Cos(lat_2);
       double y_2 = r * Math.Sin(lon_2) * Math.Sin(lat_2);
       double z_2 = r * Math.Cos(lon_2);

       double dist = Math.Sqrt((x_2 - x_1) * (x_2 - x_1) + (y_2 - y_1) *    
                               (y_2 - y_1) + (z_2 - z_1) * (z_2 - z_1));

编辑2019:由于这个答案,我编写了一个问答风格示例来回答类似的问题(包括这个示例):How to calculate 3D distance (including altitude) between two points in GeoDjango

排序:

我们需要使用Haversine formulaVicenty formula计算两点之间的2Dgreat-circle distance,然后我们可以将其与两点之间的高度差(delta)结合起来计算它们之间的Euclidean distance,如下所示:

dist = sqrt(great_circle((lat_1, lon_1), (lat_2, lon_2)).m**2, (alt_1 - alt_2)**2)

该解决方案假设高度以米为单位,因此也将great_circle的结果转换为米。


通过将坐标从Polar (long, lat, alt)转换为Cartesian (x, y, z)

  • 让:
    polar_point_1 = (long_1, lat_1, alt_1)
    以及
    {}
  • 使用以下公式将每个点转换为笛卡尔等价点:

    x = alt * cos(lat) * sin(long)
    y = alt * sin(lat)
    z = alt * cos(lat) * cos(long)
    

    你将分别有p_1 = (x_1, y_1, z_1)p_2 = (x_2, y_2, z_2)点。

  • 最后使用欧几里德公式:

    dist = sqrt((x_2-x_1)**2 + (y_2-y_1)**2 + (z_2-z_1)**2)
    

相关问题 更多 >