J'essaie de trouver où plusieurs lignes coupent un polygone pour deux géodonnées différentes:
from shapely.geometry import Polygon, LineString
import geopandas as gpd
polygon = Polygon([(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)])
line1 = LineString([(0.5, 0.5), (0.7, 0.7)])
line2 = LineString([(0.9, 0.9), (0.2, 0.6)])
poly_gdf = gpd.GeoDataFrame(geometry=[polygon])
line_gdf = gpd.GeoDataFrame(geometry=[line1, line2])
Voici à quoi ressemblent les géodonnées ci-dessus (l'une a un polygone et l'autre a deux lignes). Il me semble que les deux lignes coupent le polygone:
Cependant, la sortie d'intersection est très déroutante:
print(line_gdf.intersects(poly_gdf))
0 Vrai
1 Faux
print(line1.intersects(polygon))
print(line2.intersects(polygon))
Vrai
Vrai
Pourquoi la geopandas
intersect
méthode donne-t-elle une sortie différente de celle standard shapely
?
J'utilise Python 3.5.3 et Geopandas 0.2.1 tous sur Anaconda.
python
intersection
shapely
geopandas
bgordon
la source
la source
print(line.intersects(polygon))
que vous accédez à une variable qui n'est pas définie pour autant que je puisse voir. Vous avez définiline1
etline2
plus tôt dans le code. Je ne sais pas pourquoi cela reviendrait Vrai.print(line.intersects(polygon))
était une faute de frappe. J'ai mis à jour la question pour me référer àline1
ce que je voulais dire à l'origine.line_gdf.info
confirme que vous n'avez qu'une seule colonne de géométrie. Je suis perplexe. Je ferai un suivi si je trouve quelque chose.Réponses:
Lorsque vous comparez des géodonnées avec des opérations de géométrie dans Geopandas, les géométries sont d'abord mises en correspondance par index. Dans le cas où il n'y a pas d'index correspondant (parce que vous n'avez qu'un seul polygone par exemple), le résultat sera
False
.S'il devait comparer chaque objet dans le,
GeoSeries
vous auriez plutôt besoin de récupérer un cadre de données rectangulaire complet de valeurs booléennes, et cela serait probablement très inefficace.Si vous souhaitez comparer toutes les géométries, vous avez deux options. La première (et probablement la plus simple) consiste à utiliser la
sjoin
méthode des géopandas :Cela renvoie un nouveau
GeoDataFrame
avec les géométries pour chaque objet sur la trame de données gauche répétées pour chaque géométrie qu'ils croisent à droite, avec l'index de l'objet à droite, c'est-à-dire:La deuxième méthode est pour nous la
apply
méthode pandas sur leGeoSeries
pour retourner la trame de données rectangulaire:Qui à son tour retourne (avec une inefficacité croissante à mesure que les trames de données se développent):
En général, à moins que vous n'ayez besoin de la matrice carrée, mon conseil serait de vous en tenir à la
sjoin
méthode.la source