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 шт):

Автор решения: hedgehogues

Решение состоит в том, чтобы прочитать каждый файл по отдельности и либо не использовать 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. Первый способ довольно прост, если Вам не нужны хитрые манипуляции с данными, а лишь табличное их представление.

→ Ссылка