ArcGIS Desktopを使用してラスター内の最高値の場所を検索しますか?


12

ArcGIS 10を使用して、ラスター内で最大値を持つピクセルを見つけ、その位置(ピクセルの中心)を10進度で返したいラスターがあります。このプロセスを反復して、ラスターの2番目に高い値の位置を返し、次に3番目、というように順番に繰り返して、最終的にラスター内で最も高い値を持つN個の位置のリストを順番に取得したいと思います。

Pythonスクリプトを使用してこれを行うのが最も簡単だと思いますが、もっと良い方法があれば他のアイデアを受け入れます。


グリッドをポイントに変換してから、X、Yフィールドを追加してソートしようとしましたか?
ヤクブSisak GeoGraphics

ラスタ値は浮動ですか、それとも整数ですか?
whuber

@Jakub-いいえ。私はおそらくポイントの上位1%程度にしか興味がないので、すべてのポイントにx、yフィールドを追加してソートする価値があるかどうかはわかりません。より効率的なオプションがない場合はどうでしょうか?
mga

@whuber-ラスター値はフロートです。
mga

@mga、試してみる価値があります。変換は非常に高速で、XYの追加もデフォルトのツールです。不要なレコードの削除は簡単な操作であり、すべてを1つのモデルにまとめることができます。ただのアイデア。
ヤクブSisak GeoGraphics

回答:


5

あなたが使用するために満足している場合はRを、と呼ばれるパッケージがあるラスタは。次のコマンドを使用して、ラスターを読み込むことができます。

install.packages('raster')
library(raster)
test <- raster('F:/myraster')

次に、(を入力してtest)見に行くと、次の情報が表示されます。

class       : RasterLayer 
dimensions  : 494, 427, 210938  (nrow, ncol, ncell)
resolution  : 200, 200  (x, y)
extent      : 1022155, 1107555, 1220237, 1319037  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=23 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs +towgs84=0,0,0 
values      : F:/myraster 
min value   : 0 
max value   : 1 

ラスターを操作するためのより良い方法があるかもしれませんが、必要な情報を見つける1つの方法は、最高値を見つけてマトリックスの位置を取得し、それを低い範囲に追加することです。


1
+1この参照用。ラスタをRに読み込んだら、標準R関数またはgetValuesメソッドを使用してセル値にアクセスできます。そこから、最高値とその場所を特定するのは簡単です。
whuber

1
あなたの推薦のおかげで、これが私がやったことです。Rでラスターパッケージを使用するのは、ArcGISでこれを試すのに比べて簡単です。Rの他の空間分析も引き続き使用しており、結果に非常に満足しています。素晴らしいアドバイス!
mga

8

答えが得られることにより合成緯度と経度のグリッドで値の最上位1%のインジケータグリッド。ArcGIS(まだ!40年後!)にはラスターデータをランク付けする手順がないため、このインジケーターグリッドを作成するのがコツです。

浮動小数点ラスターの1つのソリューションは反復的ですが、容赦なく迅速です。ましょうn個のデータセルの数です。経験的累積分布の値の全ての対(z、N(Z))で構成され、zは、グリッド内の値であり、N(z)は以下か等しい値を持つグリッド内のセルの数であり、Zzで順序付けられたこれらの頂点のシーケンスから(-infinity、0)を(+ infinity、n)に接続する曲線を取得します。これにより、関数fが定義されます。ここで、(z、f(z))は常に曲線上にあります。この曲線上の点(z0、0.99 * n)を見つけたいと思います。

つまり、タスクはf(z)-(1-0.01)* nのゼロを見つけることです。これを任意のゼロ検出ルーチンで実行します(任意の関数を処理できます:これは微分不可能です)。最も単純で、多くの場合効率的ですが、推測とチェックです。最初は、z0が最小値zMinと最大zMaxの間にあることがわかります。これら2つの間の合理的な値を厳密に推測します。推測が低すぎる場合は、zMin = z0を設定します。それ以外の場合は、zMax = z0に設定します。繰り返します。ソリューションにすぐに収束します。zMaxとzMinが十分に近い場合、十分に近くなります。保守的にするために、ソリューションとしてzMinの最終値を選択します。それは、後で破棄できるいくつかの余分なポイントを拾う可能性があります。より洗練されたアプローチについては、数値レシピの第9章を参照してください。 (リンクは古い無料バージョンに移動します)。

このアルゴリズムを振り返ると、2種類のラスター操作のみを実行する必要があることがわかります。(1)あるターゲット値以下のすべてのセルを選択し、(2)選択したセルをカウントします。これらは、最も単純で最速の操作です。(2)ゾーンカウントとして、または選択グリッドの属性テーブルから1つのレコードを読み取ることで取得できます。


7

私のソリューションはGDALを使用していますが(これはArcGISだけではありません)、しばらく前にこれを行いました。ArcGIS 10のラスターからNumPy配列を取得できると思いますが、よくわかりません。NumPyは、シンプルで強力な配列インデックスargsortを提供します。この例では、NODATAを処理したり、座標を投影から緯度/経度に変換したりしません(ただし、GDALで提供されるosgeo.osrを使用するのは難しくありません)

import numpy as np
from osgeo import gdal

# Open raster file, and get GeoTransform
rast_src = gdal.Open(rast_fname)
rast_gt = rast_src.GetGeoTransform()

def get_xy(r, c):
    '''Get (x, y) raster centre coordinate at row, column'''
    x0, dx, rx, y0, ry, dy = rast_gt
    return(x0 + r*dx + dx/2.0, y0 + c*dy + dy/2.0)

# Get first raster band
rast_band = rast_src.GetRasterBand(1)

# Retrieve as NumPy array to do the serious work
rast = rast_band.ReadAsArray()

# Sort raster pixels from highest to lowest
sorted_ind = rast.argsort(axis=None)[::-1]

# Show highest top 10 values
for ind in sorted_ind[:10]:
    # Get row, column for index
    r, c = np.unravel_index(ind, rast.shape)
    # Get [projected] X and Y coordinates
    x, y = get_xy(r, c)
    print('[%3i, %3i] (%.3f, %.3f) = %.3f'%
          (r, c, x, y, rast[r, c]))

テストラスターファイルについて次を表示します。

[467, 169] (2813700.000, 6353100.000) = 844.538
[467, 168] (2813700.000, 6353200.000) = 841.067
[469, 168] (2813900.000, 6353200.000) = 840.705
[468, 168] (2813800.000, 6353200.000) = 840.192
[470, 167] (2814000.000, 6353300.000) = 837.063
[468, 169] (2813800.000, 6353100.000) = 837.063
[482, 166] (2815200.000, 6353400.000) = 833.038
[469, 167] (2813900.000, 6353300.000) = 832.825
[451, 181] (2812100.000, 6351900.000) = 828.064
[469, 169] (2813900.000, 6353100.000) = 827.514

+1これを共有してくれてありがとう。制限としてNoDataを処理できないことはありません。続行する前に、すべてのNoDataを極端に負の値に変換するだけです。また、グリッドの再投影が発生した場合、グリッドのリサンプリングにより回答が変更される可能性があるため、通常、このような計算中に再投影が自動的に行われることは望ましくありません。代わりに、報告された座標を後で再投影できます。したがって、ソリューションは完全に一般的です。
whuber

NODATA処理は、まずラスタから値を取得しNODATA = rast_band.GetNoDataValue()、次にNaN値(rast[rast == NODATA] = np.nan)またはマスク配列rast = np.ma.array(rast, mask=(rast == NODATA)))を使用して実装できます。より複雑なトリックはargsort、分析からNODATA値を何らかの方法で削除するか、NaN /マスクされている場合は単にforループをスキップすることです。
マイクT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.