Polygon touche à plus d'un point avec Shapely
Question
J'ai une liste de polygones galbées en Python. Pour savoir quel contact polygone est facile, en utilisant la méthode de .touches()
. Cependant, je besoin de quelque chose qui retourne True
que lorsque les polygones partagent plus d'un point (autrement dit partage une frontière). Permettez-moi d'illustrer:
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
Dans ce cas, polygone 0 et 1 part de deux points (une frontière entière). Polygone 1 et 2 parts d'un seul point. Ce que je suis à la recherche est une fonction qui me donnerait True
, False
, False
dans l'exemple ci-dessus ou juste quelque chose qui retourne le nombre de points touchant, alors je peux faire le reste de moi-même logique.
Et bien sûr, toute solution qui n'implique pas itérer manuellement par tous les points est optimal - si je dois le faire, il va à l'encontre de l'objectif genre d'utilisation Shapely: -)
La solution
Je ne l'ai pas utilisé bien faite, mais avez-vous essayé de voir si l'intersection des deux polygones est une ligne?
Autres conseils
Si vous voulez vraiment vérifier si deux polygones partagent plus que le nombre x de points, vous pouvez simplement faire ceci:
p0,p1,p2 = polygons
x = 2
len(set(p1.boundary.coords).intersection(p2.boundary.coords))>=x
Mais je pense que ce que vous voudrez peut-être est de déterminer si deux bords sont colinéaires (et le chevauchement).
Cette mise en œuvre des suggestions d'Andrew est probablement ce que vous cherchez:
>>> type(p0.intersection(p1)) is geometry.LineString
True
>>> type(p1.intersection(p2)) is geometry.LineString
False