मैं एक रेखापुंज स्टैक से कई sf बिंदु फ़ाइलों के मान निकालना चाहूंगा। मैं जिस रैस्टर स्टैक के साथ काम कर रहा हूं, वह दैनिक मौसम डेटा का प्रतिनिधित्व करता है, और sf पॉइंट फाइलें जंगल की आग के पैरों के निशान का प्रतिनिधित्व करती हैं, जिस दिन बिंदु के जलने के दिन के अनुरूप एक विशेषता होती है। मैं इन बिंदु फ़ाइलों के लिए मौसम डेटा निकालना चाहता हूं, विशेष रूप से उस दिन के लिए मौसम डेटा निकालना जिस दिन बिंदु जला दिया गया था।

मैंने रैस्टर स्टैक लेयर नामों का नाम बदलकर जूलियन डे करने में कुछ प्रगति की है, और रैस्टर स्टैक को ब्याज के दिन के लिए सबसेट किया है। जैसा कि यह पता चला है, मुझे raster::extract काम करने के लिए sf ऑब्जेक्ट को एक स्थानिक वस्तु में बदलने की आवश्यकता है। वास्तव में मुश्किल हिस्सा प्रत्येक बिंदु के लिए जलने के दिन के आधार पर रेखापुंज स्टैक को कम करना है।

मैं यह देख सकता हूं कि मैं sf बिंदु वस्तु और rbind परिणामों के माध्यम से कैसे पुनरावृति कर सकता हूं, लेकिन क्या यह विशाल लूप वास्तव में यह काम करने का एकमात्र तरीका है?

library(raster)
library(sf)
library(rgdal)
library(lubridate)

आगे मैंने चूहों को ढेर किया, जो आर्क ग्रिड हैं।

fwi.list <- list.files(path = "C:/Example/", pattern="fwi")
fwi.stack <- stack(fwi.list)
crs(fwi.stack) <- "+proj=lcc +lat_1=50 +lat_2=70 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs"

print(fwi.stack)
    class      : RasterStack 
dimensions : 1600, 1900, 3040000, 153  (nrow, ncol, ncell, nlayers)
resolution : 3000, 3000  (x, y)
extent     : -2600000, 3100000, -885076, 3914924  (xmin, xmax, ymin, ymax)
crs        : +proj=lcc +lat_1=50 +lat_2=70 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
names      : X121, X122, X123, X124, X125, X126, X127, X128, X129, X130, X131, X132, X133, X134, X135, ... 
min values :    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, ... 
max values : 1138,  681,  690,  662,  873,  618,  417,  893,  440,  511,  805,  522,  575,  543,  540, ... 

यहाँ sf पॉइंटफाइल है। ट्रिक यह होगी कि fwi को jday attre के आधार पर प्रत्येक बिंदु पर असाइन किया जाए

GRID.PT <- st_read("C:/Example/470_2015.shp")
GRID.PT

Simple feature collection with 2126 features and 1 field
geometry type:  POINT
dimension:      XY
bbox:           xmin: -1039086 ymin: 2078687 xmax: -1015336 ymax: 2095187
epsg (SRID):    NA
proj4string:    +proj=lcc +lat_1=50 +lat_2=70 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
First 10 features:
                   geometry DOB
1  POINT (-1026836 2095187) 183
2  POINT (-1026336 2095187) 183
3  POINT (-1026086 2095187) 183
4  POINT (-1025836 2095187) 183
5  POINT (-1027336 2094937) 183
6  POINT (-1027086 2094937) 183
7  POINT (-1026836 2094937) 183
8  POINT (-1026586 2094937) 183
9  POINT (-1026086 2094937) 183
10 POINT (-1025836 2094937) 183

तो, मुझे इस बारे में कैसे जाना चाहिए? मुझे यकीन है कि इसमें raster::subset और raster::extract शामिल हैं, शायद कुछ ऐसा: extract(subset(fwi.stack, paste0("X", GRID.PT$DOB[x])), as(GRID.PT, "Spatial"))

लेकिन क्या मुझे इसे एक फ़ंक्शन के रूप में लिखना चाहिए और lapply का उपयोग करना चाहिए? या मुझे एक बड़े लूप का उपयोग करना चाहिए? आपकी मदद के लिए धन्यवाद, एसओ।

0
QBarber 16 अप्रैल 2020, 00:20

1 उत्तर

सबसे बढ़िया उत्तर

मैंने इसके लिए एक सरल प्रतिकृति उदाहरण बनाया है, उम्मीद है कि यह आपके सामने आने वाली समस्या को हल करने के तरीके में कुछ अंतर्दृष्टि देगा।

## Set up the raster
test.r <- raster( matrix( nrow=5,
                          ncol=5,
                          data = rep(1,25) 
                          ) 
                  )
extent(test.r) <- c(0,5,0,5)
test.r[] <- 5

## Set up a stack
test.r <- stack(test.r,
                test.r+1,
                test.r+2,
                test.r+3,
                test.r+4)
## Name them in a similar fashion
names(test.r) <- paste0("X",1:5)

## Generate some point data
pts <- SpatialPoints(coords = matrix(ncol=2,
                                     c(rep(seq(0.5,4.5,1),6)
                                       )
                                     )
                     )

## Make it 'sf' for applicability
pts <- as(pts,"sf")

pts$val <- rep(1:5,3)

## Perform lapply that assigns values within
lapply( unique( pts$val ), function(x){

  pt <- pts[ pts$val == x, ]
  rast <- test.r[[ grep( x, names( test.r ) ) ] ]

  pts[ pts$val == x, "rast_val" ] <<- extract( rast, pt )

})

## Or in 1 line

lapply( unique( pts$val ), function(x){

  pts[ pts$val == x, "rast_val" ] <<- extract( test.r[[ grep( x, names( test.r ) ) ] ], 
                                               pts[ pts$val == x, ])

})

2
Badger 16 अप्रैल 2020, 14:11