Rasterleri düzgün çokgenlere çokgenleştirmek


15

Raster poligon (ArcPy yok) dönüştürmek için açık kaynaklı bir python çözümü arıyorum.

Rasteri çokgene dönüştürmek için GDAL işlevini biliyordum ve işte kılavuz: http://pcjericks.github.io/py-gdalogr-cookbook/raster_layers.html#polygonize-a-raster-band

Bununla birlikte, çıkışın düzgün bir şekilde çokgenler veya herhangi bir nesne, geçici olarak bellekte, bir dosya olarak kaydedilmemesini bekliyorum. Bu sorunu çözmek için herhangi bir paket veya kod var mı?

Raster sayısal bir dizide işlenmişse, yaklaşım aşağıda listelenmiştir.

Yanıtlar:


22

Sean Gillies'in rasterisini kullan . Fiona (şekil dosyalarını oku ve yaz) ve aynı yazarın şekline göre kolayca birleştirilebilir .

Komut olarak rasterio_polygonize.py başlangıçtır

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

Sonuç, GeoJSON özelliklerinin oluşturucusudur

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

Düzgün geometrilere dönüştürebileceğiniz

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

Geopandas Dataframe oluşturun ve mekansal birleştirme, çizim, geojson, ESRI şekil dosyası vb.

geoms = list(results)
import geopandas as gp
gpd_polygonized_raster  = gp.GeoDataFrame.from_features(geoms)

Raster bir numpy dizisi olarak işlenmişse, numpy dizisini çokgen olarak dönüştürmenin herhangi bir yolu var mı? Teşekkürler!
Vicky Liau

Teorik olarak, evet-
gen

1
Örneğinizdeki maske değişkeni ve parametresi gereksiz görünüyor. Bununla birlikte if value > src.nodata, kaynağın nodata değerini kullanmak ve buna karşılık gelen şekilleri atmak için liste kavrayışına eklemenizi tavsiye ederim . Nodata vaue olmasa ne olur emin değilim. : o)
bugmenot123

3
bu arada rasterio.drivers'ı rasterio.Env ve src.affine olarak src.transform olarak değiştirdiler
Leo

4

İşte benim uygulama.

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

Rasterio kurmanın yolu , bir kurulum sorunu varsa 'conda install -c https://conda.anaconda.org/ioos rasterio' şeklindedir.


Rasterio sonucu doğrudan bir numpy dizisidir, bu yüzden ihtiyacınız yokturmyarray=srcband.ReadAsArray() #or any array
gen

@ gene Notu gözden geçirdim. Bu satır (myarray = srcband.ReadAsArray ()) görüntüyü içe aktarmak için gdal kullanır.
Vicky Liau

görüntüyü bir numpy dizi ve rasterio olarak içe aktarma Görüntüyü doğrudan bir numpy dizi olarak içe aktarma
gen

Bir demet olarak iade edildi çünkü vec indekslemek zorunda olmasına rağmen bu benim için çalıştı. şekil (vec [0])
user2723146
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.