shape-файлы. Прочтение с помощью geopandas
Каким образом прочитать shape-файл с помощью geopandas? Поблема в том, что если я работаю НЕ с production-ready кодом, то всё очень просто. У нас есть несколько файлов на диске
*.cpg
*.dbf
*.prj
*.shp
*.shx
Далее, мы делаем так:
gpd.read_file('*.shp')
И geopandas сам подхватывает все нужные файлы. Здесь проявляется плохая архитектура этой библиотеки, что делает её сложной в использовании. Т.е. я не могу сказать, какие файлы и откуда читать. А если это не файлы, а io.StringIO, тогда сделать нельзя вообще ничего.
Иными словами, если мой shape-файл лежит удалённо, или я как-то получаю его и не хочу, чтобы он записывался на диск, мне хотлось бы поступить так:
with open('1.shp', 'wb') as fd:
fd.write(resp)
df = gpd.read_file(fd)
Но так как помимо одного файла есть ещё несколько, geopandas выдаёт следующее:
fiona.errors.DriverError: Unable to open 1.shx or 1.SHX. Set SHAPE_RESTORE_SHX config option to YES to restore or create it.
Как решить эту проблему?
Ответы (1 шт):
Решение состоит в том, чтобы прочитать каждый файл по отдельности и либо не использовать geopandas вообще. Либо передавать туда данные уже подготовленные:
В примере по ссылке, каждый shape-файл прочитывается дополнительной библиотекой:
dbf, prj, shp, shx = [StringIO(zipfile.read(filename)) for filename in filenames]
r = shapefile.Reader(shp=shp, shx=shx, dbf=dbf)
print r.numRecords
После этого, можно воспользоваться либо объектом r и конфигурировать его руками, либо поступить так, как указано в примере и передать всё в geopandas. Первый способ довольно прост, если Вам не нужны хитрые манипуляции с данными, а лишь табличное их представление.