Come leggere un file di forma in Python?


23

La mia domanda è un'estensione delle linee verticali in un file di forma poligonale . Si prega di fare prima riferimento a tale domanda.

Quello che vedrai è un metodo per generare linee verticali rispetto al rettangolo di selezione, a spaziatura definita dall'utente. Capisco che OGR, Fiona, Shapely ecc. Possano essere usati per fare il passo successivo del ritaglio, ma non capisco il loro utilizzo.

Come faccio a leggere una riga di un file di forma poligonale? Ogni applicazione che utilizza Shapely mostra come generare LineString, Point o Polygon ma non leggere mai uno shapefile esistente

Per favore, aiutami con almeno una struttura di scheletro in modo che io possa costruirci sopra.

Risposte:


40

1) leggi il tuo shapefile con Fiona , PyShp , ogr o ... usando il protocollo geo_interface (GeoJSON):

con 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)])}

con 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))}

con 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) conversione in geometria Shapely (con la funzione forma )

# 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) calcoli

4) salva lo shapefile risultante


5
Aggiungerei geopandas all'elenco:geopandas.read_file("my_shapefile.shp")
joris,

A partire da GDAL 2.0, invece di osgeo.ogr.Open, utilizzare osgeo.gdal.OpenEx( dettagli ).
Kevin,

1
con ogr, per prima cosa ho dovuto definire il json come un json per essere in grado di elaborarlo ulteriormente con shapely: 'first = json.loads (first)'
Leo

11

Trovo geopandas come il miglior interprete qui. Codice:

import geopandas as gpd
shapefile = gpd.read_file("shapefile.shp")
print(shapefile)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.