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


person XerXes    schedule 25.12.2009    source источник
comment
совместное использование двух точек не эквивалентно разделению границы - это верно только в том случае, если точки являются смежными на обоих полигонах.   -  person andrew cooke    schedule 25.12.2009
comment
@andrew Cooke: Хорошее замечание. Я должен это учитывать.   -  person XerXes    schedule 26.12.2009


Ответы (2)


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

person andrew cooke    schedule 25.12.2009

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

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
person Paul    schedule 25.12.2009
comment
Спасибо :-) Я вычел это из сообщения Эндрю, но не смог ответить. Но все равно спасибо большое :-) - person XerXes; 26.12.2009
comment
Просто для записи (это может помочь кому-то другому): он должен проверять геометрию.MultiLineString, а не геометрию.LineString - person XerXes; 31.12.2009