ジオパンダの境界ボックスでフィルタリングしますか?


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 2018年

回答:


5

問題は '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

cxgeodataframe のメソッドを使用して、境界ボックス内の行を選択できます。フレームの例:

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.