ShapeFile ist ein Datenformat zum Speichern von Informationen über die Position und Form von Geodaten und deren Attributinformationen. Es gilt die Datei mit der Erweiterung .shp, die mit dem Download von den nationalen Landnummerninformationen usw. geliefert wird.
Dieses Mal ist das Ziel, diese ShapeFile mit Python zu lesen und in Spatialite zu speichern.
ShapeFile besteht aus drei Dateien. Es gibt drei Dateien: Hauptdatei, Indexdatei und Attributdatei. Diese Dateinamen sind bis auf die Erweiterung identisch.
■ Hauptdatei: Counties.shp ■ Indexdatei: Counties.shx ■ Attributdatei: Counties.dbf
Geodaten werden in der Hauptdatei gespeichert. Die Indexdatei ist ein Index, der den Zugriff auf alle räumlichen Daten erleichtert. In der Attributdatei werden die Attributwerte gespeichert.
Die technischen Daten dieser Details finden Sie im Folgenden.
** Technische Informationen zur Formdatei ** http://www.esrij.com/cgi-bin/wp/wp-content/uploads/documents/shapefile_j.pdf
Die folgenden Bibliotheken sollten verwendet werden, um ShapeFile in Python zu betreiben.
https://github.com/GeospatialPython/pyshp
** Installationsmethode ** Platzieren Sie shapefile.py in einem beliebigen Ordner und importieren Sie es.
Diese Bibliothek kann mit python2.4-3.x-Serien verwendet werden.
In diesem Beispiel betreiben wir N02-05-g_RailroadSection.shp der Eisenbahnstreckeninformationen der nationalen Landnummerninformationen.
** Nationale Landnummerninformationen Eisenbahndaten ** http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N02-v2_2.html
# -*- coding: utf-8 -*-
import os
import sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/pyshp')
import shapefile
sf = shapefile.Reader('original_data\\N02-05_GML\\N02-05\\N02-05-g_RailroadSection.shp')
shapeRecs = sf.iterShapeRecords()
for sr in shapeRecs:
#Enthält Attributwerte
print ('attribute:' , sr.record)
#Art des Typs
#NULL = 0
#POINT = 1
#POLYLINE = 3
#POLYGON = 5
#MULTIPOINT = 8
#POINTZ = 11
#POLYLINEZ = 13
#POLYGONZ = 15
#MULTIPOINTZ = 18
#POINTM = 21
#POLYLINEM = 23
#POLYGONM = 25
#MULTIPOINTM = 28
#MULTIPATCH = 31
print ('shapeType:' ,sr.shape.shapeType)
#Liste der Koordinatenpunkte
print ('points:', sr.shape.points)
#Wo kann man Punkte für MultiLing und MultiPolygon teilen?
print ('parts:' ,sr.shape.parts)
iterShapeRecords () analysiert shp-Dateien von Anfang an. Zu diesem Zeitpunkt wird nur ein Datenbestand im Speicher erweitert, sodass er für die Verarbeitung großer Datenmengen geeignet ist.
IterShapeRecord geht jedoch davon aus, dass sich der nächste Datensatz im nächsten Byte der im Datensatzheader aufgezeichneten Inhaltslänge befindet. In vielen Fällen kann diese Annahme zur Analyse verwendet werden, in einigen Fällen ist diese Annahme jedoch falsch. Das Ausführen der folgenden Datei A31-12_17_GML.shp führt beispielsweise zu einem Fehler.
** Nationale numerische Landinformationen Präfektur Ishikawa des geschätzten Überschwemmungsgebiets ** http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-A31.html
Dies liegt daran, dass sich zwischen den Datensätzen Müll befindet, sodass er nicht allein von der shp-Datei analysiert werden kann und die Indexdatei verwendet werden muss.
In diesem Fall kann es ohne Verwendung von iterShapeRecords implementiert werden, wie unten gezeigt.
# -*- coding: utf-8 -*-
import os
import sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/pyshp')
import shapefile
sf = shapefile.Reader('original_data\\A31-12\\output\\A31-12_17_GML\\old\\A31-12_17.shp')
try:
#Die shp-Datei der nationalen Landnummerninformationen ist ungültig, und die Inhaltslänge in der shp-Datei stimmt nicht mit der tatsächlichen Länge überein.
#Es bleibt keine andere Wahl, als jeden Datensatz über eine shx-Datei abzurufen
i = 0
while True:
shape = sf.shape(i)
rec = sf.record(i)
#Enthält Attributwerte
print ('attribute:' , rec)
#Art des Typs
#NULL = 0
#POINT = 1
#POLYLINE = 3
#POLYGON = 5
#MULTIPOINT = 8
#POINTZ = 11
#POLYLINEZ = 13
#POLYGONZ = 15
#MULTIPOINTZ = 18
#POINTM = 21
#POLYLINEM = 23
#POLYGONM = 25
#MULTIPOINTM = 28
#MULTIPATCH = 31
print ('shapeType:' ,shape.shapeType)
#Liste der Koordinatenpunkte
print ('points:', shape.points)
#Wo kann man Punkte für MultiLing und MultiPolygon teilen?
print ('parts:' , shape.parts)
i += 1
except IndexError:
pass
Auf diese Weise können Sie die Formdatei mit Python analysieren und in Spatialite importieren.
Im folgenden Programm werden Sedimentkatastrophen-Gefahrenpunktdaten, Überschwemmungsgebietsdaten, Böendaten wie Tornados usw. von numerischen Landinformationen in Spatialit aus der Formdatei gespeichert. https://github.com/mima3/kokudo/blob/master/kokudo_db.py
Demo http://needtec.sakura.ne.jp/kokudo/
Informationen zur Verwendung von SPATIALITE finden Sie im folgenden Artikel. http://qiita.com/mima_ita/items/64f6c2b8bb47c4b5b391