Найти координату ближайшей точки На многоугольнике Shapely
скажем, у меня есть следующий многоугольник и точка:
>>> 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))
не даст мне ссылки.
Я на правильном пути с этим? Есть ли более простой способ?
2 ответов
существует простой способ сделать это ретрансляции на 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) ближайшая точка лежит на краю и (2) ближайшая точка является вершиной. Случае (2) это легко проверить - просто взять расстояние до каждой вершины и найти минимум. Корпус (1) включает в себя немного больше математики, но все-таки не так уж плохо. Вам нужно сделать две вещи для случая (1): (a) найти, где Нормаль от точки до края пересекает край, и (b) проверить, что она находится внутри сегмента линии (в отличие от расширения за один из концов). Если это не на отрезке линии, игнорируйте его (одна из вершин будет ближайшей точкой на этом краю).