geopandas의 경계 상자로 필터링 하시겠습니까?


11

EPSG : 4326에 geopandas 데이터 프레임이 있으며 특정 경계 상자에 속하는 모든 행으로 구성된 새 데이터 프레임을 만듭니다.

먼저 관심있는 경계 상자를 얻습니다 (실제로 다른 데이터 프레임의 경계 상자입니다).

print df_sussex.total_bounds
[ -1.57239292  50.57467674   0.14528384  51.27465152]

그런 다음 해당 경계 상자로만 구성된 데이터 프레임을 만듭니다.

pts = gpd.GeoDataFrame(df_sussex.total_bounds)

마지막으로 해당 경계 상자와 교차하는 모든 기능을 얻으려고합니다.

sac_sussex = gpd.overlay(pts, df_sac, how='intersection')

그러나 이것은 나에게 준다 AttributeError: No geometry data set yet (expected in column 'geometry'.

내가 무엇을 잘못하고 있지?


문제는 'total_bounds'방법을 사용하고 있기 때문입니다. 경계 상자의 최대 및 최소 포인트가있는 튜플 만 생성합니다. 사용되는 방법은 '봉투'입니다. 이전에는 각각의 GeoDataFrame 을 빌드했습니다 .
xunilk

답변:


6

문제는 'total_bounds'방법을 사용하고 있기 때문입니다. 경계 상자의 최대 및 최소 포인트가있는 튜플 만 생성합니다. 사용되는 방법은 '봉투'입니다. 이전에는 각각 'GeoDataFrame'을 빌드했습니다. 예를 들어, 쉐이프 파일을 GeoDataFrame 으로 읽는 경우 :

import geopandas as gpd
pol1 = gpd.GeoDataFrame.from_file("pyqgis_data/polygon1.shp")
pol8 = gpd.GeoDataFrame.from_file("pyqgis_data/polygon8.shp")

pol1의 경계 상자를 만들고 각각의 GeoDataFrame을 만듭니다 .

bounding_box = pol1.envelope
df = gpd.GeoDataFrame(gpd.GeoSeries(bounding_box), columns=['geometry'])

GeoDataFrame을 교차 :

intersections = gpd.overlay(df, pol8, how='intersection')

플로팅 결과 :

from matplotlib import pyplot as plt
plt.ion()
intersections.plot() 

여기에 이미지 설명을 입력하십시오

예상대로 작동했습니다.

편집 참고 사항 :

'total_bounds'메서드를 사용하면 ( 'envelope'메서드는 다각형의 각 기능에 대한 경계 상자를 반환하기 때문에)이 방법을 사용할 수 있습니다.

from matplotlib import pyplot as plt
import geopandas as gpd
from shapely.geometry import Point, Polygon

pol1 = gpd.GeoDataFrame.from_file("pyqgis_data/polygon1.shp")
pol8 = gpd.GeoDataFrame.from_file("pyqgis_data/polygon8.shp")

bbox = pol1.total_bounds

p1 = Point(bbox[0], bbox[3])
p2 = Point(bbox[2], bbox[3])
p3 = Point(bbox[2], bbox[1])
p4 = Point(bbox[0], bbox[1])

np1 = (p1.coords.xy[0][0], p1.coords.xy[1][0])
np2 = (p2.coords.xy[0][0], p2.coords.xy[1][0])
np3 = (p3.coords.xy[0][0], p3.coords.xy[1][0])
np4 = (p4.coords.xy[0][0], p4.coords.xy[1][0])

bb_polygon = Polygon([np1, np2, np3, np4])

df2 = gpd.GeoDataFrame(gpd.GeoSeries(bb_polygon), columns=['geometry'])

intersections2 = gpd.overlay(df2, pol8, how='intersection')

plt.ion()
intersections2.plot()

결과는 동일합니다.


21

cx지오 데이터 프레임에서이 방법을 사용하여 경계 상자 내에서 행을 선택할 수 있습니다 . 예제 프레임의 경우 :

xmin, ymin, xmax, ymax = df_sussex.total_bounds
sac_sussex = df_sac.cx[xmin:xmax, ymin:ymax]

에서 http://geopandas.org/indexing.html :

GeoPandas는 표준 팬더 방법 외에도 경계 상자를 사용하여 슬라이스 하는 cx 인덱서를 사용하여 좌표 기반 인덱싱을 제공합니다 . 바운딩 박스와 교차하는 GeoSeries 또는 GeoDataFrame의 형상이 반환됩니다.


이 솔루션은 저에게 효과적이었습니다. 감사합니다. 그러나 구현하는 더 빠른 방법이 있는지 궁금합니다. OSM 토지 사용 및 주 경계 상자에 속하는 장소 필터링.
EFL

참고 .cx댄 조금 다른 뭔가 않습니다 gpd.overlay솔루션 :이 선택 행 그 반면에 경계 상자하지만 형상 그대로 잎, 교차 gpd.overlay솔루션은 경계 상자의 형상의 부품을 반환합니다. 상황에 따라 둘 중 하나를 원할 수 있습니다.
danvk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.