Como ler um shapefile em Python?

23

Minha pergunta é uma extensão de linhas verticais em um shapefile de polígono . Por favor, consulte essa pergunta primeiro.

O que você verá é um método de gerar linhas verticais com relação à caixa delimitadora, no espaçamento definido pelo usuário. Entendo que OGR, Fiona, Shapely etc. podem ser usados ​​para executar o próximo passo do recorte, mas não entendo sua utilização.

Como leio uma linha de um shapefile de polígono? Todo aplicativo que usa Shapely mostra como gerar LineString, Point ou Polygon, mas nunca para ler um shapefile existente

Por favor, me ajude com pelo menos uma estrutura de esqueleto para que eu possa construir sobre ela.

Akhil
fonte

Respostas:

40

1) ler o seu shapefile com Fiona , PyShp , OGR ou ... usando o geo_interface protocolo (GeoJSON):

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

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

com 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) conversão em geometria Shapely (com a função shape )

# 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) salve o shapefile resultante

gene
fonte
5
Eu adicionaria geopandas à lista:geopandas.read_file("my_shapefile.shp")
joris 27/08
A partir do GDAL 2.0, em vez de osgeo.ogr.Open, use osgeo.gdal.OpenEx( detalhes ).
Kevin
1
com ogr, primeiro tive que definir o json como um json para poder processá-lo ainda mais com bem torneado: 'first = json.loads (first)'
Leo
11

Encontro geopandas como o melhor artista aqui. Código:

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