Многоугольник касается более чем одной точки с Shapely - PullRequest
5 голосов
/ 25 декабря 2009

У меня есть список полигонов 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: -)

Ответы [ 2 ]

7 голосов
/ 26 декабря 2009

Если вы действительно хотите проверить, имеют ли два многоугольника больше, чем 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
4 голосов
/ 25 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...