래스터를 모양이 많은 다각형으로 다각형 화하는 방법


14

래스터를 다각형으로 변환하기 위해 오픈 소스 파이썬 솔루션을 찾고 있습니다 (ArcPy 없음).

내가 다각형으로 변환 래스터에 GDAL 기능을 알지 못했다, 여기 설명서입니다 : http://pcjericks.github.io/py-gdalogr-cookbook/raster_layers.html#polygonize-a-raster-band

그럼에도 불구하고 출력은 모양이 다각형이거나 일시적으로 메모리에 파일로 저장되지 않은 객체 일 수 있습니다. 이 문제를 처리하기위한 패키지 또는 코드가 있습니까?

래스터가 numpy 배열로 처리 된 경우 접근 방식이 아래에 나열되어 있습니다.

답변:


21

Sean Gillies의 래스터 리오 를 사용하십시오 . 그것은 쉽게 결합 할 수 피오나 (읽기 및 쓰기 쉐이프 파일)과 매끈한 같은 저자의.

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 shapefile 등으로 저장하는 기능을 쉽게 사용할 수 있습니다.

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

래스터가 numpy 배열로 처리 된 경우 numpy 배열을 다각형으로 변환하는 방법이 있습니까? 감사!
Vicky Liau

이론적으로, yes-
gene

1
예제의 마스크 변수와 매개 변수는 필요하지 않은 것 같습니다. 그러나 if value > src.nodata소스의 nodata 값을 사용하고 그에 해당하는 모양을 버릴 수 있도록 목록 이해 에 추가 하는 것이 좋습니다 . 그래도 아무런 데이터가 없다면 어떻게 될지 확신 할 수 없습니다. : o)
bugmenot123

3
반면에 그들은 rasterio.drivers를 rasterio.Env로 바꾸고 src.affine을 src.transform으로 바꿨습니다
Leo

4

여기 내 구현이 있습니다.

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의 결과는 직접 배열이 많으므로 필요하지 않습니다.myarray=srcband.ReadAsArray() #or any array
gene

@gene 메모를 수정했습니다. 이 줄 (myarray = srcband.ReadAsArray ())은 gdal을 사용하여 이미지를 가져옵니다.
Vicky Liau

이미지를 numpy 배열로 가져 오기 및 rasterio 이미지를 numpy 배열로 직접 가져 오기
gene

이것은 vec을 튜플로 반환했기 때문에 색인을 작성해야했지만 나에게 효과적이었습니다. shape (vec [0])
2723146
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.