Giao lộ đa tuyến đường Geopandas


11

Tôi đang cố gắng tìm nơi nhiều đường cắt nhau một đa giác cho hai geodataframes khác nhau:

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

Đây là những gì các geodataframes ở trên trông giống như (một cái có đa giác và cái kia có hai dòng). Dường như với tôi như thể cả hai dòng giao nhau với đa giác:

Đa giác và đường thẳng

Tuy nhiên, đầu ra giao nhau rất khó hiểu:

print(line_gdf.intersects(poly_gdf))

0 Đúng

1 sai

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

Thật

Thật

Tại sao geopandas intersectphương thức đưa ra một đầu ra khác với tiêu chuẩn shapely?

Tôi đang sử dụng Python 3.5.3 và Geopandas 0.2.1 tất cả trên Anaconda.


Khi bạn nói rằng print(line.intersects(polygon))bạn truy cập vào một biến không được xác định xa như tôi có thể thấy. Bạn đã xác định line1line2sớm hơn trong mã. Tôi không biết tại sao điều đó sẽ trở lại đúng.
Paul

2
Tôi cũng muốn biết câu trả lời cho điều này. Có vẻ như bạn chỉ có thể gán một cột hình học duy nhất cho khung địa lý. Tôi nghĩ khung dữ liệu line_gdf của bạn cố gắng thêm hai cột hình học. Hãy xem geopandas.org/data_strucenses.html#geodataframe
Paul

@Paul lời xin lỗi của tôi, print(line.intersects(polygon))là một lỗi đánh máy. Tôi đã cập nhật câu hỏi để đề cập đến line1ý nghĩa ban đầu của tôi.
bgordon

@Paul Tôi có thể thấy trong tài liệu về việc có hai cột hình học sẽ gây ra sự cố như thế nào, nhưng tôi không chắc tại sao hai cột hình học sẽ được thêm vào ở vị trí đầu tiên.
bgordon

line_gdf.infoxác nhận rằng bạn chỉ có một cột hình học duy nhất. Tôi bối rối. Tôi sẽ theo dõi nếu tôi tìm thấy bất cứ điều gì.
Paul

Câu trả lời:


7

Khi so sánh geodataframes với các hoạt động hình học trong Geopandas, hình học đầu tiên được khớp bởi chỉ số. Trong trường hợp không có chỉ số phù hợp (vì bạn chỉ có một đa giác duy nhất) thì kết quả sẽ là False.

Nếu đó là để so sánh từng đối tượng trong thì GeoSeriesbạn cần phải lấy lại một khung dữ liệu hình chữ nhật đầy đủ của các giá trị boolean, và điều này có thể sẽ rất không hiệu quả.

Nếu bạn muốn so sánh tất cả các hình học thì bạn có hai lựa chọn. Cách đầu tiên (và có lẽ là dễ nhất) là sử dụng sjoinphương pháp geopandas :

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

Điều này trả về một cái mới GeoDataFramevới hình học cho từng đối tượng trên khung dữ liệu bên trái được lặp lại cho mỗi hình học mà chúng giao nhau ở bên phải, với chỉ mục của đối tượng ở bên phải, nghĩa là:

                        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

Phương pháp thứ hai là cho chúng ta applyphương thức gấu trúc trên GeoSeriesđể trả về khung dữ liệu hình chữ nhật:

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

Lần lượt trả về (với sự kém hiệu quả khi các datafram phát triển):

index_right     0
index_left
0            True
1            True

Nói chung, trừ khi bạn cần ma trận vuông, lời khuyên của tôi sẽ là bám sát sjoinphương pháp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.