Jak czytać plik kształtu w Pythonie?

23

Moje pytanie jest przedłużeniem linii pionowych w pliku kształtu wielokąta . Prosimy najpierw odnieść się do tego pytania.

To, co zobaczysz, to metoda generowania linii pionowych względem ramki granicznej, w odstępach zdefiniowanych przez użytkownika. Rozumiem, że OGR, Fiona, Shapely itp. Można wykorzystać do wykonania następnego kroku obcinania, ale nie rozumiem ich wykorzystania.

Jak odczytać jedną linię pliku kształtu wielokąta? Każda aplikacja korzystająca z Shapely pokazuje, jak wygenerować LineString, Point lub Polygon, ale nigdy nie czytać istniejącego pliku kształtu

Uprzejmie pomóż mi przynajmniej w budowie szkieletu, abym mógł na nim budować.

Ach
źródło

Odpowiedzi:

40

1) przeczytaj swój plik kształtu za pomocą Fiona , PyShp , ogr lub ... używając protokołu geo_interface (GeoJSON):

z Fioną

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

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

z 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) konwersja do geometrii Shapely (z funkcją kształtu )

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

4) zapisz wynikowy plik kształtu

gen
źródło
5
Do listy dodałbym geopandę:geopandas.read_file("my_shapefile.shp")
joris
Począwszy od GDAL 2.0 zamiast osgeo.ogr.Openużywać osgeo.gdal.OpenEx( szczegóły ).
Kevin,
1
z ogrodem, najpierw musiałem zdefiniować json jako json, aby móc go dalej przetwarzać zgrabnie: „first = json.loads (first)”
Leo
11

Uważam, że geopanda są tutaj najlepszymi wykonawcami. Kod:

import geopandas as gpd
shapefile = gpd.read_file("shapefile.shp")
print(shapefile)
Mobasshir Bhuiyan
źródło