ベクトルポイントに基づいて最も近いラスターセル値を検索していますか?


9

ArcGISに2つのレイヤーがあります。1つはベクターポイントで、もう1つはラスターレイヤーです。ラスターデータグリッドの値をベクトルポイントに追加したいと思います。問題は、ベクトルポイントが値を持つ既存のラスターグリッドから離れているため、「Sample」コマンドを実行すると、それらのベクトルポイントの値が返されないことです。

だから私の質問です:ベクトルポイントを与えられた最も近いラスターセルを見つけて、セルから値を抽出するにはどうすればよいですか?

実際、私がしなければならないことが2つあります。

  1. レンジャー内のアウトライナーを識別します(通常、既存のラスターから1〜2セル離れています)。
  2. それらが範囲内にある場合、最も近いラスターからの値をそれらに割り当てます

編集:私は約3000のベクトルポイントを持っており、私の問題はこれです: ここに画像の説明を入力してください

位置に基づくラスター値をベクトルポイントに追加する必要があります。私はツール「サンプル」を使用しましたが、それはほとんどのポイントでうまく機能します。

しかし、このような状況があります ここに画像の説明を入力してください

右のポイントはラスターから値を取得できますが(「サンプル」は機能します)、左のポイントは配置の問題により取得できません。

ドメインから外れているため、ベクターに変換できないというエラーメッセージが表示されるため、ラスターからポリゴンへの変換が機能しません。また、このようなポイントがありますここに画像の説明を入力してください

これらの上部のポイントはラスターから離れすぎているため、値を取得してはなりません。

私はいつか回避することを考えました:

ステップ1.最初に「サンプル」を実行する

ステップ2.「サンプル」操作の後でnull値を選択する

ステップ3.ヌルポイントに基づいてバッファーゾーン(小数点以下1度以内)を構築する

ステップ4. ゾーン統計を使用しますか??または、バッファー内のすべてのラスターセルをループし、最も近いものを見つけ、その値を抽出してベクターポイントに配置する他のツール。

手順4で行き詰まりました。この機能を実現するために使用できるArcSDKのツールがわかりません。

それとも...あなたはそれに対処するより良い考えを持っていますか?

このようなラスターレイヤーが20あり、それを自動的に作成したい(モデルビルダーとarcobjectを使用)。


@whuber:あなたの方法はとても賢く聞こえます。私の質問は、グローバルスケールでデータを処理していることと、アウトラインラスタのx0とx1をどのように決定できるかということです。

プロジェクトに追加した後、そのプロパティを調べます。
whuber

1
ゾーン統計は行き止まりです。編集に基づいて、単純な直接的な解決策があります。その境界の周りでラスターをわずかに拡張し、拡張されたラスターをサンプリングします。これには多くの方法がありますが、すべてラスター計算を行うための小さな機能が必要です。最も簡単な方法の1つは、分析範囲を拡大し、焦点平均を計算し、その値を( 'con'を使用して)NoData境界ゾーンに貼り付けることです。これにより、近くのラスター値の平均が各ラスターサンプルの場所に割り当てられます。
whuber

@whuberアウトライナがどこにあるのかわからないという問題もあります。したがって、私のプロセスには実際には2つの手順があります。アウトライナーを特定し、値を割り当てることです。

「アウトライナー」とは何ですか?それがラスター値でカバーされていないポイントである場合は、それらを見つけるしかありません。これらは、Sampleツールを適用したときに値を受け取らないポイントになります。
whuber

回答:


8

ラスターアウトラインは、座標が(たとえば)(x0、y0)であり、右上が(x1、y1)である原点を左下に、四角形を占めています。これらは、任意のラスターのプロパティを簡単に見つけることができます。この情報を使用して、ラスターの範囲外のポイントをラスターの境界上の最も近いポイントに移動し、新しい場所でラスター値を抽出できます。

このようなタスクは、多くの場合、低い次元を検討することで簡単に解決できます。1次元ラスターの範囲は、通常x0からx1> x0までの数値の間隔であり、従来は[x0、x1]と記述されていました。この区間で、指定された数値xに最も近い点を見つけたいとします。x <x0(xは左側)、x0 <= x <= x1(xは区間内)、x1 <x(xは右側)の3つのケースがあります。明らかに、最も近い点はそれぞれx0、x、x1です。この結果の式は次のとおりです

x-> min(max(x、x0)、x1)、

3つのケースのそれぞれを個別に熟考することでわかるように。

ラスタの範囲は2つの間隔のデカルト積[x0、x1] * [y0、y1]であるため、同じ式が2次元で機能します。 各間隔に適用するだけです。したがって、投影されたポイントの座標は(フィールド計算機などで)次のように計算できます。

(x、y)->(min(max(x、x0)、x1)、min(max(y、y0)、y1)。

以下は、グリッドの範囲内およびグリッドの範囲内にランダムに配置された100ポイントを使用したこの数式の動作です。

図

破線は、エクステントの外にあるポイントを、それらが移動される場所に視覚的に関連付けます。

これらの計算された座標からポイントレイヤーを作成し、Sampleツールを適用してラスター値を抽出します。結果を元のポイントレイヤーに結合します。

実際の問題として、新しいポイントがグリッドの範囲内に収まらない可能性がある浮動小数点の丸めの問題を回避するには、x0とy0を実際の原点よりも少し大きくすることをお勧めします(セルサイズの半分を追加することができます)。同様に、x1とy1を少し小さくします。

要約すると、ワークフローは、元のポイントレイヤーのテーブルの2つのフィールド(新しい座標)を計算し、それらの新しい座標からポイントイベントレイヤーを作成し、Sampleツールを実行して、データベース結合(空間結合ではない)を実行することで構成されます。


ラスター内のセルよりも多くのベクトルポイントがある場合は、@ celenius(ラスターをポイントに変換し、空間結合を使用することを提案します)が提供するソリューションを優先する必要があります。ただし、通常、ラスタには多数のセル(数百万から数十億)が含まれ、ポイントへの変換には時間がかかり、ディスクを消費するため、注意してアプローチする必要があります。

あるいは、ラスター計算を使用して、境界に沿った値のみを持つ整数グリッドを作成することにより、セレニウスのソリューションを促進することができますこれをポイントレイヤーに変換すると、ポイントが少なくなるため、すばやく簡単にできます。これを「境界層」と呼びましょう。境界層ポイントでグリッドをサンプリングし、グリッド値を境界層の属性テーブルにコピーします。元のポイントレイヤーで実行した後、サンプルが正常に取得されたすべてのポイントを削除します。境界層を残りのポイントに空間的に結合して、サンプリングプロセスを完了します。Sample

境界に沿った値のみでグリッド作成する 1つの方法は、境界に沿って失敗する焦点近傍演算を適用することです。例としては、勾配、陰影起伏、3 x 3近傍焦点統計の検索などがあります。これにより、1セルのグリッドが作成されますエッジの周りのNoDataの太いリング。IsNullとSetNullを使用してNoDataセルを検出し、NoDataとデータセルの間で変換すると、境界の周りを除いてNoData値でいっぱいのグリッドが生成されます。)


要約すると、ワークフローは、元のポイントレイヤーのテーブルの2つのフィールド(新しい座標)を計算し、それらの新しい座標からポイントイベントレイヤーを作成し、サンプルツールを実行し、データベース結合(空間結合ではない)を実行することで構成されます。 これを行う方法を詳しく説明してもらえますか?(あなたは私の問題の私の写真を見ることができます)。ありがとう!

約15%ポイントがこの問題を抱えています。各ポイントのx0とx1をどのように決定できますか?

1
@ x0、y0、x1、y1はグリッド用です。 ポイント座標(x、y)は、ArcGISヘルプまたはこのサイトのいくつかのスレッドで説明されているように、フィールド計算機で計算できます。XYポイントレイヤーとデータベース結合を作成するためのメニュー項目があります。これらは標準の基本的な操作です。
whuber

4

ラスターをポイント(ref)に変換してから、(ラスターからの)ポイントに対してポイントへの空間結合を実行できます。

昨日、ここでポイントを空間的に結合できることを学びまし


1
賢いアプローチの場合は+1。これが実行不可能になる大きなグリッドの場合、ラスターの境界セルのみをポイントに変換します。(返信の最後でその方法を説明します。)
whuber

私は各ラスターレイヤーに数千のセルがあり、そのような20のレイヤーがあるので、それらをベクターポイントに変換するには時間がかかります...
見られる

また、ラスターからポリゴンを作成しようとすると、「ERROR 000864入力ラスター:入力が定義されたドメイン内にありません」というエラーメッセージが表示されます。ERROR 000863:無効なGPデータタイプ

ラスターをポイントに変換するときにエラーが発生しますか?
djq

@celenius動作しますが、時間がかかりました。

1

Raster to Polygonツールを使用してラスターレイヤーをポリゴンに変換し、空間結合を実行することができます(ポイントレイヤーを右クリックして[結合と関連-結合]を選択し、最初のドロップダウンで空間結合オプションを選択して最も近いものを選択しますreadioボタンのオプション)、または近接ツールを使用します。


空間結合の結果を使用して、適切なラスター値をどのように抽出しますか?
whuber

@whuber、「データに最も近い」オプションを選択すると、[データの結合]ダイアログ内で、空間結合により最も近いポリゴンフィーチャ([ラスターからポリゴン]ツールの結果)が選択され、この属性情報がポイントフィーチャに追加されます。これはあなたが質問していたことですか?私の最初の返信は編集前に投稿されました。Seenのラスターが大きすぎてポリゴンに変換できなかったのではないでしょうか。
アートワーク21

目的は、最も近いラスターを見つけることではありません。実際に必要なのは、元の範囲を超えてラスターの値を推定する方法です。質問は、最近傍アプローチを提案します。ラスター上ではない任意の近接ポイントで、ラスター内の最も近いセルを見つけ、そのセルの値を使用します。
whuber

最後のコメントを読み直すと、ラスターを「ポリゴン」ではなく、各セル(または隣接するセルのセット)ごとに1つのポリゴンを持つポリゴンレイヤーに変換することを提案している可能性があります。その場合、非常に小さなラスターで成功する可能性がありますが、@ celeniusが以前に提供した同様のより効率的なソリューションの代わりに、これを提案するのはなぜですか?このソリューションにはどのような利点がありますか?
whuber

@whuber、ポリゴンレイヤーは正しいです。はい、celenius方式の方がメモリを節約できます。
アートワーク21
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.