GeoPandas: как получить ограничивающие рамки для каждой геометрии в кадре геоданных

Я использую GeoPandas в python и имею действующий 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

Итак, gdf и gdf.head() ничем не отличаются, но один дает мне ошибку, а другой нет. Кто-нибудь знает, как правильно получить ограничивающие прямоугольники, соответствующие каждой строке.


person krishnab    schedule 20.04.2018    source источник
comment
gdf.bounds у меня отлично работает (в 2D) ... Вы пытались изменить свой набор данных?   -  person tgrandje    schedule 02.05.2018
comment
Я разобрался в проблеме. Итак, в основном, когда метод bounds обнаруживает пустой многоугольник, то есть многоугольник win wkt POLYGON EMPTY, тогда он вылетает с этой ошибкой. Теперь я думаю, что POLYGON EMPTY - допустимая строка wkt, но она давала мне эту ValueError. Итак, после того, как я отфильтровал эти пустые полигоны, все заработало, как и ожидалось.   -  person krishnab    schedule 03.05.2018
comment
@krishnab, не могли бы вы написать свой комментарий выше в качестве ответа на этот вопрос, чтобы он больше не оставался без ответа? Спасибо!   -  person dericke    schedule 12.11.2020
comment
@dericke спасибо за подсказку. Да, я могу заполнить детали в ответе. Без проблем. Спасибо еще раз.   -  person krishnab    schedule 12.11.2020


Ответы (1)


Вы также можете попробовать следующее

# 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
person Aman Bagrecha    schedule 27.05.2021