Comment lire un fichier de formes en Python?

23

Ma question est une extension des lignes verticales dans un fichier de formes polygonales . Veuillez d'abord vous référer à cette question.

Ce que vous verrez est une méthode de génération de lignes verticales par rapport au cadre de sélection, à un espacement défini par l'utilisateur. Je comprends que OGR, Fiona, Shapely, etc. peuvent être utilisés pour effectuer la prochaine étape de découpage, mais je ne comprends pas leur utilisation.

Comment lire une ligne d'un fichier de formes polygonales? Chaque application qui utilise Shapely montre comment générer le LineString, le Point ou le Polygone mais ne jamais lire un fichier de formes existant

Veuillez m'aider avec au moins une structure squelettique afin que je puisse en tirer parti.

Akhil
la source

Réponses:

40

1) lisez votre shapefile avec Fiona , PyShp , ogr ou ... en utilisant le protocole geo_interface (GeoJSON):

avec Fiona

import fiona
shape = fiona.open("my_shapefile.shp")
print shape.schema
{'geometry': 'LineString', 'properties': OrderedDict([(u'FID', 'float:11')])}
#first feature of the shapefile
first = shape.next()
print first # (GeoJSON format)
{'geometry': {'type': 'LineString', 'coordinates': [(0.0, 0.0), (25.0, 10.0), (50.0, 50.0)]}, 'type': 'Feature', 'id': '0', 'properties': OrderedDict([(u'FID', 0.0)])}

avec PyShp

import shapefile
shape = shapefile.Reader("my_shapefile.shp")
#first feature of the shapefile
feature = shape.shapeRecords()[0]
first = feature.shape.__geo_interface__  
print first # (GeoJSON format)
{'type': 'LineString', 'coordinates': ((0.0, 0.0), (25.0, 10.0), (50.0, 50.0))}

avec ogr:

from osgeo import ogr
file = ogr.Open("my_shapefile.shp")
shape = file.GetLayer(0)
#first feature of the shapefile
feature = shape.GetFeature(0)
first = feature.ExportToJson()
print first # (GeoJSON format)
{"geometry": {"type": "LineString", "coordinates": [[0.0, 0.0], [25.0, 10.0], [50.0, 50.0]]}, "type": "Feature", "properties": {"FID": 0.0}, "id": 0}

2) conversion en géométrie galbée (avec la fonction de forme )

# now use the shape function of Shapely
from shapely.geometry import shape
shp_geom = shape(first['geometry']) # or shp_geom = shape(first) with PyShp)
print shp_geom
LINESTRING (0 0, 25 10, 50 50)
print type(shp_geom)
<class 'shapely.geometry.linestring.LineString'>

3) calculs

4) enregistrer le fichier de formes résultant

gène
la source
5
J'ajouterais des géopandas à la liste:geopandas.read_file("my_shapefile.shp")
joris
À partir de GDAL 2.0, au lieu de osgeo.ogr.Open, utilisez osgeo.gdal.OpenEx( détails ).
Kevin
1
avec ogr, j'ai d'abord dû définir le json comme un json pour pouvoir le traiter davantage avec galbée: 'first = json.loads (first)'
Leo
11

Je trouve que les géopandas sont les plus performantes ici. Code:

import geopandas as gpd
shapefile = gpd.read_file("shapefile.shp")
print(shapefile)
Mobasshir Bhuiyan
la source