R或ArcGIS中的时空插值?


12

我正在尝试使用ArcGIS 9.3中的反加权距离工具从多个点计算平均降雨量。

我的问题是:每个点都有自己的时间序列,因此插值过程应该能够进行所有年份(可以说是迭代的一种)。

以下是样本属性表:

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:我最终使用C ++代码完成了此操作,这需要ArcGIS遮罩网格,数据文件和所有点的位置。


编辑2:我最近使用R来执行此插值任务。您可以使用hydroTSMgstatspacetime包。以下是几个示例链接:

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

感谢您的回复。右键单击IDW工具时,实际上有一个批处理选项,但是如果您有每小时或每天的数据,这仍然是一个非常繁琐的工作。KR
Tung

@thecatalyst-如果批处理IDW工具完成了该工作,则应将其发布为答案。尽管可能很乏味,但如果不频繁(因为每年的降雨估计很少),则没有理由寻找其他解决方案。
Andy W 2010年

@Andy:如果您的数量有限,但批处理工具会有所帮助,但是我有数百个数据,因此使用它的想法有些不切实际。我仍在寻找此问题的解决方案。KR
Tung

Answers:


3

我通过在模型中插入“功能选择”迭代器解决了这一问题。(在“模型构建器”窗口中,在“插入”->“迭代器”菜单下。)

将您的时间字段用作“分组依据”变量。这样,模型将在要素类中每次迭代一次。

然后将首选的插值工具(样条,IDW等)连接到迭代器输出的特征。运行模型,休假几个星期,然后回来,就可以得到与要素类中时间点数量相同的网格。

请注意,此解决方案假定您有离散的时间采样点,其中的日期或数字字段指示功能集中每个记录的单个时间点。如果您使用的是“开始时间”和“结束时间”格式,则可能不是那么简单。


1
另外,不要忘记在输出文件名中使用“%n%”变量(或其他生成唯一文件名的方法),否则每次迭代都可能会覆盖栅格。有关更多信息,请参见help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…或仅谷歌“使用ModelBuilder系统变量进行内联变量替换的示例”

TY。很高兴知道有另一种方法可以做到这一点。干杯!

2

看来该线程是由IDW工具回答的,但是如果您要请求和输入开始年份,然后使用模型构建器中的内联变量遍历Year字段,那么这将是处理建模的一种更优雅的方法。

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 shapefile合并

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

定义空间插值的范围。在每个方向上加大4公里

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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.