shapefile과 래스터를 오버레이하는 방법?


17

다각형이있는 shapefile이 있습니다. 그리고 글로벌 래스터 파일이 있습니다. shapefile의 다각형을 래스터 그리드에 오버레이하고 각 다각형의 평균 래스터 값을 계산하고 싶습니다.

GDAL을 사용하여 결과를 shapefile에 쓰는 방법은 무엇입니까?


4
GDAL이 사용하고 싶은 유일한 도구입니까?
Simbamangu

@Simbamangu 아니오, 기본적으로 아무 문제가 없으며, 파이썬에 있다면 좋을 것입니다.
andreash

답변:


9

R에서는 할 수 있습니다

library(raster)
library(rgdal)
r <- raster('raster_filename')
p <- readOGR('shp_path', 'shp_file')
e <- extract(r, p, fun=mean)

e는 각 다각형에 대한 래스터 셀 값의 평균을 가진 벡터입니다.


이것은 질문에 따라 R이 아닌 파이썬입니다
GM

6

다음 의 조언 내가 GDAL-dev에 메일 링리스트에 도착를, 내가 사용 StarSpan를 :

starspan --vector V --raster R1 R2 ... --stats mystats.csv avg mode

결과는 CSV 형식으로 저장됩니다. 그 당시에는 이미 충분했지만 그 정보에서 Shapefile을 어떻게 든 만들 수 있어야합니다.


StarSpan이 GitHub로 이동 한 것 같습니다. 그것을 얻을 여기 .
Richard

4

PostGIS 2.0에서 모양 파일과 래스터를로드하고 다음을 수행하십시오.

SELECT (ST_SummaryStats(ST_Clip(rast, geom))).*
FROM rastertable, geomtable

4

GDAL이 최선의 도구라고 생각하지는 않지만 gdal_rasterize를 사용하여 다각형 외부의 모든 값을 "삭제"할 수 있습니다.

다음과 같은 것 :

gdal_translate -a_nodata 0 original.tif work.tif
gdal_rasterize -burn 0 -b 1 -i work.tif yourpolygon.shp -l yourpolygon
gdalinfo -stats work.tif
rm work.tif

gdal_rasterize 프로그램은 파일을 수정하므로 작업 할 복사본을 만듭니다. 또한 특정 값 (이 경우 0)을 nodata로 표시합니다. "-burn 0 -b 1"은 대상 파일의 밴드 1 (work.tif)에 값 0을 레코딩하는 것을 의미합니다. "-i"는 반전 래스터 화를 의미하므로 다각형 내부가 아닌 다각형 외부 에서 값을 레코딩합니다 . -stats와 함께 gdalinfo 명령은 대역 통계를보고합니다. nodata 값 (이전에 -a_nodata로 표시)을 제외 할 것이라고 생각합니다.


4

다음 스크립트를 사용하면 GDAL로 작업을 수행 할 수 있습니다. http://pcjericks.github.io/py-gdalogr-cookbook/raster_layers.html#calculate-zonal-statistics

# Calculates statistics (mean) on values of a raster within the zones of an polygon shapefile

import gdal, ogr, osr, numpy

def zonal_stats(input_value_raster, input_zone_polygon):

    # Open data
    raster = gdal.Open(input_value_raster)
    driver = ogr.GetDriverByName('ESRI Shapefile')
    shp = driver.Open(input_zone_polygon)
    lyr = shp.GetLayer()

    # get raster georeference info
    transform = raster.GetGeoTransform()
    xOrigin = transform[0]
    yOrigin = transform[3]
    pixelWidth = transform[1]
    pixelHeight = transform[5]

    # reproject geometry to same projection as raster
    sourceSR = lyr.GetSpatialRef()
    targetSR = osr.SpatialReference()
    targetSR.ImportFromWkt(raster.GetProjectionRef())
    coordTrans = osr.CoordinateTransformation(sourceSR,targetSR)
    feat = lyr.GetNextFeature()
    geom = feat.GetGeometryRef()
    geom.Transform(coordTrans)

    # Get extent of geometry
    ring = geom.GetGeometryRef(0)
    numpoints = ring.GetPointCount()
    pointsX = []; pointsY = []
    for p in range(numpoints):
            lon, lat, z = ring.GetPoint(p)
            pointsX.append(lon)
            pointsY.append(lat)
    xmin = min(pointsX)
    xmax = max(pointsX)
    ymin = min(pointsY)
    ymax = max(pointsY)

    # Specify offset and rows and columns to read
    xoff = int((xmin - xOrigin)/pixelWidth)
    yoff = int((yOrigin - ymax)/pixelWidth)
    xcount = int((xmax - xmin)/pixelWidth)+1
    ycount = int((ymax - ymin)/pixelWidth)+1

    # create memory target raster
    target_ds = gdal.GetDriverByName('MEM').Create('', xcount, ycount, gdal.GDT_Byte)
    target_ds.SetGeoTransform((
        xmin, pixelWidth, 0,
        ymax, 0, pixelHeight,
    ))

    # create for target raster the same projection as for the value raster
    raster_srs = osr.SpatialReference()
    raster_srs.ImportFromWkt(raster.GetProjectionRef())
    target_ds.SetProjection(raster_srs.ExportToWkt())

    # rasterize zone polygon to raster
    gdal.RasterizeLayer(target_ds, [1], lyr, burn_values=[1])

    # read raster as arrays
    banddataraster = raster.GetRasterBand(1)
    dataraster = banddataraster.ReadAsArray(xoff, yoff, xcount, ycount).astype(numpy.float)

    bandmask = target_ds.GetRasterBand(1)
    datamask = bandmask.ReadAsArray(0, 0, xcount, ycount).astype(numpy.float)

    # mask zone of raster
    zoneraster = numpy.ma.masked_array(dataraster,  numpy.logical_not(datamask))

    # calculate mean of zonal raster
    return numpy.mean(zoneraster)

2

gdal_rasterize로 래스터의 모양 파일을 변환하고 http://www.spatial-ecology.net/dokuwiki/doku.php?id=wiki:geo_tools 의 코드를 사용하여 각 다각형의 구역 통계를 계산 하십시오 . 래스터 통계와 함께 주제를 얻으려면 http://km.fao.org/OFwiki/index.php/Oft-reclass 를 실행할 수 있습니다 . Ciao Giuseppe 코드를 즐기십시오


참조하는 코드의 사본이 있습니까? 불행히도 파이썬 파일에 대한 링크가 죽었습니다.
ustroetz

1

GDAL을 사용하면 불가능합니다. 그러나 saga gis와 같은 다른 무료 도구를 사용할 수 있습니다.

saga_cmd shapes_grid "Grid Values to Shapes" -GRIDS=grid.sgrd -POLYGONS=in.shp -SHAPES=out.shp-NODATA -TYPE=1

함수 이름은 실제로 "다각형에 대한 그리드 통계"이지만이 방법을 사용했습니다.
bananafish

1

rasterstats 를 사용할 수도 있습니다 . thas는 이러한 목적으로 설계된 Python 모듈입니다.

from rasterstats import zonal_stats
listofzones = zonal_stats("polygons.shp", "elevation.tif",
            stats="mean")

여기에 이미지 설명을 입력하십시오

그런 다음 다음을 사용하여 첫 번째 영역의 속성에 액세스 할 수 있습니다.

mean_of_zone1 = listofzones[0]['mean']

-2

arc gis에서 포인트 통계 계산 도구를 사용할 수 있으며이 도구는 http://ianbroad.com/arcgis-toolbox-calculate-point-statistics-polygon-arcpy/ 에서 다운로드 할 수 있습니다.


2
"계산점 통계 도구는 입력 다각형 및 점 피쳐 클래스를 가져 와서 선택된 필드를 사용하여 점의 최소, 최대 및 평균을 찾고 결과를 다각형 피쳐에 추가합니다." 그러나이 질문은 다각형 피처 클래스와 래스터에 관한 것이므로 적합하지 않은 것 같습니다.
PolyGeo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.