通过地理箱中的边界框进行过滤?


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

Answers:


6

问题是因为您使用的是“ total_bounds”方法。它仅生成具有最大和最小边界框的元组。使用的方法是“信封”;之前建立其各自的“ GeoDataFrame”。例如,将我的shapefile读取为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

除了标准的pandas方法外,GeoPandas还使用cx索引器提供基于坐标的索引,该索引器使用边界框进行切片。将返回与边界框相交的GeoSeries或GeoDataFrame中的几何。


这个解决方案对我有用。谢谢。但是,我想知道是否有更快的实施方法。筛选OSM的土地用途和省范围内的地点。
EFL

请注意,.cx这样做的结果与gpd.overlay解决方案略有不同:它选择与边界框相交的行,但保留几何形状不变,而gpd.overlay解决方案将只返回边界框中的几何形状部分。根据情况,您可能需要其中一个。
danvk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.