Geopandas 선 다각형 교차로


11

여러 선이 두 개의 다른 지리 데이터 프레임에 대한 다각형과 교차하는 위치를 찾으려고합니다.

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

위의 지리 데이터 프레임은 다음과 같습니다 (하나는 다각형이고 다른 하나는 두 개의 선이 있음). 두 선이 다각형과 교차하는 것처럼 보입니다.

다각형과 선

그러나 교차 출력은 매우 혼란 스럽습니다.

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))내가 볼 수있는 한 정의되지 않은 변수에 액세스 할 수 있습니다. 당신이 정의한 line1line2코드에서 이전. 왜 이것이 True를 반환하는지 모르겠습니다.
Paul

2
이것에 대한 답도 알고 싶습니다. 지오 데이터 프레임에는 단일 지오메트리 열만 할당 할 수있는 것 같습니다. line_gdf 데이터 프레임에 두 개의 기하학 열을 추가하려고한다고 생각합니다. 확인 geopandas.org/data_structures.html#geodataframe

@Paul 나의 사과 print(line.intersects(polygon))는 오타였습니다. line1원래 의미했던 내용을 참조하도록 질문을 업데이트했습니다 .
bgordon

@Paul 문서에서 두 개의 기하학 열이 어떻게 문제를 일으키는 지 알 수 있지만 왜 두 개의 기하학 열이 처음에 추가되는지는 잘 모르겠습니다.
bgordon

line_gdf.info단일 형상 열만 있음을 확인합니다. 나는 충격을 받았다. 찾은 내용이 있으면 연락 드리겠습니다.
Paul

답변:


7

Geopandas에서 지오 데이터 프레임과 지오메트리 작업을 비교할 때 지오메트리는 먼저 색인과 일치합니다. 일치하는 인덱스가없는 경우 (예를 들어 단일 다각형 만 있기 때문에) 결과는입니다 False.

그것이 각 객체를 비교 GeoSeries하려면 대신 부울 값의 전체 직사각형 데이터 프레임을 다시 가져와야하며 이는 매우 비효율적입니다.

모든 지오메트리를 비교하려면 두 가지 옵션이 있습니다. 첫 번째 (아마도 가장 쉬운 방법)는 geopandas sjoin방법 을 사용하는 것입니다 .

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

두 번째 방법은 사각형 데이터 프레임을 반환하는 팬더 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.