我正在尝试计算两点之间的距离,使用经纬度和海拔
我使用了euklides公式来计算我的距离:
D=√((Long1-Long2)²+(Lat1-Lat2)²+(Alt1-Alt2)²)
我的点是地理坐标,当然海拔是我在海面上的高度。我只有晚和液化天然气,我使用谷歌API海拔得到我的高度。
我正在开发一个计算我(在滑雪板上)行进距离的应用程序。我用过的每一个应用程序,都会得到包含高度的行进距离。就像#Endomondo或#Garmin一样,我无法在2D空间中获得我的距离,因为真实距离将与我返回的距离不同。
哪个公式最适合计算我的距离?当然包括高度。
我在写我的应用程序在Python,与PostGis.
您可以使用geopy
包或Vincenty公式直接粘贴坐标,以米为单位计算平面坐标之间的距离。假设结果是d
米。则总行进距离为sqrt(d**2 + h**2)
,其中h
为海拔变化,单位为米。
EDIT 2019:由于这个答案,我编写了一个Q& a样式示例来回答类似的问题(包括这个示例):如何计算GeoDjango中两点之间的3D距离(包括高度)。
:
我们需要使用Haversine公式或Vicenty公式计算两点之间的二维大圆距离,然后我们可以将它与两点之间的高度差(delta)结合起来计算它们之间的欧几里得距离,如下所示:
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)
and
polar_point_2 = (long_2, lat_2, alt_2)
通过使用下面的公式将每个点转换为它的笛卡尔等效点:
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)
我使用了John Moutafis提供的解决方案,但是我没有得到正确的答案。这个公式需要一些修正。您将在http://electron9.phys.utk.edu/vectors/3dcoordinates.htm获得坐标从极坐标到笛卡尔坐标(x, y, z)的转换。使用上述公式将球坐标(极坐标)转换为笛卡尔坐标,并计算欧几里得距离。
我在控制台应用程序中使用了以下c#。考虑跟随dummy 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; // Radius of Earth in metres
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));