RまたはArcGISでの時空間補間?


12

ArcGIS 9.3のInverse Weighted Distanceツールを使用して、複数のポイントから平均降雨値を計算しようとしています。

私の問題は、各ポイントに独自の時系列があるため、補間プロセスはすべての年(いわば反復の種類)実行できる必要があるということです。

サンプル属性テーブルは次のとおりです。

ID X Y Name Rain1990 Rain1991 Rain1992 Rain1993 .... Rain2010

1 xx1 yy1 AA 1210 1189 1863 1269 ......  
2 xx2 yy2 BB 1492 1502 2187 1923 ......
......

誰もそれを行う方法を教えてもらえますか?


編集1:最終的に、ArcGISマスクグリッド、データファイル、すべてのポイントの場所を必要とするC ++コードを使用してこれを行いました。


編集2:最近、この補間タスクを行うためにRを使用しました。hydroTSMgstatまたはspacetimeパッケージのいずれかを使用できます。以下のリンク例はほとんどありません。

http://spatial-analyst.net/wiki/index.php?title=Spatial_interpolation_exercises_%28NL%29

http://www.geostat-course.org/Topic_Bivand_2012


編集3:将来の読者のために、以下の作業例を追加しました


これは役立ちますか?時系列
ブラッドネソム

Rで実行できますが、ArcMapで直接実行する簡単な方法があると思います。OPが望むのは、個別の変数(年)を反復処理し、個別の変数ごとに補間されたラスタを計算することです。この例の値が連続した年であるという事実に違いはありません。
アンディW

返信のThx。実際、IDWツールを右クリックするとバッチオプションがありますが、1時間ごとまたは1日ごとのデータがある場合、それでもかなり面倒です。KR

@thecatalyst-バッチIDWツールがジョブを実行する場合、回答として投稿する必要があります。退屈かもしれませんが、それがまれである場合(年次降雨量の推定がまれなので)、他の解決策を探す理由はほとんどありません。
アンディW

@Andy:数が限られている場合はバッチツールが役立ちますが、数百のデータがあるため、それを使用するという考えは少し非現実的です。私はまだこの問題の解決策を探しています。KR

回答:


3

「Feature Selection」イテレータをモデルに挿入することでこれを解決しました。(ModelBuilderウィンドウの[挿入]-> [イテレータ]メニュー。)

時間フィールドを「グループ化」変数として使用します。これを行うことにより、モデルはフィーチャクラスで毎回1回繰り返されます。

次に、好みの補間ツール(スプライン、IDWなど)をイテレータからのフィーチャ出力にアタッチします。モデルを実行し、数週間休暇を取ります。戻ってくると、フィーチャクラスの時点と同じ数のグリッドが作成されます。

このソリューションでは、フィーチャセットの各レコードの単一の時点を示す日付フィールドまたは数値フィールドを持つ離散時間サンプリングポイントがあることを前提としています。「開始時刻」および「終了時刻」の形式を使用している場合、それほど単純ではない場合があります。


1
また、出力ファイル名に「%n%」変数を使用すること(または一意のファイル名を生成する他の方法)を忘れないでください。そうしないと、反復ごとにラスターを上書きできます。詳細については、help.arcgis.com / en / arcgisdesktop / 10.0 / help / index.html//…またはGoogleの「ModelBuilderシステム変数を使用したインライン変数置換の例」

TY。別の方法があります。乾杯!

2

このスレッドはIDWツールによって回答されているようですが、開始年を要求して入力し、モデルビルダーでインライン変数を使用して年フィールドを反復処理する場合、これはモデリングを処理するよりエレガントな方法です。

PS:私は@AndyWに同意します。IDWを使用して解決した場合は、自分で回答として投稿し、「目盛りを付けて」


1

Rランダムな降水量データを使用して独自のソリューションを追加する

library(tidyverse)
library(sp) # for coordinates, CRS, proj4string, etc
library(gstat)
library(maptools)

# Coordinates of gridded precipitation cells
precGridPts <- ("ID lat long
                1 46.78125 -121.46875
                2 46.84375 -121.53125
                3 46.84375 -121.46875
                4 46.84375 -121.40625
                5 46.84375 -121.34375
                6 46.90625 -121.53125
                7 46.90625 -121.46875
                8 46.90625 -121.40625
                9 46.90625 -121.34375
                10 46.90625 -121.28125
                11 46.96875 -121.46875
                12 46.96875 -121.40625
                13 46.96875 -121.34375
                14 46.96875 -121.28125
                15 46.96875 -121.21875
                16 46.96875 -121.15625
                ")

# Read precipitation cells
precGridPtsdf <- read.table(text = precGridPts, header = TRUE)

spオブジェクトに変換する

sp::coordinates(precGridPtsdf) <- ~long + lat # longitude first

空間参照系(SRS)または座標参照系(CRS)を追加します。

# CRS database: http://spatialreference.org/ref/epsg/
sp::proj4string(precGridPtsdf) <- sp::CRS("+proj=longlat +ellps=WGS84 +datum=WGS84")
str(precGridPtsdf)
#> Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
#>   ..@ data       :'data.frame':  16 obs. of  1 variable:
#>   .. ..$ ID: int [1:16] 1 2 3 4 5 6 7 8 9 10 ...
#>   ..@ coords.nrs : int [1:2] 3 2
#>   ..@ coords     : num [1:16, 1:2] -121 -122 -121 -121 -121 ...
#>   .. ..- attr(*, "dimnames")=List of 2
#>   .. .. ..$ : chr [1:16] "1" "2" "3" "4" ...
#>   .. .. ..$ : chr [1:2] "long" "lat"
#>   ..@ bbox       : num [1:2, 1:2] -121.5 46.8 -121.2 47
#>   .. ..- attr(*, "dimnames")=List of 2
#>   .. .. ..$ : chr [1:2] "long" "lat"
#>   .. .. ..$ : chr [1:2] "min" "max"
#>   ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot
#>   .. .. ..@ projargs: chr "+proj=longlat +ellps=WGS84 +datum=WGS84 +towgs84=0,0,0"

UTM 10Nに変換

utm10n <- "+proj=utm +zone=10 ellps=WGS84"
precGridPtsdf_UTM <- spTransform(precGridPtsdf, CRS(utm10n))

ポアソン分布を使用して生成された仮想年間降水量データ。

precDataTxt <- ("ID PRCP2016 PRCP2017 PRCP2018
                1 2125 2099 2203
                2 2075 2160 2119
                3 2170 2153 2180
                4 2130 2118 2153
                5 2170 2083 2179
                6 2109 2008 2107
                7 2109 2189 2093
                8 2058 2170 2067
                9 2154 2119 2139
                10 2056 2184 2120
                11 2080 2123 2107
                12 2110 2150 2175
                13 2176 2105 2126
                14 2088 2057 2199
                15 2032 2029 2100
                16 2133 2108 2006"
)

precData <- read_table2(precDataTxt, col_types = cols(ID = "i"))

PrecデータフレームとPrecシェープファイルをマージする

precGridPtsdf <- merge(precGridPtsdf, precData, by.x = "ID", by.y = "ID")
precdf <- data.frame(precGridPtsdf)

降水データフレームと降水シェープファイル(UTM)のマージ

precGridPtsdf_UTM <- merge(precGridPtsdf_UTM, precData, by.x = "ID", by.y = "ID")

# sample extent
region_extent <- structure(c(612566.169007975, 5185395.70942594, 639349.654465079, 
                             5205871.0782451), .Dim = c(2L, 2L), .Dimnames = list(c("x", "y"
                             ), c("min", "max")))

空間補間の範囲を定義します。各方向に4km大きくする

x.range <- c(region_extent[1] - 4000, region_extent[3] + 4000)
y.range <- c(region_extent[2] - 4000, region_extent[4] + 4000)

1kmの解像度で目的のグリッドを作成します

grd <- expand.grid(x = seq(from = x.range[1], to = x.range[2], by = 1000), 
                   y = seq(from = y.range[1], to = y.range[2], by = 1000))   

# Convert grid to spatial object
coordinates(grd) <- ~x + y
# Use the same projection as boundary_UTM
proj4string(grd) <- "+proj=utm +zone=10 ellps=WGS84 +ellps=WGS84"
gridded(grd) <- TRUE

逆距離加重(IDW)を使用した内挿

idw <- idw(formula = PRCP2016 ~ 1, locations = precGridPtsdf_UTM, newdata = grd)  
#> [inverse distance weighted interpolation]

# Clean up
idw.output = as.data.frame(idw)
names(idw.output)[1:3] <- c("Longitude", "Latitude", "Precipitation")

precdf_UTM <- data.frame(precGridPtsdf_UTM)

補間結果をプロットする

idwPlt1 <- ggplot() + 
  geom_tile(data = idw.output, aes(x = Longitude, y = Latitude, fill = Precipitation)) +
  geom_point(data = precdf_UTM, aes(x = long, y = lat, size = PRCP2016), shape = 21, colour = "red") +
  viridis::scale_fill_viridis() + 
  scale_size_continuous(name = "") +
  theme_bw() +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  theme(axis.text.y = element_text(angle = 90)) +
  theme(axis.title.y = element_text(margin = margin(t = 0, r = 10, b = 0, l = 0))) 
idwPlt1

### Now looping through every year 
list.idw <- colnames(precData)[-1] %>% 
  set_names() %>% 
  map(., ~ idw(as.formula(paste(.x, "~ 1")), 
               locations = precGridPtsdf_UTM, newdata = grd)) 

#> [inverse distance weighted interpolation]
#> [inverse distance weighted interpolation]
#> [inverse distance weighted interpolation]

idw.output.df = as.data.frame(list.idw) %>% as.tibble()
idw.output.df

#> # A tibble: 1,015 x 12
#>    PRCP2016.x PRCP2016.y PRCP2016.var1.pred PRCP2016.var1.var PRCP2017.x
#>  *      <dbl>      <dbl>              <dbl>             <dbl>      <dbl>
#>  1    608566.   5181396.              2114.                NA    608566.
#>  2    609566.   5181396.              2115.                NA    609566.
#>  3    610566.   5181396.              2116.                NA    610566.
#>  4    611566.   5181396.              2117.                NA    611566.
#>  5    612566.   5181396.              2119.                NA    612566.
#>  6    613566.   5181396.              2121.                NA    613566.
#>  7    614566.   5181396.              2123.                NA    614566.
#>  8    615566.   5181396.              2124.                NA    615566.
#>  9    616566.   5181396.              2125.                NA    616566.
#> 10    617566.   5181396.              2125.                NA    617566.
#> # ... with 1,005 more rows, and 7 more variables: PRCP2017.y <dbl>,
#> #   PRCP2017.var1.pred <dbl>, PRCP2017.var1.var <dbl>, PRCP2018.x <dbl>,
#> #   PRCP2018.y <dbl>, PRCP2018.var1.pred <dbl>, PRCP2018.var1.var <dbl>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.