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 : 마지막으로 ArcGIS 마스크 그리드, 데이터 파일 및 모든 포인트의 위치가 필요한 C ++ 코드를 사용 하여이 작업을 수행했습니다.


편집 2 : 최근에 R을 사용 하여이 보간 작업을 수행했습니다. 당신도 사용할 수 있습니다 hydroTSM, gstat또는 spacetime패키지를. 아래의 몇 가지 예제 링크 :

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

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


편집 3 : 미래 독자를 위해 아래에 실제 예제를 추가했습니다.


도움이 되겠습니까? 시계열
Brad Nesom

R에서 수행 할 수는 있지만 ArcMap에서 직접 수행하는 간단한 방법이 있다고 생각합니다. 원하는 모든 OP는 별도의 변수 (연도)를 반복하고 각 개별 변수에 대해 보간 된 래스터를 계산하는 것입니다. 이 예제의 값이 순차적 연도라는 사실은 차이가 없습니다.
Andy W

답장을 보내 주셔서 감사합니다. 실제로 IDW 도구를 마우스 오른쪽 버튼으로 클릭하면 배치 옵션이 있지만 시간별 또는 일별 데이터가있는 경우 여전히 지루한 작업입니다. KR
Tung

@thecatalyst-배치 IDW 도구가 작업을 수행하는 경우이를 답변으로 게시해야합니다. 지루할 수 있지만, 매년 강우량이 거의없는 경우가 많지 않으면 다른 솔루션을 검색 할 이유가 거의 없습니다.
Andy W

@Andy : 배치 도구는 숫자가 제한되어 있지만 약간 비현실적이라는 아이디어를 만드는 수백 개의 데이터가 있으면 도움이됩니다. 여전히이 문제의 해결책을 찾고 있습니다. KR
Tung

답변:


3

"Feature Selection"반복자를 모델에 삽입하여이 문제를 해결했습니다. (ModelBuilder 창의 삽입-> 반복기 메뉴 아래에 있습니다.)

시간 필드를 "group by"변수로 사용하십시오. 이렇게하면 모델이 피쳐 클래스에서 매번 한 번씩 반복됩니다.

그런 다음 원하는 보간 도구 (스플라인, IDW 등)를 반복기의 피처 출력에 연결합니다. 모델을 실행하고 몇 주 동안 휴가를 갔다가 돌아 오면 피쳐 클래스의 시점 수만큼 그리드가 생깁니다.

이 솔루션은 기능 세트의 각 레코드에 대해 단일 시점을 나타내는 날짜 또는 숫자 필드가있는 불연속 시간 샘플링 점이 있다고 가정합니다. "시작 시간"및 "종료 시간"형식을 사용하는 경우 그렇게 간단하지 않을 수 있습니다.


1
또한 출력 파일 이름 (또는 고유 한 파일 이름을 생성하는 다른 방법)에 "% n %"변수를 사용하는 것을 잊지 마십시오. 그렇지 않으면 반복 할 때마다 래스터를 덮어 쓸 수 있습니다. 자세한 내용은 help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… 또는 google "

TY. 다른 방법이 있다는 것을 아는 것이 좋습니다. 건배!
Tung

2

이 스레드는 IDW 도구에 의해 응답 된 것으로 보이지만 시작 연도를 요청하고 입력 한 다음 모델 빌더에서 인라인 변수를 사용하여 연도 필드를 반복하는 경우 모델링을 처리하는보다 우아한 방법입니다 .

추신 : 나는 @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 shapefile과 Prec 데이터 프레임 병합

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

Precipitation shapefile (UTM)을 사용하여 Precipitation 데이터 프레임 병합

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.