การประมาณค่าเชิงพื้นที่ใน R หรือ ArcGIS?


12

ฉันกำลังพยายามคำนวณค่าปริมาณน้ำฝนเฉลี่ยจากหลาย ๆ จุดโดยใช้เครื่องมือ Inverse Weighted Distance ใน 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 เพื่อทำงานการแก้ไขนี้ คุณสามารถใช้อย่างใดอย่างหนึ่ง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
ตุง

@thecatalyst - หากเครื่องมือ IDW แบบกลุ่มทำงานได้คุณควรโพสต์เป็นคำตอบ แม้ว่ามันอาจจะน่าเบื่อถ้ามันไม่บ่อยนัก (เนื่องจากการประมาณการปริมาณน้ำฝนรายปีไม่บ่อยนัก) ก็มีเหตุผลเล็กน้อยที่จะค้นหาวิธีแก้ไขปัญหาอื่น ๆ
Andy W

@ Andy: เครื่องมือชุดงานจะช่วยถ้าคุณมีจำนวน จำกัด แต่ฉันมีข้อมูลนับร้อยซึ่งทำให้ความคิดในการใช้มันไม่สมจริงนิดหน่อย ฉันยังคงค้นหาวิธีการแก้ไขปัญหานี้ KR
ตุง

คำตอบ:


3

ฉันแก้ไขได้โดยใส่ตัววนซ้ำ "การเลือกคุณลักษณะ" ลงในแบบจำลอง (ในหน้าต่าง ModelBuilder ภายใต้เมนูแทรก -> ตัววนซ้ำ)

ใช้ฟิลด์เวลาของคุณเป็นตัวแปร "จัดกลุ่มตาม" ด้วยการทำเช่นนี้โมเดลจะวนซ้ำหนึ่งครั้งในแต่ละครั้งในคลาสคุณลักษณะของคุณ

จากนั้นแนบเครื่องมือการแก้ไขที่คุณต้องการ (spline, IDW, อะไรก็ตาม) ไปยังเอาต์พุตคุณลักษณะจากตัววนซ้ำ ใช้แบบจำลองไปเที่ยวพักผ่อนสักสองสามสัปดาห์และเมื่อคุณกลับมาคุณจะมีกริดมากเท่าที่คุณมีคะแนนเวลาในคลาสคุณลักษณะ

โปรดทราบว่าโซลูชันนี้จะถือว่าคุณมีจุดสุ่มตัวอย่างเวลาแบบไม่ต่อเนื่องพร้อมวันที่หรือฟิลด์ตัวเลขที่ระบุจุดเวลาเดียวสำหรับแต่ละระเบียนในชุดคุณลักษณะของคุณ หากคุณใช้รูปแบบ "เวลาเริ่มต้น" และ "เวลาสิ้นสุด" อาจไม่ตรงไปตรงมา


1
นอกจากนี้อย่าลืมใช้ตัวแปร "% n%" ในชื่อไฟล์เอาต์พุตของคุณ (หรือวิธีอื่นในการสร้างชื่อไฟล์ที่ไม่ซ้ำกัน) มิฉะนั้นคุณอาจเขียนทับคุณซ้ำได้ทุกครั้ง สำหรับข้อมูลเพิ่มเติมดูhelp.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…หรือเพียงแค่ google "ตัวอย่างของการทดแทนตัวแปรในบรรทัดด้วยตัวแปรระบบ

TY เป็นการดีที่จะรู้ว่ามีวิธีอื่นในการทำเช่นนั้น ไชโย!
ตุง

2

ดูเหมือนว่าเธรดนี้จะตอบโดยเครื่องมือ IDW แต่ถ้าคุณต้องการขอและป้อนข้อมูลของปีเริ่มต้นจากนั้นวนซ้ำในฟิลด์ปีโดยใช้ตัวแปร inline ในตัวสร้างแบบจำลองดังนั้นนี่จะเป็นวิธีที่สง่างามกว่าในการจัดการการสร้างแบบจำลอง .

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)

ผสานกรอบข้อมูลปริมาณน้ำฝนกับ Shapefile ฝนตก (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)

สร้างกริดที่ต้องการที่ความละเอียด 1 กม

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.