#python #geopandas #fiona
#python #геопанды #фиона
Вопрос:
Я обрабатываю shp-файлы, и у меня возникают проблемы с сохранением фрейма геоданных в shp-файле.
import pandas as pd
import numpy as np
import os
import geopandas
location = '/home/braulio/Documents/example.shp'
datos = geopandas.read_file(location, encoding='UTF-8')
У меня нет проблем с обработкой данных, но когда я пытаюсь сохранить
A.to_file(r"/home/braulio/Documents/example2.shp")
и возвращает ошибку:
ValueError Traceback (most recent call last)
<ipython-input-23-6a842789b4b4> in <module>
----> 1 A.to_file(r"/home/braulio/Documents/example2.shp")
~/anaconda3/envs/braulio/lib/python3.7/site- packages/geopandas/geodataframe.py in to_file(self, filename, driver, schema, **kwargs)
411 """
412 from geopandas.io.file import to_file
--> 413 to_file(self, filename, driver, schema, **kwargs)
414
415 def to_crs(self, crs=None, epsg=None, inplace=False):
~/anaconda3/envs/braulio/lib/python3.7/site-packages/geopandas/io/file.py in to_file(df, filename, driver, schema,**kwargs)
109 with fiona.open(filename, 'w', driver=driver, crs=df.crs,
110 schema=schema, **kwargs) as colxn:
--> 111 colxn.writerecords(df.iterfeatures())
112
113
~/anaconda3/envs/braulio/lib/python3.7/site-packages/fiona/collection.py in writerecords(self, records)
347 if self.mode not in ('a', 'w'):
348 raise IOError("collection not open for writing")
--> 349 self.session.writerecs(records, self)
350 self._len = self.session.get_length()
351 self._bounds = self.session.get_extent()
fiona/ogrext.pyx in fiona.ogrext.WritingSession.writerecs()
fiona/ogrext.pyx in fiona.ogrext.OGRFeatureBuilder.build()
ValueError: Invalid field type <class 'bytes'>
Комментарии:
1. Что вы делаете со своими данными? У вас такая же проблема с сохранением фрейма данных datos сразу после его чтения? Похоже, вы пытаетесь сохранить какой-то тип данных, не поддерживаемый шейп-файлом.
2. В вашем geodataframe есть столбец с недопустимым dtype (типом данных). Похоже, что dtype
bytes
не может быть обработан geopandas или записан в шейп-файлы. Проверьте dtype ваших столбцов и удалите или преобразуйте этот столбец. Вы можете погуглить «проверить столбцы фрейма данных dype», чтобы получить инструкции о том, как это сделать.3. После того, как я проверил dtype для столбца dataframe, все столбцы были типа object. Я удаляю один столбец моего shp и просто работаю, но я действительно не понимаю, что произошло.
Ответ №1:
‘байты’ и некоторые другие типы, такие как ‘список’, не являются поддерживаемыми типами данных для шейп-файлов. Вот ссылка на выпуск github, в котором обсуждается эта проблема.
Я бы рекомендовал удалить столбец, содержащий объекты типа ‘bytes’, а затем сохранить шейп-файл.
Если этот столбец действительно важен, измените значение на тип ‘string’, а затем сохраните шейп-файл.
Ответ №2:
Я решаю проблему, меняя кодировку на latin-1 в начале
datos = geopandas.read_file(location, encoding='latin1')
Ответ №3:
В моем случае сработало следующее («Ошибка значения: недопустимый тип поля <класс ‘numpy.int64’>»), надеюсь, это поможет:
A = A.apply(pd.to_numeric, errors='ignore')
A = gpd.GeoDataFrame(A) # optional
A.set_geometry(col='geometry', inplace=True) # optional
A.to_file(path)