Comment polygoniser un raster en polygones galbés

14

Je cherche une solution open-source de python pour convertir le raster en polygone (pas ArcPy).

Je connaissais la fonction GDAL pour convertir un raster en polygone, et voici le manuel: http://pcjericks.github.io/py-gdalogr-cookbook/raster_layers.html#polygonize-a-raster-band

Néanmoins, je m'attends à ce que la sortie puisse être des polygones galbés ou tout autre objet, temporairement en mémoire, non enregistré en tant que fichier. Existe-t-il un package ou un code pour gérer ce problème?

Si le raster a été traité dans un tableau numpy, l'approche est répertoriée ci-dessous.

Vicky Liau
la source

Réponses:

21

Utilisez rasterio de Sean Gillies. Il peut être facilement combiné avec Fiona (lire et écrire des fichiers de formes) et bien fait du même auteur.

Dans le script rasterio_polygonize.py, le début est

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

Le résultat est un générateur de fonctionnalités 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}}

Que vous pouvez transformer en géométries galbées

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

Créez des géopandas Dataframe et activez des fonctionnalités faciles à utiliser de jointure spatiale, de traçage, d'enregistrement en tant que geojson, ESRI shapefile etc.

geoms = list(results)
import geopandas as gp
gpd_polygonized_raster  = gp.GeoDataFrame.from_features(geoms)
gène
la source
si le raster a été traité comme un tableau numpy, existe-t-il un moyen de convertir un tableau numpy en polygones? Merci!
Vicky Liau
En théorie, oui-
gène
1
La variable et le paramètre de masque dans votre exemple semblent inutiles. Je recommanderais cependant d'ajouter if value > src.nodataà la liste la compréhension pour utiliser la valeur nodata de la source et supprimer toutes les formes qui lui correspondent. Je ne sais pas ce qui se passerait en l'absence de nodata vaue. : o)
bugmenot123
3
Pendant ce temps, ils ont changé rasterio.drivers en rasterio.Env et src.affine en src.transform
Leo
4

Voici ma mise en œuvre.

from osgeo import ogr, gdal, osr
from osgeo.gdalnumeric import *  
from osgeo.gdalconst import * 
import fiona
from shapely.geometry import shape
import rasterio.features

#segimg=glob.glob('Poly.tif')[0]
#src_ds = gdal.Open(segimg, GA_ReadOnly )
#srcband=src_ds.GetRasterBand(1)
#myarray=srcband.ReadAsArray() 
#these lines use gdal to import an image. 'myarray' can be any numpy array

mypoly=[]
for vec in rasterio.features.shapes(myarray):
    mypoly.append(shape(vec))

La façon d'installer rasterio est en 'conda install -c https://conda.anaconda.org/ioos rasterio', s'il y a un problème d'installation.

Vicky Liau
la source
Le résultat de rasterio est directement un tableau numpy, donc vous n'avez pas besoinmyarray=srcband.ReadAsArray() #or any array
gène
@gene J'ai révisé la note. Cette ligne (myarray = srcband.ReadAsArray ()) utilise gdal pour importer l'image.
Vicky Liau
importer l'image sous forme de tableau numpy et rasterio importer directement l'image sous forme de tableau numpy
gène
Cela a fonctionné pour moi, même si je devais indexer vec car il était renvoyé en tant que tuple. forme (vec [0])
user2723146