Shapefile direkt aus ZIP mit pyshp lesen
Problem
Du hast eine ZIP-Datei, die eine einzelne ESRI-Shapefile-Datenbank enthält (d.h. drei Dateien), beispielsweise die Natural Earth Countries-Datenbank. Ohne die ZIP-Datei zu entpacken, möchtest du pyshp verwenden, um die im Shapefile enthaltenen Daten zu lesen.
Lösung
Diese Lösung funktioniert derzeit nur mit dem korrekten Branch von meinem Fork. Ich habe einen Pull Request eingereicht und werde diesen Beitrag aktualisieren, sobald er gemergt und veröffentlicht wurde.
Installiere zunächst UliEngineering.
Wie sich herausstellt, ist es komplexer (in Bezug auf Codezeilen), den Präfix des Shapefiles zu finden, als das Shapefile tatsächlich zu lesen. Glücklicherweise bietet UliEngineering find_datasets_by_extension() und read_from_zip(), um diesen Prozess zu vereinfachen.
from UliEngineering.Utils.Files import *
from UliEngineering.Utils.ZIP import *
import shapefile
# Dateien im ZIP auflisten
zipcontents = list(list_zip("ne_110m_admin_0_countries.zip"))
# Finde einen Dateinamen, der mit ".shp", ".dbf" und ".prj"-Erweiterungen vorhanden ist
dataset_filenames = list(find_datasets_by_extension(zipcontents, (".shp", ".dbf", ".prj")))
# Dateien lesen (in den Speicher kopieren)
dataset = read_from_zip("ne_110m_admin_0_countries.zip", dataset_filenames[0])
# Shapefile-Format lesen
reader = shapefile.Reader(shp=dataset[0], dbf=dataset[1], prj=dataset[2])
# Nützliches mit dem Reader an