Многоугольник касается более чем в одной точке с помощью Shapely
Вопрос
У меня есть список полигонов 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