Ответ 1
Существует простой способ сделать это ретрансляцию на стройных функциях. Во-первых, вам нужно получить внешнее кольцо многоугольника и спроектировать укажите на кольцо. Обязательно получить внешний вид как 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]
Важно отметить, что этот метод работает, только если вы знаете точка находится за пределами полигона. Если точка находится внутри одной его внутренних колец вам нужно адаптировать код для этой ситуации.
Если многоугольник не имеет внутренних колец, код будет работать даже для точек внутри многоугольника. Это потому, что мы на самом деле работаем с внешним кольцом в виде строки и игнорируем, является ли строка строки из многоугольника или нет.
Проще всего распространить этот код на общий случай вычисления расстояния любой точки (внутри или вне многоугольника) до ближайшей точки на границе многоугольника. Вам нужно всего лишь вычислить ближайшую точку (и расстояние) от точки до всех линейных колец: внешнее кольцо и каждое внутреннее кольцо многоугольника. Затем вы просто сохраняете минимум.