Python geo pandas - редактирование геоданных - PullRequest
0 голосов
/ 06 мая 2020

Я пытался отредактировать географические координаты c в файле формы, используя .lo c, в нужную ячейку, но каждый раз получал одну и ту же ошибку: TypeError: Value should be either a BaseGeometry or None

Я даже пытался вставить в ячейка полностью совпадала с географическими c координатами, но все равно имела ту же ошибку. В чем тут проблема?

import geopandas as gpd
fp = 'http://gis-lab.info/data/mos-adm/mo.geojson'
map_df = gpd.read_file(fp)
map_df.loc[[145],['geometry']]= 'MULTIPOLYGON (((37.2905 55.80199, 37.29542 55.803, 37.29663 55.8032, 37.29777 55.80335, 37.29864 55.80345, 37.29969 55.80352, 37.30356 55.80356, 37.30327 55.80318, 37.30292 55.80248, 37.30278 55.80127, 37.30235 55.79863, 37.29822 55.79763, 37.29447 55.79672, 37.29441 55.79679, 37.29412 55.79671, 37.29417 55.79663, 37.29321 55.79641, 37.29326 55.79806, 37.2905 55.80199)))'
map_df.plot()

1 Ответ

1 голос
/ 07 мая 2020

Геометрия в гео pandas в shapely.geometry объектах. Вместо этого вы пытаетесь передать строковое (WKT) представление, поэтому это вызывает вышеупомянутую ошибку. Сначала вам нужно преобразовать вашу строку в стройную геометрию.

from shapely.wkt import loads

string = 'MULTIPOLYGON (((37.2905 55.80199, 37.29542 55.803, 37.29663 55.8032, 37.29777 55.80335, 37.29864 55.80345, 37.29969 55.80352, 37.30356 55.80356, 37.30327 55.80318, 37.30292 55.80248, 37.30278 55.80127, 37.30235 55.79863, 37.29822 55.79763, 37.29447 55.79672, 37.29441 55.79679, 37.29412 55.79671, 37.29417 55.79663, 37.29321 55.79641, 37.29326 55.79806, 37.2905 55.80199)))'
geom = loads(string)
df.loc[145, 'geometry'] = geom

Если вы попытаетесь назначить составную геометрию, в некоторых случаях это может привести к ValueError: Must have equal len keys and value when setting with an iterable, что является известной ошибкой в ​​pandas (https://github.com/geopandas/geopandas/issues/992). Обходной путь - передача его через GeoSeries.

geom = loads(string)
df.loc[145, 'geometry'] = geopandas.GeoSeries([geom]).values
...