У меня есть такой набор данных:
Вы можете воспроизвести этот фрейм данных, загрузив следующий словарь:
{'entity_ts': {0: '2022-11-01T00:00:56.000Z', 1: '2022-11-01T00:00:56.000Z'}, 'entity_id': {0: 'WAZE.jams.1172133072', 1: 'WAZE.jams.1284082818'}, 'street': {0: 'Ac. Monsanto, Benfica', 1: nan}, 'position': {0: {'type': 'GeometryCollection', 'geometries': [{'coordinates': [[[-9.168816, 38.741779], [-9.169618, 38.741353], [-9.16976, 38.741289]]], 'type': 'MultiLineString'}]}, 1: {'type': 'GeometryCollection', 'geometries': [{'coordinates': [[[-9.16116, 38.774899], [-9.16083, 38.774697]]], 'type': 'MultiLineString'}]}}, 'level': {0: 5, 1: 5}, 'length': {0: 99, 1: 36}, 'delay': {0: -1, 1: -1}, 'speed': {0: 0.0, 1: 0.0}}
Моя проблема:
Я не мог правильно загрузить эти данные с помощью геопанд. В геопандах важно указать столбец геометрии, но этот формат столбца «положение» для меня совершенно новый.
1 - я пытался загрузить с помощью фрейма данных pandas
data=`pd.read_csv(data.csv, converters = {'position': json.loads})`
2 - Затем я преобразовал в GeoDataFrame:
import geopandas as gpd
import contextily as ctx
crs = {'init':'epsg:4326'}
gdf = gpd.GeoDataFrame(
data, geometry=data['position'], crs=crs)
Но я получил эту ошибку:
TypeError: Input must be valid geometry objects: {'type': 'GeometryCollection', 'geometries': [{'coordinates': [[[-9.168816, 38.741779], [-9.169618, 38.741353], [-9.16976, 38.741289]]], 'type': 'MultiLineString'}]}
Один из вариантов — использовать str , чтобы получить информацию о геометрии, а затем запросить форму/geoms
:
from shapely.geometry import shape
gdf = gpd.GeoDataFrame(data, geometry=data.pop("position").str["geometries"]
.explode().apply(lambda x: shape(x).geoms[0]), crs=crs)
Выход:
print(gdf)
entity_ts entity_id street level length delay speed geometry
0 2022-11-01T00:00:56.000Z WAZE.jams.1172133072 Ac. Monsanto, Benfica 5 99 -1 0.0 LINESTRING (-9.16882 38.74178, -9.16962 38.74135, -9.16976 38.74129)
1 2022-11-01T00:00:56.000Z WAZE.jams.1284082818 NaN 5 36 -1 0.0 LINESTRING (-9.16116 38.77490, -9.16083 38.77470)
# <class 'geopandas.geodataframe.GeoDataFrame'>
Большое спасибо @Timeless. Мне очень понравилось ваше решение