回答:
QGIS「ポイントサンプリングツール」は、探しているプラグインです。
使用方法の詳細は次のとおりです。http://pvanb.wordpress.com/2010/02/15/sampling-raster-values-at-point-locations-in-qgis/
Paoloのコメントに基づく更新:
プラグインが唯一のソリューションではなく、常に最も簡単なソリューションであるとは限りません。代替ソリューションは、処理ツールボックスの「ポイントにラスター値を追加」という佐賀関数です。詳細についてはhttp://pvanb.wordpress.com/2014/07/01/sampling-raster-values-at-point-locations-in-qgis-an-update/をご覧ください
このスレッドで言及されているQGISおよびSAGA GUIツールで問題が発生していました(Raster values to points
何らかの理由で失敗し、役に立たないエラーを投げ、GRASSは役に立たないv.sample
まったく新しいレイヤーを作成しました)。しばらくの間GUIツールで失敗した後、Field Calculatorでこれを試しました。それは非常にうまく機能し、GUIが許可するよりも少しうまくプロセスを制御し、途中で他の計算を行うことができました。
同じ座標系にpts
という名前のレイヤーと別の名前のレイヤーがあるとしrast
ます。でrast
表される各X、Yペアでサンプリングしたいpts
。
Field Calculatorを使用したことがない場合は、非常に簡単です。「式」ボックスに計算を入力します。Qは、中央の列にいくつかの変数と操作を示し、右側の列にヘルプテキストが表示されます。このプロセスを4つのステップに分けます。
pts
サンプリングするレイヤーの属性テーブルを開きます。
[フィールド計算]ダイアログが開いたら、レイヤーの新しいフィールドを作成するか、既存のフィールドを変更するかを選択しますpts
。
次に、新規または既存のpts
属性列に入力する式を作成します。あなたは私のために働いた式コードを変更することから始めるかもしれません:
raster_value('rast', 1, make_point($x, $y))
raster_value()
ラスタレイヤ名で'rast'
、バンド番号1
、およびの点ジオメトリmake_point()
。$x
および$y
は、属性テーブルの各行のポイントの位置に依存するジオメトリ変数です。この方法でother_rast
はrast
、から呼び出される別のラスターレイヤーの値を減算するなどの算術演算も可能です。これにより、GUIツールでの時間を大幅に節約できました。以下の例:
raster_value('rast', 1, make_point($x, $y)) - raster_value('other_rast', 1, make_point($x, $y))
再度注意三層ことpts
、rast
及びother_rast
作業にこの方法のための同じ座標系でなければなりません。
Hawthorne BeyerのGMEツールは、コマンドラインを介してこれを適切に行い、「for」ループを使用して簡単にバッチ処理することができます。
isectpntrst(in="path/to/shapefile", raster="path/to/raster", field="fieldname")
GRASS GISでは、GUIでマップを照会するか、http://grass.osgeo.org/gdp/html_grass64/r.what.htmlを使用できます。
http://gis-techniques.blogspot.com/2012/10/extract-raster-values-from-points.htmlに は、Rラスターパッケージを使用してポイントからラスター値を抽出するためのステップバイステップガイドがあります。
これを使用できます:http : //www.saga-gis.org/saga_module_doc/2.1.3/shapes_grid_3.html
QgisのSAGAツールボックスにあります!ワンステップですべてを行います:)
pythonとgdalを使用して作成した関数を次に示します。この関数は、ラスタのリストと、ポイント座標を含むパンダデータフレームを取得し、ポイント座標、各ラスタセルの重心、および各セル値を含むパンダデータフレームを返します。この関数は、開発中のパッケージchorospyパッケージ(ここにあります)の一部です。
import pandas
import numpy
from osgeo import gdal
def getValuesAtPoint(indir, rasterfileList, pos, lon, lat):
#gt(2) and gt(4) coefficients are zero, and the gt(1) is pixel width, and gt(5) is pixel height.
#The (gt(0),gt(3)) position is the top left corner of the top left pixel of the raster.
for i, rs in enumerate(rasterfileList):
presValues = []
gdata = gdal.Open('{}/{}.tif'.format(indir,rs))
gt = gdata.GetGeoTransform()
band = gdata.GetRasterBand(1)
nodata = band.GetNoDataValue()
x0, y0 , w , h = gt[0], gt[3], gt[1], gt[5]
data = band.ReadAsArray().astype(numpy.float)
#free memory
del gdata
if i == 0:
#iterate through the points
for p in pos.iterrows():
x = int((p[1][lon] - x0)/w)
Xc = x0 + x*w + w/2 #the cell center x
y = int((p[1][lat] - y0)/h)
Yc = y0 + y*h + h/2 #the cell center y
try:
if data[y,x] != nodata:
presVAL = [p[1][lon],p[1][lat], '{:.6f}'.format(Xc), '{:.6f}'.format(Yc), data[y,x]]
presValues.append(presVAL)
except:
pass
df = pandas.DataFrame(presValues, columns=['x', 'y', 'Xc', 'Yc', rs])
else:
#iterate through the points
for p in pos.iterrows():
x = int((p[1][lon] - x0)/w)
y = int((p[1][lat] - y0)/h)
try:
if data[y,x] != nodata:
presValues.append(data[y,x])
except:
pass
df[rs] = pandas.Series(presValues)
del data, band
return df
ラスターが現在の作業ディレクトリにある場合の実行方法の例:
rasDf = getValuesAtPoint('.', ['raster1', 'raster2'], inPoints, 'x', 'y')
簡単な考え: