シェープファイルとラスターをオーバーレイする方法は?


17

ポリゴンを含むシェープファイルがあります。また、グローバルラスターファイルがあります。シェープファイルのポリゴンをラスタグリッドにオーバーレイし、各ポリゴンの平均ラスタ値を計算します。

GDALを使用して結果をシェープファイルに書き込むにはどうすればよいですか?


4
使用したいツールはGDALだけですか?
シンバマング

@Simbamanguいいえ、基本的には何でも結構です、そしてそれがPythonであったら素晴らしいと
思います-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ではないのpythonである
GM

6

gdal-devメーリングリストに載ったアドバイスに従って、StarSpanを使用しました

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

結果はCSV形式で保存されます。当時、それはすでに私にとっては十分でしたが、その情報からシェイプファイルを何らかの方法で偽造することが可能であるはずです。


StarSpanはGitHubに移行したようです。ここで入手してください
リチャード14年

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プログラムはファイルを変更するため、作業用のコピーを作成します。また、特定の値(この場合はゼロ)をnodataとしてマークします。「-burn 0 -b 1」は、ターゲットファイル(work.tif)のバンド1にゼロの値を書き込むことを意味します。「-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のコードを使用して、各ポリゴンのゾーン統計を計算します。ラスター統計でtifを取得する場合は、http://km.fao.org/OFwiki/index.php/Oft-reclassを実行できます。コードをお楽しみくださいCiao Giuseppe


参照しているコードのコピーがありますか?残念ながら、Pythonファイルへのリンクは無効です。
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

関数名は実際には「ポリゴンのグリッド統計」ですが、このアプローチを採用しました。
バナナフィッシュ

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.