Il existe de nombreux modules pour lire les fichiers de formes en Python, plus anciens que ArcPy, consultez l’ index des packages Python (PyPi): fichiers de formes . Il y a aussi beaucoup d'exemples dans GIS SE (recherche de [Python] Fiona , par exemple)
Tous peuvent lire la géométrie, les champs et les projections.
Mais d’autres modules comme PySAL: la bibliothèque d’analyses spatiales Python , Cartopy (qui utilisent pyshp ) ou Matplotlib Basemap peuvent également lire des fichiers de formes, entre autres.
Le plus simple à utiliser est Fiona , mais si vous ne connaissez que ArcPy, utilisez pyshp , car osgeo et Fiona exigent l’ installation de la bibliothèque GDAL C / C ++, GeoPandas nécessite le module Pandas et PySAL est trop volumineux (beaucoup d’autres traitements).
Si vous souhaitez uniquement lire le contenu d'un fichier de formes, vous n'avez pas besoin de choses complexes, utilisez simplement le protocole d' interface géographique (GeoJSON) également implémenté dans ArcPy ( ArcPy: AsShape ).
Avec Fiona (en tant que dictionnaires Python):
import fiona
with fiona.open('a_shape.shp') as shp:
# schema of the shapefile
print shp.schema
{'geometry': 'Point', 'properties': OrderedDict([(u'DIP', 'int:2'), (u'DIP_DIR', 'int:3'), (u'TYPE', 'str:10')])}
# projection
print shp.crs
{u'lon_0': 4.367486666666666, u'ellps': u'intl', u'y_0': 5400088.438, u'no_defs': True, u'proj': u'lcc', u'x_0': 150000.013, u'units': u'm', u'lat_2': 49.8333339, u'lat_1': 51.16666723333333, u'lat_0': 90}
for feature in shp:
print feature
{'geometry': {'type': 'Point', 'coordinates': (272070.600041, 155389.38792)}, 'type': 'Feature', 'id': '0', 'properties': OrderedDict([(u'DIP', 30), (u'DIP_DIR', 130), (u'TYPE', u'incl')])}
{'geometry': {'type': 'Point', 'coordinates': (271066.032148, 154475.631377)}, 'type': 'Feature', 'id': '1', 'properties': OrderedDict([(u'DIP', 55), (u'DIP_DIR', 145), (u'TYPE', u'incl')])}
{'geometry': {'type': 'Point', 'coordinates': (273481.498868, 153923.492988)}, 'type': 'Feature', 'id': '2', 'properties': OrderedDict([(u'DIP', 40), (u'DIP_DIR', 155), (u'TYPE', u'incl')])}
Avec pyshp (sous forme de dictionnaires Python)
import shapefile
reader= shapefile.Reader("a_shape.shp")
# schema of the shapefile
print dict((d[0],d[1:]) for d in reader.fields[1:])
{'DIP_DIR': ['N', 3, 0], 'DIP': ['N', 2, 0], 'TYPE': ['C', 10, 0]}
fields = [field[0] for field in reader.fields[1:]]
for feature in reader.shapeRecords():
geom = feature.shape.__geo_interface__
atr = dict(zip(fields, feature.record))
print geom, atr
{'type': 'Point', 'coordinates': (272070.600041, 155389.38792)} {'DIP_DIR': 130, 'DIP': 30, 'TYPE': 'incl'}
{'type': 'Point', 'coordinates': (271066.032148, 154475.631377)} {'DIP_DIR': 145, 'DIP': 55, 'TYPE': 'incl'}
{'type': 'Point', 'coordinates': (273481.498868, 153923.492988)} {'DIP_DIR': 155, 'DIP': 40, 'TYPE': 'incl'}
Avec osgeo / ogr (sous forme de dictionnaires Python)
from osgeo import ogr
reader = ogr.Open("a_shape.shp")
layer = reader.GetLayer(0)
for i in range(layer.GetFeatureCount()):
feature = layer.GetFeature(i)
print feature.ExportToJson()
{"geometry": {"type": "Point", "coordinates": [272070.60004, 155389.38792]}, "type": "Feature", "properties": {"DIP_DIR": 130, "DIP": 30, "TYPE": "incl"}, "id": 0}
{"geometry": {"type": "Point", "coordinates": [271066.032148, 154475.631377]}, "type": "Feature", "properties": {"DIP_DIR": 145, "DIP": 55, "TYPE": "incl"}, "id": 1}
{"geometry": {"type": "Point", "coordinates": [273481.49887, 153923.492988]}, "type": "Feature", "properties": {"DIP_DIR": 155, "DIP": 40, "TYPE": "incl"}, "id": 2}
Avec GeoPandas (en tant que cadre de données Pandas)
import geopandas as gp
shp = gp.GeoDataFrame.from_file('a_shape.shp')
print shp
DIP_DIR DIP TYPE geometry
0 130 30 incl POINT (272070.600041 155389.38792)
1 145 55 incl POINT (271066.032148 154475.631377)
2 155 40 incl POINT (273481.498868 153923.492988)
* note sur les géopandas Vous devez utiliser les anciennes versions de Fiona et GDAL avec celle-ci, sinon l'installation ne s'installera pas. GDAL: 1.11.2 Fiona: 1.6.0 Géopandas: 0.1.0.dev-
Il existe de nombreux tutoriels sur le Web et même des livres ( développement géospatial Python , apprentissage de l'analyse géospatiale avec Python et géotraitement avec Python , sous presse).
Plus généralement, si vous souhaitez utiliser Python sans ArcPy, reportez-vous à la rubrique Mappage thématique simple du fichier de formes à l'aide de Python?