编程语言
首页 > 编程语言> > python – 在Shapely中查找多边形上最近点的坐标

python – 在Shapely中查找多边形上最近点的坐标

作者:互联网

说我有以下多边形和点:

>>> poly = Polygon([(0, 0), (2, 8), (14, 10), (6, 1)])
>>> point = Point(12, 4)

enter image description here

我可以计算点到多边形的距离……

>>> dist = point.distance(poly)
>>> print(dist)
2.49136439561

…但我想知道最短距离所测量的多边形边界上的点的坐标.

我最初的方法是缓冲点到多边形的距离,并找到该圆与多边形相切的点:

>>> buff = point.buffer(dist) 

enter image description here
但是,我不确定如何计算这一点.两个多边形不相交,所以list(poly.intersection(buff))不会给我这一点.

我是否在正确的轨道上?有更简单的方法吗?

解决方法:

有一种简单的方法可以依靠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]

值得一提的是,只有当您知道该点位于多边形外部之外时,此方法才有效.如果该点在其内环之一内,则需要针对该情况调整代码.

如果多边形没有内环,则代码甚至可以用于多边形内的点.这是因为我们实际上使用外环作为线串,并忽略线串是否来自多边形.

很容易将此代码扩展到计算任何点(多边形内部或外部)到多边形边界中最近点的距离的一般情况.您只需计算从点到所有线环的最近点(和距离):外环和多边形的每个内环.然后,你只保留最低限度.

enter image description here

标签:shapely,python
来源: https://codeday.me/bug/20190930/1836416.html