Nội suy không gian-thời gian trong R hoặc ArcGIS?


12

Tôi đang cố gắng tính giá trị lượng mưa trung bình từ một số điểm bằng công cụ Khoảng cách có trọng số nghịch đảo trong ArcGIS 9.3.

Vấn đề của tôi là: mỗi điểm có chuỗi thời gian riêng, do đó, quá trình nội suy sẽ có thể được thực hiện trong tất cả các năm (loại lặp để nói).

Dưới đây là bảng thuộc tính mẫu:

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 ......
......

Ai đó có thể chỉ cho tôi làm thế nào để làm điều đó?


Chỉnh sửa 1: Cuối cùng tôi đã làm điều này bằng cách sử dụng mã C ++ yêu cầu lưới mặt nạ ArcGIS, tệp dữ liệu & vị trí của tất cả các điểm.


Chỉnh sửa 2: Gần đây tôi đã sử dụng R để thực hiện tác vụ nội suy này. Bạn có thể sử dụng một trong hai hydroTSM, gstathoặc spacetimegói. Một vài ví dụ liên kết dưới đây:

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

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


Chỉnh sửa 3: Đã thêm một ví dụ hoạt động dưới đây cho độc giả tương lai


Điều này sẽ giúp? Chuỗi thời gian
Brad Nesom

Nó có thể được thực hiện trong R, nhưng tôi tưởng tượng có một cách đơn giản để làm điều đó trực tiếp trong ArcMap. Tất cả những gì OP muốn là lặp qua các biến riêng biệt (năm) và tính toán raster nội suy cho từng biến riêng biệt. Thực tế là các giá trị trong ví dụ này là các năm liên tiếp không có sự khác biệt.
Andy W

Thx cho câu trả lời của bạn. Trên thực tế, có một tùy chọn hàng loạt khi nhấp chuột phải vào công cụ IDW nhưng vẫn là một công việc khá tẻ nhạt nếu bạn có dữ liệu hàng giờ hoặc hàng ngày. KR
Tung

@thecirthyst - Nếu công cụ IDW hàng loạt thực hiện công việc thì bạn nên đăng nó dưới dạng câu trả lời. Mặc dù nó có thể tẻ nhạt, nhưng nếu nó không thường xuyên (vì ước tính lượng mưa hàng năm không thường xuyên) thì có rất ít lý do để tìm kiếm các giải pháp khác.
Andy W

@Andy: Công cụ bó sẽ giúp ích nếu bạn có số lượng hạn chế nhưng tôi có hàng trăm dữ liệu khiến ý tưởng sử dụng nó hơi phi thực tế. Tôi vẫn đang tìm kiếm giải pháp cho vấn đề này. KR
Tung

Câu trả lời:


3

Tôi đã giải quyết điều này bằng cách chèn một trình lặp "Tính năng lựa chọn" vào một mô hình. (Trong Cửa sổ ModelBuilder, trong menu Chèn-> Trình lặp.)

Sử dụng trường thời gian của bạn làm biến "nhóm theo" của bạn. Bằng cách này, mô hình sẽ lặp lại một lần cho mỗi lần trong lớp tính năng của bạn.

Sau đó đính kèm công cụ nội suy ưa thích của bạn (spline, IDW, bất cứ thứ gì) vào đầu ra tính năng từ iterator. Chạy mô hình, đi nghỉ trong vài tuần và khi bạn quay lại, bạn sẽ có nhiều lưới như bạn có điểm thời gian trong lớp tính năng.

Lưu ý rằng giải pháp này giả định rằng bạn có các điểm lấy mẫu thời gian riêng biệt với trường ngày hoặc số chỉ ra một điểm thời gian duy nhất cho mỗi bản ghi trong bộ tính năng của bạn. Nếu bạn đang sử dụng định dạng "thời gian bắt đầu" và "thời gian kết thúc", nó có thể không quá đơn giản.


1
Ngoài ra, đừng quên sử dụng biến "% n%" trong tên tệp đầu ra của bạn (hoặc một số cách khác để tạo một tên tệp duy nhất), nếu không bạn có thể ghi đè lên raster mỗi lần lặp. Để biết thêm thông tin, hãy xem help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//. Hoặc chỉ google "Ví dụ về thay thế biến đổi nội dòng bằng các biến hệ thống ModelBuilder"

TY. Thật tốt khi biết có một cách khác để làm điều đó. Chúc mừng!
Tùng

2

Có vẻ như chủ đề này được trả lời bởi công cụ IDW, nhưng nếu bạn yêu cầu và nhập vào năm bắt đầu và sau đó lặp qua các trường năm bằng cách sử dụng một biến nội tuyến trong trình tạo mô hình thì đây sẽ là một cách thanh lịch hơn để xử lý mô hình .

PS: Tôi đồng ý với @AndyW rằng nếu bạn đã giải quyết nó bằng IDW, hãy tự đăng bài dưới dạng câu trả lời và sau đó "đánh dấu bằng dấu"


1

Thêm giải pháp của riêng tôi bằng cách sử dụng R& dữ liệu lượng mưa ngẫu nhiên

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)

Chuyển đổi thành một đối tượng sp

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

Thêm hệ thống tham chiếu không gian (SRS) hoặc hệ tọa độ tham chiếu (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"

Chuyển đổi sang UTM 10N

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

Dữ liệu lượng mưa hàng năm giả thuyết được tạo bằng phân phối Poisson.

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

Hợp nhất khung dữ liệu Prec với shapefile

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

Hợp nhất khung dữ liệu lượng mưa với shapefile kết tủa (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")))

Xác định phạm vi cho nội suy không gian. Làm cho nó lớn hơn 4km trên mỗi hướng

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

Tạo lưới mong muốn ở độ phân giải 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

Nội suy bằng Trọng số khoảng cách nghịch đảo (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)

Vẽ kết quả nội suy

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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.