GeoPandas:如何为地理数据框中的每个几何体获取边界框

16

我在Python中使用GeoPandas,并拥有一个有效的多边形 GeoDataFrame。

0         POLYGON Z ((68.70999999999999 623.1 0, 35.71 6...
1         POLYGON Z ((221.33 645.02 0, 185.7 640.33 0, 1...
2         POLYGON Z ((150.3 650 0, 160.9 650 0, 150.58 6...

我想获得一个新的数据框,其中包含数据框中每一行的边界框坐标。

现在GeoPandas表现出了一些奇怪的行为。

假设我将GeoDataFrame命名为gdf,然后使用以下代码:

gdf.bounds

我遇到了对应的错误。我不知道这个错误应该是什么意思,因为我没有将任何值传递给bounds方法,它们是隐式传递的。

ValueError: Shape of passed values is (1, 110042), indices imply (4, 110042)
当我尝试使用 gdf.geometry.bounds 时,我会得到相同的 ValueError... 错误。但是,如果我这样做,我会得到有效的答案:
gdf.head(10).bounds

我理解

    minx    miny    maxx    maxy
0   0.00    618.15  68.71   650.00
1   169.56  640.33  221.33  650.00
2   150.30  648.64  160.90  650.00

所以gdfgdf.head()并没有什么不同,但是一个给了我错误,而另一个没有。 有人知道获取每行相应边界框的正确方法吗。


2
gdf.bounds 对我来说很好用(在2D中)... 你尝试更改数据集了吗? - tgrandje
2
我找到了问题所在。基本上,当“bounds”方法遇到一个空多边形时,即一个wkt为“POLYGON EMPTY”的多边形,它会崩溃并出现此错误。现在我认为“POLYGON EMPTY”是一个有效的wkt字符串,但它却给我带来了这个ValueError。因此,在我过滤掉这些空多边形之后,它就按预期工作了。 - krishnab
1
@krishnab,您能否将您上面的评论作为答案写在这个问题中,这样它就不会再显示为“未回答”了吗?谢谢! - dericke
@dericke 感谢你的提示。是的,我可以在答案中填写细节。没问题。再次感谢。 - krishnab
1个回答

2
您也可以尝试以下方法。
# remove empty geometry
valid_geom = gdf[gdf.geometry.map(lambda z: True if not z.is_empty else False)]
# get the bounds of each geometry
valid_geom.geometry.map(lambda z: z.exterior.xy)

# or in one line
gdf[gdf.geometry.map(lambda z: True if not z.is_empty else False)].geometry.map(lambda z: z.exterior.xy)


这将导致以下输出。您将获得(minx,miny,maxx,maxy)的列表。
0     ([346494.47052450513, 346512.1633455531, 34642...
1     ([347156.6195963654, 347140.5694171803, 347106...
2     ([347374.2493280142, 347343.280266067, 347331....
3     ([347752.9399173185, 347732.0804000348, 347699...
4     ([352462.7065634858, 352421.82634455897, 35239...
5     ([352398.84073305037, 352366.62657852937, 3523...
6     ([351619.2911484046, 351581.3489685701, 351559...
7     ([349298.04394918215, 349284.4299869118, 34926...
8     ([349402.6562116009, 349390.3714050767, 349364...
9     ([347447.35067824554, 347427.2888365253, 34740...
10    ([351038.9227137904, 351023.75894022046, 35101...
11    ([352360.8991716495, 352311.8060843693, 352289...
12    ([348053.8637179602, 348014.5578245763, 347995...
13    ([350854.3664365387, 350802.39711500367, 35075...
14    ([350661.291738528, 350539.01532645256, 350497...
15    ([349634.9936554617, 349617.43041924713, 34959...
16    ([346588.703008323, 346576.2541223159, 346560....
17    ([347323.7364982413, 347311.6537559405, 347289...
18    ([347592.9326738138, 347588.24603437353, 34757...
19    ([347871.4965194545, 347852.9032783319, 347846...
20    ([349503.7927385038, 349484.6946827946, 349482...
21    ([349917.505834857, 349907.19522809517, 349885...
22    ([350254.82670837734, 350243.1101097837, 35024...
dtype: object

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接