计算点和线段之间的距离(经度和纬度)

bjo*_*asm 6 python latitude-longitude

我有一个定义有起点和终点的线段:

A: 
x1 = 10.7196405787775
y1 = 59.9050401935882

B: 
x2 = 10.7109989561813
y2 = 59.9018650448204
Run Code Online (Sandbox Code Playgroud)

其中x定义经度,y定义纬度。

我也有一点:

P:
x0 = 10.6542116666667
y0 = 59.429105
Run Code Online (Sandbox Code Playgroud)

如何计算线段和点之间的最短距离?我知道如何在笛卡尔坐标中执行此操作,但在长/纬度坐标中却不行。

nel*_*fin -1

使用有用的 Python 地理编码库geopy以及Chris Veness 的大地测量公式中的大圆中点公式,我们可以找到大圆弧与给定点之间的距离:

from math import sin, cos, atan2, sqrt, degrees, radians, pi
from geopy.distance import great_circle as distance
from geopy.point import Point


def midpoint(a, b):
    a_lat, a_lon = radians(a.latitude), radians(a.longitude)
    b_lat, b_lon = radians(b.latitude), radians(b.longitude)
    delta_lon = b_lon - a_lon
    B_x = cos(b_lat) * cos(delta_lon)
    B_y = cos(b_lat) * sin(delta_lon)
    mid_lat = atan2(
        sin(a_lat) + sin(b_lat),
        sqrt(((cos(a_lat) + B_x)**2 + B_y**2))
    )
    mid_lon = a_lon + atan2(B_y, cos(a_lat) + B_x)
    # Normalise
    mid_lon = (mid_lon + 3*pi) % (2*pi) - pi
    return Point(latitude=degrees(mid_lat), longitude=degrees(mid_lon))
Run Code Online (Sandbox Code Playgroud)

在这个例子中给出:

# Example:
a = Point(latitude=59.9050401935882, longitude=10.7196405787775)
b = Point(latitude=59.9018650448204, longitude=10.7109989561813)
p = Point(latitude=59.429105, longitude=10.6542116666667)

d = distance(midpoint(a, b), p)
print d.km
# 52.8714586903
Run Code Online (Sandbox Code Playgroud)

  • 这给出了到中点的距离。这与到线段的距离不同 - 例如,如果 p 接近 a,则 d 应远小于从 a 到 b 的距离的一半。 (14认同)