Многоугольник касается более чем в одной точке с помощью Shapely

StackOverflow https://stackoverflow.com/questions/1960961

  •  21-09-2019
  •  | 
  •  

Вопрос

У меня есть список полигонов Shapely в Python.Чтобы узнать, к какому полигону прикоснуться легко, используйте .touches() метод.Однако мне нужно что-то, что возвращает True только тогда, когда полигоны разделяют более более одной точки (другими словами, имеет общую границу).Позвольте мне проиллюстрировать:

In [1]: from shapely.geometry import Polygon
In [2]: polygons = [Polygon([(0,0),(0,1),(1,1),(1,0)]), Polygon([(1,0),(1,1),(2,1),(2,0)]), Polygon([(2,1),(2,2),(3,2),(3,1)])]

In [3]: polygons[0].touches(polygons[1])
Out[3]: True

In [4]: polygons[0].touches(polygons[2])
Out[4]: False

In [5]: polygons[1].touches(polygons[2])
Out[5]: True

В этом случае полигоны 0 и 1 имеют общие две точки (вся граница).Полигоны 1 и 2 имеют только одну общую точку.Я ищу функцию, которая даст мне True, False, False в приведенном выше примере или просто что-то, что возвращает количество точек касания, тогда остальную логику я могу выполнить сам.

И, конечно же, любое решение, которое не требует ручного перебора всех точек, является оптимальным — если мне нужно это сделать, это как бы противоречит цели использования Shapely :-)

Это было полезно?

Решение

я не использовал shapely, но пробовали ли вы посмотреть, является ли пересечение двух многоугольников линией?

Другие советы

Если вы действительно хотите проверить, имеют ли два многоугольника более x точек, вы можете просто сделать это:

p0,p1,p2 = polygons
x = 2
len(set(p1.boundary.coords).intersection(p2.boundary.coords))>=x

Но я думаю, что вам может понадобиться определить, являются ли два края коллинеарными (и перекрываются).

Эта реализация предложений Эндрю, вероятно, является тем, что вы ищете:

>>> type(p0.intersection(p1)) is geometry.LineString
True
>>> type(p1.intersection(p2)) is geometry.LineString
False
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top