ShapeFile est un format de données pour stocker des informations sur la position et la forme des données spatiales et ses informations d'attribut. Le fichier avec l'extension .shp fourni avec le téléchargement à partir des informations numériques des terres nationales, etc. est applicable.
Cette fois, le but est de lire ce ShapeFile avec Python et de le stocker dans Spatialite.
ShapeFile se compose de trois fichiers. Il existe trois fichiers: le fichier principal, le fichier d'index et le fichier d'attributs. Ces noms de fichiers seront les mêmes à l'exception de l'extension.
■ Fichier principal: counties.shp ■ Fichier d'index: counties.shx ■ Fichier d'attributs: counties.dbf
Les données spatiales sont stockées dans le fichier principal. Le fichier d'index est un index qui facilite l'accès à chaque donnée spatiale. Le fichier d'attributs stocke les valeurs d'attribut.
Veuillez vous référer à ce qui suit pour les spécifications de ces détails.
** Fiche technique du fichier Shape ** http://www.esrij.com/cgi-bin/wp/wp-content/uploads/documents/shapefile_j.pdf
Les bibliothèques suivantes doivent être utilisées pour faire fonctionner ShapeFile en Python.
https://github.com/GeospatialPython/pyshp
** Méthode d'installation ** Placez shapefile.py dans n'importe quel dossier et importez-le.
Cette bibliothèque peut être utilisée avec la série python2.4-3.x.
Dans cet exemple, exploitons N02-05-g_RailroadSection.shp des informations sur l'itinéraire ferroviaire des informations numériques terrestres nationales.
** Information numérique terrestre nationale Données ferroviaires ** 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:
#Contient des valeurs d'attribut
print ('attribute:' , sr.record)
#Type de type
#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 des points de coordonnées
print ('points:', sr.shape.points)
#Où diviser les points pour MultiLing et MultiPolygon
print ('parts:' ,sr.shape.parts)
iterShapeRecords () analyse les fichiers shp depuis le début. À ce stade, une seule donnée est étendue dans la mémoire, elle convient donc au traitement de données volumineuses.
Toutefois, iterShapeRecord suppose que l'enregistrement suivant se trouve dans l'octet suivant de la longueur de contenu enregistrée dans l'en-tête d'enregistrement. Dans de nombreux cas, cette hypothèse peut être utilisée pour l'analyse, mais dans certains cas, cette hypothèse est incorrecte. Par exemple, exécuter le A31-12_17_GML.shp suivant entraînera une erreur.
** Informations numériques sur les terres nationales Préfecture d'Ishikawa sur la zone d'inondation estimée http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-A31.html
Cela est dû au fait qu'il y a des déchets entre les enregistrements, il ne peut donc pas être analysé par le fichier shp seul, et il est nécessaire d'utiliser le fichier d'index.
Dans ce cas, il peut être implémenté sans utiliser iterShapeRecords comme indiqué ci-dessous.
# -*- 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:
#Le fichier shp des informations numériques sur les terres nationales n'est pas valide et la longueur du contenu dans le fichier shp ne correspond pas à la longueur réelle.
#Il n'y a pas d'autre choix que d'obtenir chaque enregistrement via un fichier shx
i = 0
while True:
shape = sf.shape(i)
rec = sf.record(i)
#Contient des valeurs d'attribut
print ('attribute:' , rec)
#Type de type
#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 des points de coordonnées
print ('points:', shape.points)
#Où diviser les points pour MultiLing et MultiPolygon
print ('parts:' , shape.parts)
i += 1
except IndexError:
pass
En utilisant cela, vous pouvez analyser le fichier de forme avec Python et l'importer dans spatialite.
Dans le programme suivant, les données sur les points de danger des catastrophes sédimentaires, les données sur les zones d'inondation, les données sur les rafales telles que les tornades, etc. d'informations numériques sur les terres nationales sont stockées dans la spatialite à partir du fichier Shape. https://github.com/mima3/kokudo/blob/master/kokudo_db.py
Demo http://needtec.sakura.ne.jp/kokudo/
Veuillez consulter l'article suivant pour savoir comment utiliser SPATIALITE. http://qiita.com/mima_ita/items/64f6c2b8bb47c4b5b391
Recommended Posts