Попытка назначить два многоугольных элемента из мультиполигона в столбец геометрии geo pandas вызывает ValueError - PullRequest
0 голосов
/ 14 января 2020

Я использую встроенную карту мира geo pandas. Я пытаюсь отделить Французскую Гвиану от геометрии Франции и создать новую запись для Французской Гвианы (что я успешно сделал). Однако, когда я возвращаю сокращенный мультиполигон из Франции и Корсики обратно в ячейку France geometry, я получаю ошибку.

world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))

# Remove French Guiana (shape[0])
shape = world[world['name'] == 'France']['geometry'].all()

fr_shape = shape[2] # This works creating a POLYGON but drops Corsica :( 
world.at[world['name'] == 'France', 'geometry'] = fr_shape

fr_shape = shape[1:] # This creates a MULTIPOLYGON then throws an ValueError.
world.at[world['name'] == 'France', 'geometry'] = fr_shape

> ValueError: Must have equal len keys and value when setting with an iterable

Здесь аналогичная проблема: Geo pandas установить геометрию: ValueError для MultiPolygon "равные ключи и значение"

Однако, как я Я пытаюсь извлечь два из трех элементов мультиполигона и переназначить, мне кажется, что это другая проблема, так как другой является прямой копией одного кадра данных в другой без манипуляций. Попытка различных вариантов решения .values до настоящего времени не увенчалась успехом.

Любые предложения приветствуются. Спасибо.

1 Ответ

0 голосов
/ 14 января 2020

ОК - мне удалось найти обходной путь. Это не красиво и заслуживает того, чтобы быть отвергнутым, когда есть реальное исправление (или лучший ответ!), Но это работает пока:)

import pandas as pd
import geopandas as gpd

world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))

# Remove French Guiana from France.
shape = world[world['name'] == 'France']['geometry'].all()

# Multipolygon ValueError Workaround.
fr_df = pd.Series(['France', 'France'], name='country')
fr_df = gpd.GeoDataFrame(fr_df, geometry=[shape[1], shape[2]])
fr_df = fr_df.dissolve(by='country')
world.at[world['name'] == 'France', 'geometry'] = fr_df['geometry'].values                     

world.plot()
...