说我有以下多边形和点:
>>> poly = Polygon([(0, 0), (2, 8), (14, 10), (6, 1)])
>>> point = Point(12, 4)
我可以计算点到多边形的距离......
>>> dist = point.distance(poly)
>>> print(dist)
2.49136439561
...但我想知道最短距离所测量的多边形边界上的点的坐标。
我最初的方法是缓冲点到多边形的距离,找到该圆与多边形相切的点:
>>> buff = point.buffer(dist)
但是,我不确定如何计算这一点。这两个多边形不相交,因此list(poly.intersection(buff))
不会给我这一点。
我是否在正确的轨道上?有更直接的方法吗?
答案 0 :(得分:25)
有一种简单的方法可以依靠Shapely函数来完成这项工作。
首先,您需要获得多边形的外环并将该点投射到环上。自多边形以来,必须将外部设为LinearRing
没有投影功能。与直觉相反,这给出了一个距离,即从环的第一个点到最接近给定点的环中的点的距离。然后,您只需使用该距离来获得插值函数的点。请参阅下面的代码。
from shapely.geometry import Polygon, Point, LinearRing
poly = Polygon([(0, 0), (2,8), (14, 10), (6, 1)])
point = Point(12, 4)
pol_ext = LinearRing(poly.exterior.coords)
d = pol_ext.project(point)
p = pol_ext.interpolate(d)
closest_point_coords = list(p.coords)[0]
重要的是要提到这种方法只有在您知道该点位于多边形外部之外时才有效。如果该点在其内环之一内,则需要针对该情况调整代码。
如果多边形没有内环,则代码甚至可以用于多边形内的点。这是因为我们实际上使用外环作为线串,并忽略线串是否来自多边形。
很容易将此代码扩展到计算任何点(多边形内部或外部)到多边形边界中最近点的距离的一般情况。您只需计算从点到所有线环的最近点(和距离):外环和多边形的每个内环。然后,你只保留最低限度。
答案 1 :(得分:1)
虽然eguaio的答案是可行的,但还有一种更自然的方法可以使用shapely.ops.nearest_points
函数来获取最接近的点:
from shapely.geometry import Point, Polygon
from shapely.ops import nearest_points
poly = Polygon([(0, 0), (2, 8), (14, 10), (6, 1)])
point = Point(12, 4)
# The points are returned in the same order as the input geometries:
p1, p2 = nearest_points(poly, point)
print(p1.wkt)
# POINT (10.13793103448276 5.655172413793103)
结果与其他答案相同:
from shapely.geometry import LinearRing
pol_ext = LinearRing(poly.exterior.coords)
d = pol_ext.project(point)
p = pol_ext.interpolate(d)
print(p.wkt)
# POINT (10.13793103448276 5.655172413793103)
print(p.equals(p1))
# True
答案 2 :(得分:0)
有两种情况可以考虑:(1)最近点位于边缘,(2)最近点是顶点。情况(2)很容易检查 - 只需到每个顶点的距离并找到最小值。案例(1)涉及更多的数学但仍然不是太糟糕。对于情况(1),您需要做两件事:(a)找到从点到边缘的法线与边缘相交的位置,以及(b)验证它位于线段内(而不是延伸到线段之一)结束)。如果它不在线段上,则忽略它(其中一个顶点将是该边缘上最近的点)。
答案 3 :(得分:0)
我喜欢将多边形poly与以点为中心的圆buff相交的想法,正如您在问题中所写.我会建议:
poly.boundary.intersection(buff.boundary)