¿Cómo leer un archivo shape en Python?

23

Mi pregunta es una extensión de líneas verticales en un archivo de forma poligonal . Favor de referirse a esa pregunta primero.

Lo que verá es un método para generar líneas verticales con respecto al cuadro delimitador, con un espaciado definido por el usuario. Entiendo que OGR, Fiona, Shapely, etc. se pueden usar para hacer el siguiente paso de recorte, pero no entiendo su utilización.

¿Cómo leo una línea de un archivo de forma poligonal? Cada aplicación que usa Shapely muestra cómo generar LineString, Point o Polygon pero nunca leer un archivo de forma existente

Por favor, ayúdenme con al menos una estructura de esqueleto para que pueda construir sobre ella.

Akhil
fuente

Respuestas:

40

1) lea su archivo de forma con Fiona , PyShp , ogr o ... utilizando el protocolo 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) conversión a geometría bien formada (con la función de 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) cálculos

4) guardar el archivo de forma resultante

gene
fuente
55
Agregaría geopandas a la lista:geopandas.read_file("my_shapefile.shp")
joris
A partir de GDAL 2.0, en lugar de osgeo.ogr.Openusar osgeo.gdal.OpenEx( detalles ).
Kevin
1
con ogr, primero tuve que definir el json como un json para poder procesarlo aún más con shapely: 'first = json.loads (first)'
Leo
11

Encuentro a las geopandas como las de mejor desempeño aquí. Código:

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