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:
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
intersect
metode ini memberikan output yang berbeda dengan yang standar shapely
?
Saya menggunakan Python 3.5.3 dan Geopandas 0.2.1 semua di Anaconda.
python
intersection
shapely
geopandas
bgordon
sumber
sumber
print(line.intersects(polygon))
Anda mengakses variabel yang tidak didefinisikan sejauh yang saya bisa lihat. Anda telah mendefinisikanline1
danline2
sebelumnya dalam kode. Saya tidak tahu mengapa itu akan mengembalikan Benar.print(line.intersects(polygon))
salah ketik. Saya telah memperbarui pertanyaan untuk merujuk padaline1
apa yang awalnya saya maksudkan.line_gdf.info
menegaskan bahwa Anda hanya memiliki satu kolom geometri. Saya bingung. Saya akan menindaklanjuti jika saya menemukan sesuatu.Jawaban:
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,
GeoSeries
Anda 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
sjoin
metode geopanda :Ini mengembalikan baru
GeoDataFrame
dengan geometri untuk setiap objek di frame data kiri diulang untuk setiap geometri yang berpotongan di sebelah kanan, dengan indeks objek di sebelah kanan, yaitu:Metode kedua adalah untuk kita panda
apply
metode padaGeoSeries
untuk mengembalikan dataframe persegi panjang:Yang pada gilirannya kembali (dengan meningkatnya inefisiensi seiring tumbuhnya dataframe):
Secara umum, kecuali Anda membutuhkan matriks kuadrat, saran saya adalah tetap berpegang pada
sjoin
metode.sumber