ジオパンダラインポリゴンの交差


11

複数のラインが2つの異なるジオデータフレームのポリゴンと交差する場所を見つけようとしています。

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])

これは、上記のジオデータフレームは次のようになります(1つにはポリゴンがあり、もう1つには2つの線があります)。両方の線がポリゴンと交差しているように見えます。

ポリゴンとライン

ただし、交差出力は非常に混乱します。

print(line_gdf.intersects(poly_gdf))

0真

1誤り

print(line1.intersects(polygon))
print(line2.intersects(polygon))

本当

本当

なぜgeopandas intersectメソッドは標準のshapelyものに異なる出力を与えるのですか?

AnacondaでPython 3.5.3とGeopandas 0.2.1をすべて使用しています。


print(line.intersects(polygon))あなたが私が見る限りでは定義されていない変数にアクセスしていると言うとき。コードで定義しline1、それline2以前に。それがTrueを返す理由はわかりません。
Paul

2
これに対する答えも知りたいのですが。geodataframeに割り当てることができるジオメトリ列は1つだけのようです。line_gdfデータフレームが2つのジオメトリ列を追加しようとしていると思います。geopandas.org/data_structures.html#geodataframe
Paul

@Paul私の謝罪print(line.intersects(polygon))はタイプミスでした。質問を更新して、line1私が最初に何を意味していたかを示します。
bgordon 2017

@Paul 2つのジオメトリ列があると問題が発生する方法をドキュメントから確認できますが、最初に2つのジオメトリ列が追加される理由がよくわかりません。
bgordon 2017

line_gdf.infoジオメトリ列が1つしかないことを確認します。私は困惑しています。何か見つけたらフォローアップします。
ポール

回答:


7

geodataframesをGeopandasのジオメトリ操作と比較する場合、ジオメトリは最初にインデックスで照合されます。一致するインデックスがない場合(たとえば、ポリゴンが1つしかないため)、結果はになりますFalse

の各オブジェクトを比較する場合は、GeoSeries代わりにブール値の完全な長方形のデータフレームを取得する必要があり、これは非常に非効率的です。

すべての形状を比較したい場合は、2つのオプションがあります。最初の(そしておそらく最も簡単な)sjoin方法は、geopandas メソッドを使用することです。

gpd.sjoin(line_gdf, poly_gdf, op='intersects')

これは、GeoDataFrame右側のオブジェクトのインデックスを使用して、それらが右側で交差する各ジオメトリに対して繰り返される左側のデータフレーム上の各オブジェクトのジオメトリを使用して、新しいを返します。

                        geometry  index_right
0  LINESTRING (0.5 0.5, 0.7 0.7)            0
1  LINESTRING (0.9 0.9, 0.2 0.6)            0

2つ目の方法は、pandas applyメソッドを使用しGeoSeriesて、長方形のデータフレームを返すことです。

line_gdf.geometry.apply(lambda g: poly_gdf.intersects(g))

これは次のように戻ります(データフレームが大きくなるにつれて非効率が増します):

index_right     0
index_left
0            True
1            True

一般的に、正方行列が必要でない限り、私のアドバイスはsjoinメソッドに固執することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.