Użyj rasterio Seana Gilliesa. Można go łatwo łączyć z Fioną (odczytywać i zapisywać pliki kształtów) i kształtować tego samego autora.
W skrypcie rasterio_polygonize.py
początek jest
import rasterio
from rasterio.features import shapes
mask = None
with rasterio.drivers():
with rasterio.open('a_raster') as src:
image = src.read(1) # first band
results = (
{'properties': {'raster_val': v}, 'geometry': s}
for i, (s, v)
in enumerate(
shapes(image, mask=mask, transform=src.affine)))
Wynikiem jest generator funkcji GeoJSON
geoms = list(results)
# first feature
print geoms[0]
{'geometry': {'type': 'Polygon', 'coordinates': [[(202086.577, 90534.3504440678), (202086.577, 90498.96207), (202121.96537406777, 90498.96207), (202121.96537406777, 90534.3504440678), (202086.577, 90534.3504440678)]]}, 'properties': {'raster_val': 170.52000427246094}}
Że możesz przekształcić się w kształtne geometrie
from shapely.geometry import shape
print shape(geoms[0]['geometry'])
POLYGON ((202086.577 90534.35044406779, 202086.577 90498.96206999999, 202121.9653740678 90498.96206999999, 202121.9653740678 90534.35044406779, 202086.577 90534.35044406779))
Twórz geopandasową ramkę danych i włącz łatwe w obsłudze funkcje łączenia przestrzennego, kreślenia, zapisywania jako geojson, plik kształtu ESRI itp.
geoms = list(results)
import geopandas as gp
gpd_polygonized_raster = gp.GeoDataFrame.from_features(geoms)
if value > src.nodata
Poleciłbym jednak dodać do listy zrozumienie, aby skorzystać z wartości źródłowej źródła i odrzucić wszelkie kształty, które jej odpowiadają. Nie jestem jednak pewien, co by się stało, gdyby nie istniały wartości nodata. : o)Oto moja implementacja.
Sposób zainstalowania rasterio to „conda install -c https://conda.anaconda.org/ioos rasterio”, jeśli występuje problem z instalacją.
źródło
myarray=srcband.ReadAsArray() #or any array