ArcGIS 10を使用して、ラスター内で最大値を持つピクセルを見つけ、その位置(ピクセルの中心)を10進度で返したいラスターがあります。このプロセスを反復して、ラスターの2番目に高い値の位置を返し、次に3番目、というように順番に繰り返して、最終的にラスター内で最も高い値を持つN個の位置のリストを順番に取得したいと思います。
Pythonスクリプトを使用してこれを行うのが最も簡単だと思いますが、もっと良い方法があれば他のアイデアを受け入れます。
ArcGIS 10を使用して、ラスター内で最大値を持つピクセルを見つけ、その位置(ピクセルの中心)を10進度で返したいラスターがあります。このプロセスを反復して、ラスターの2番目に高い値の位置を返し、次に3番目、というように順番に繰り返して、最終的にラスター内で最も高い値を持つN個の位置のリストを順番に取得したいと思います。
Pythonスクリプトを使用してこれを行うのが最も簡単だと思いますが、もっと良い方法があれば他のアイデアを受け入れます。
回答:
あなたが使用するために満足している場合は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つの方法は、最高値を見つけてマトリックスの位置を取得し、それを低い範囲に追加することです。
R
に読み込んだら、標準R
関数またはgetValues
メソッドを使用してセル値にアクセスできます。そこから、最高値とその場所を特定するのは簡単です。
答えが得られることにより合成緯度と経度のグリッドで値の最上位1%のインジケータグリッド。ArcGIS(まだ!40年後!)にはラスターデータをランク付けする手順がないため、このインジケーターグリッドを作成するのがコツです。
浮動小数点ラスターの1つのソリューションは反復的ですが、容赦なく迅速です。ましょうn個のデータセルの数です。経験的累積分布の値の全ての対(z、N(Z))で構成され、zは、グリッド内の値であり、N(z)は以下か等しい値を持つグリッド内のセルの数であり、Z。zで順序付けられたこれらの頂点のシーケンスから(-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つのレコードを読み取ることで取得できます。
私のソリューションは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