ラスタを多角形に整形する方法


13

ラスターをポリゴンに変換するオープンソースのPythonソリューションを探しています(ArcPyは使用しません)。

ラスターをポリゴンに変換するGDAL関数を知っていました。これはマニュアルです:http : //pcjericks.github.io/py-gdalogr-cookbook/raster_layers.html#polygonize-a-raster-band

それにもかかわらず、出力はファイルとして保存されず、一時的にメモリ内にある、形の良いポリゴンまたは任意のオブジェクトになる可能性があります。この問題を処理するパッケージまたはコードはありますか?

ラスターがnumpy配列で処理されている場合、アプローチは以下のとおりです。

回答:


18

Sean Gilliesのrasterioを使用します。Fiona(シェープファイルの読み取りと書き込み)と同じ作成者のシェイプリーと簡単に組み合わせることができます。

スクリプトrasterio_polygonize.py の先頭は

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

結果は、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}}

きれいな形状に変換できること

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を作成し、空間結合、プロット、geojson、ESRIシェープファイルとして保存などの使いやすい機能を有効にします。

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

ラスタがnumpy配列として処理されている場合、numpy配列をポリゴンとして変換する方法はありますか?ありがとう!
ヴィッキーリアウ

理論的には、はい
遺伝子

1
例のマスク変数とパラメーターは不要なようです。ただしif value > src.nodata、リストの内包表記に追加して、ソースのnodata値を使用し、それに対応する形状を破棄することをお勧めします。ただし、nodata vaueがない場合はどうなるかわかりません。:o)
bugmenot123

3
一方、彼らはrasterio.driversをrasterio.Envに、src.affineをsrc.transformに変更しました
レオ

3

これが私の実装です。

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をインストールする方法は、インストールの問題がある場合、「conda install -c https://conda.anaconda.org/ioos rasterio」を使用することです。


rasterioの結果は直接numpy配列であるため、必要ありませんmyarray=srcband.ReadAsArray() #or any array
gene

@gene私はメモを修正しました。この行(myarray = srcband.ReadAsArray())は、gdalを使用して画像をインポートします。
ヴィッキーリアウ

numpyのアレイとしてnumpyのアレイとrasterioインポートとして直接画像を画像をインポート
遺伝子

これは私にとってはうまくいきましたが、タプルとして返されているため、vecのインデックスを作成する必要がありました。shape(vec [0])
user2723146
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.