ポリゴンを含むシェープファイルがあります。また、グローバルラスターファイルがあります。シェープファイルのポリゴンをラスタグリッドにオーバーレイし、各ポリゴンの平均ラスタ値を計算します。
GDALを使用して結果をシェープファイルに書き込むにはどうすればよいですか?
ポリゴンを含むシェープファイルがあります。また、グローバルラスターファイルがあります。シェープファイルのポリゴンをラスタグリッドにオーバーレイし、各ポリゴンの平均ラスタ値を計算します。
GDALを使用して結果をシェープファイルに書き込むにはどうすればよいですか?
回答:
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でマークした)が除外されると思います。
次のスクリプトを使用すると、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)
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
rasterstatsも使用できます 。thasは、この目的のために設計されたPythonモジュールです。
from rasterstats import zonal_stats
listofzones = zonal_stats("polygons.shp", "elevation.tif",
stats="mean")
次に、次を使用して最初のゾーンの属性にアクセスできます。
mean_of_zone1 = listofzones[0]['mean']
arc gisでポイント統計計算ツールを使用できます。このツールはhttp://ianbroad.com/arcgis-toolbox-calculate-point-statistics-polygon-arcpy/からダウンロードできます。