Persimpangan Poligon Garis Geopandas

11

Saya mencoba menemukan di mana beberapa garis berpotongan poligon untuk dua geodataframe yang berbeda:

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

Beginilah bentuk geodataframe di atas (satu memiliki poligon dan lainnya memiliki dua baris). Tampaknya bagi saya seolah kedua garis memotong poligon:

Poligon dan Garis

Namun, output intersect sangat membingungkan:

print(line_gdf.intersects(poly_gdf))

0 Benar

1 salah

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

Benar

Benar

Mengapa geopandas intersectmetode ini memberikan output yang berbeda dengan yang standar shapely?

Saya menggunakan Python 3.5.3 dan Geopandas 0.2.1 semua di Anaconda.

bgordon
sumber
Ketika Anda mengatakan print(line.intersects(polygon))Anda mengakses variabel yang tidak didefinisikan sejauh yang saya bisa lihat. Anda telah mendefinisikan line1dan line2sebelumnya dalam kode. Saya tidak tahu mengapa itu akan mengembalikan Benar.
Paul
2
Saya juga ingin tahu jawabannya. Tampaknya Anda hanya dapat menetapkan satu kolom geometri ke bingkai geodata. Saya pikir bingkai data line_gdf Anda mencoba menambahkan dua kolom geometri. Lihat geopandas.org/data_structures.html#geodataframe
Paul
@ Paul permintaan maaf saya, print(line.intersects(polygon))salah ketik. Saya telah memperbarui pertanyaan untuk merujuk pada line1apa yang awalnya saya maksudkan.
bgordon
@ Paul Saya bisa melihat dari dokumentasi bagaimana memiliki dua kolom geometri akan menyebabkan masalah, tapi saya tidak yakin mengapa dua kolom geometri akan ditambahkan di tempat pertama.
bgordon
line_gdf.infomenegaskan bahwa Anda hanya memiliki satu kolom geometri. Saya bingung. Saya akan menindaklanjuti jika saya menemukan sesuatu.
Paul

Jawaban:

7

Saat membandingkan geodataframe dengan operasi geometri di Geopanda, geometri pertama kali dicocokkan dengan indeks. Jika tidak ada indeks yang cocok (karena Anda hanya memiliki satu poligon misalnya) maka hasilnya akan menjadi False.

Jika membandingkan masing-masing objek di dalam, GeoSeriesAnda akan perlu untuk kembali dataframe persegi panjang penuh dari nilai boolean, dan ini kemungkinan akan sangat tidak efisien.

Jika Anda ingin membandingkan semua geometri maka Anda memiliki dua opsi. Yang pertama (dan mungkin paling mudah) adalah menggunakan sjoinmetode geopanda :

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

Ini mengembalikan baru GeoDataFramedengan geometri untuk setiap objek di frame data kiri diulang untuk setiap geometri yang berpotongan di sebelah kanan, dengan indeks objek di sebelah kanan, yaitu:

                        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

Metode kedua adalah untuk kita panda applymetode pada GeoSeriesuntuk mengembalikan dataframe persegi panjang:

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

Yang pada gilirannya kembali (dengan meningkatnya inefisiensi seiring tumbuhnya dataframe):

index_right     0
index_left
0            True
1            True

Secara umum, kecuali Anda membutuhkan matriks kuadrat, saran saya adalah tetap berpegang pada sjoinmetode.

om_henners
sumber