オープンソースGISを使用してポイントのラスター値を抽出しますか?


21

ポイントごとにラスターから値を抽出するにはどうすればよいですか?

私はArcgisを好まない。

私はQgisまたはMapwindowまたは他のオープンソースgisを好みます。


1
したがって、ポイントがあり、それらのポイントの下のラスターから値を抽出する必要がありますか、またはラスターセルをポイントに変換する必要があります。答えを試す前に確認するだけです。
ネイサンW

1つ目は、ポイントがあり、それらのポイントの下にあるラスターから値を抽出する必要があることです。THNX !!
ヴァシリス

回答:


37

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/をご覧ください


5
このQ&Aを通じて、上記の投稿はまだ見つかっています。ただし、プラグインが唯一のソリューションではなく、常に最も簡単なソリューションであるとは限りません。代替ソリューションは、処理ツールボックスの「ポイントにグリッド値を追加」という佐賀関数です。詳細については、この投稿を参照してください。
Ecodiv 14

あぶない。ポイントサンプリングツールを実行しました。60,000ポイントおよび13ラスター。結果は、毎年30のランダムサンプルテストに失敗しました。このツールには、大規模なデータセットに関する問題があります。私はそれを使用しません。
知らない場合-GIS

前述の大きなデータセットの問題にもかかわらず、すべてのマルチバンド値を一度に抽出するのに非常に便利です。他のすべてのQGIS関連ソリューションは、1つのバンドの抽出(GRASS r.whatなど)のみをサポートするか、マルチバンドラスタの使用を禁止します(Saga-ポイントからラスタ値)。
EikeMike

7

PostGIS 2.0では、次のことができます。

SELECT ST_Value(rast, geom) val
FROM yourrastertabe, yourpointtable
WHERE ST_Intersects(rast, geom)

ラスターを読み込むときは、ラスターが非常に小さくタイル化されていることを確認してください(ローダーで-t 10x10)


6

QGIS 3.2.2およびSAGA(QGISにデフォルトでインストールされます)を使用してみてください:「ポイントへのラスター値」機能はすべてを行います:画像ファイルを取得し、ラスター画像から情報を取得するポイントベクターシェイプに変換します。


6

このスレッドで言及されているQGISおよびSAGA GUIツールで問題が発生していました(Raster values to points何らかの理由で失敗し、役に立たないエラーを投げ、GRASSは役に立たないv.sampleまったく新しいレイヤーを作成しました)。しばらくの間GUIツールで失敗した後、Field Calculatorでこれを試しました。それは非常にうまく機能し、GUIが許可するよりも少しうまくプロセスを制御し、途中で他の計算を行うことができました。

同じ座標系にptsという名前のレイヤーと別の名前のレイヤーがあるとしrastます。でrast表される各X、Yペアでサンプリングしたいpts

Field Calculatorを使用したことがない場合は、非常に簡単です。「式」ボックスに計算を入力します。Qは、中央の列にいくつかの変数と操作を示し、右側の列にヘルプテキストが表示されます。このプロセスを4つのステップに分けます。

  1. ptsサンプリングするレイヤーの属性テーブルを開きます。

  2. [フィールド計算]ダイアログが開いたら、レイヤーの新しいフィールド作成する、既存のフィールド変更するかを選択しますpts

  3. 次に、新規または既存のpts属性列に入力する式を作成します。あなたは私のために働いた式コードを変更することから始めるかもしれません:

raster_value('rast', 1, make_point($x, $y))
  1. あなたは供給しなければならないraster_value()ラスタレイヤ名で'rast'、バンド番号1、およびの点ジオメトリmake_point()$xおよび$yは、属性テーブルの各行のポイントの位置に依存するジオメトリ変数です。

この方法でother_rastrast、から呼び出される別のラスターレイヤーの値を減算するなどの算術演算も可能です。これにより、GUIツールでの時間を大幅に節約できました。以下の例:

raster_value('rast', 1, make_point($x, $y)) - raster_value('other_rast', 1, make_point($x, $y))

再度注意三層ことptsrast及びother_rast作業にこの方法のための同じ座標系でなければなりません。


1
これは、この質問に対する最良の答えです
BC B.

4

Hawthorne BeyerのGMEツールは、コマンドラインを介してこれを適切に行い、「for」ループを使用して簡単にバッチ処理することができます。

isectpntrst(in="path/to/shapefile", raster="path/to/raster", field="fieldname")

GME isectpntrstコマンドリファレンス





2

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')

1

FMEにアクセスできる場合は、FME Workbenchの2つのトランスフォーマーのいずれかを使用できます。

RasterCellCoercerは (「個々の点またはポリゴンに全ての入力数値ラスタ機能を分解する。一つのベクトル機能は、ラスタ内の各セルのために出力されます。」)

PointOnRasterValueExtractorは (「点特徴および単一の参照ラスタを取り込む。出力は各点の位置にバンドパレット値(S)からなります。」)


いいえ、FMEは持っていませんし、使用していません。スタンドアロンアプリケーションですか、プラグインですか?
ヴァシリス

0

簡単な考え:

  1. gdal_polygonize.py-ラスターフィーチャをポリゴン化する
  2. ポイントフィーチャとポリゴンをPostGISデータベースに挿入します
  3. st_intersects関数を使用して、フィーチャが交差するすべての標高値を取得します

昨日はPostgisの使い方を勉強し始めたので、興味深いアプローチです。
ヴァシリス

おかげで、かなり単純化されていますが、機能します。このアプローチで作成できたものを次に示します。i.imgur.com
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.