Как извлечь ячейки сетки модели из файла NetCDF, соответствующего определенным широтам и долготам, и показать оба на одном графике?

Я работаю с R только последние три недели, поэтому я очень новичок. В настоящее время я работаю с климатическими данными NetCDF по всей Новой Англии (путь). У меня также есть файл.csv с координатами конкретных городов, которые мы хотим посмотреть (towns.path). Мне удалось извлечь временной годовой временной ряд и тренд из ячеек сетки модели, соответствующих конкретным городам, из файла.csv. Проблема была в том, что я смог нанести на карту важные городские станции из моего файла.csv со средними годовыми данными.

Когда я запускаю строку сценария 'ave_annual_cities <- extract (year_ave_stack, towns.points, df = T)', я получаю график широты / долготы с точками моих важных городов. Когда я запускаю "plot (координировать (towns.points))" в консоли, я снова получаю график широты / долготы с моими важными точками городов, однако он стоит отдельно, отдельно от моего графика ave_annual_cities. Когда я запускаю 'levelplot (subset (year_ave_stack, 1), margin = F) + layer (sp.points (towns.points, plot.grid = TRUE))', я получаю график Новой Англии со среднегодовыми значениями.

Вот мой сценарий до сих пор.

#Coordinate CS lat/lon pull from Important City Stations
# imports the csv of lat/lon for specific cities
# reads the lat/lon of the .nc modeled climate files
# extracts the time annual time series and trend from model grid cells 
corresponding to your specific cities' locations.
#Graphs City points according to annual time series graph

# Libraries (probably do not need all)
library(survival)
library(lattice)
library(ncdf4)
library(RNetCDF)
library(date)
library(raster)
library(rasterVis)
library(latticeExtra)
library(RColorBrewer)
library(rgdal)
library(rgeos)
library(wux)

path <- "/net/nfs/merrimack/raid/Northeast_US_Downscaling_cmip5/"
vars = c("tasmin","tasmax")
mods = c("ACCESS1-0", "ACCESS1-3",
     "bcc-csm1-1-m", "bcc-csm1-1")
scns = c("rcp45", "rcp85")

cities.path <-
"/net/home/cv/marina/Summer2017_Projects/Lat_Lon/NE_Important_Cities.csv"
necity.vars <- c("City", "State", "Population", "Latitude", "Longitude", 
"Elevation(meters")

#These both read the .csv file (first uses 'utils', second uses 'wux')
#1
cities.read <- read.delim(cities.path, header = T, sep = ",")
#2
read.table <- read.wux.table(cities.path)
cities.read <- subset(cities.read, subreg = "City", sep = ",")

# To test one coordinate point
point_1 <- c("test.city", 44.31, -69.79)
colnames(point_1)<-c("cities", "latitude", "longitude" )

# To read only "Cities", "Latitude", and "Longitude"
cities.points <- subset(cities.read, select = c(1, 4, 5))
cities.points <- as.data.frame(cities.points)
colnames(cities.points)<- c("City", "Latitude", "Longitude" )

#Set plot coordinates for .csv graph
coordinates(cities.points) <- ~ Longitude + Latitude
proj4string(cities.points) <- c("+proj=longlat +datum=WGS84 +ellps=WGS84 
+towgs84=0,0,0") 

# Start loop to envelope all .nc files
for (iv in 1:2){
  for (im in 1:4){
    for (is in 1:2){
      for(i in 2006:2007){
        full<-paste(path, vars[iv], "_day_", mods[im], "_", scns[is], 
"_r1i1p1_", i, "0101-", i, "1231.16th.nc", sep="")
    # this will print out 
    #/net/nfs/merrimack/raid/Northeast_US_Downscaling_cmip5/NameOfFiles.nc

    # this line will print the full file name
    print(full)

    # use the brick function to read the full netCDF file.
    # note: the varname argument is not necessary, but if a file has multiple 
varables, brick will read the first one by default.
    air_t<-brick(full, varname=vars[iv])

    # use the calc function to get an average for each grid cell over the 
entire year
    annual_ave_t<-calc(air_t, fun = mean, na.rm=T)

        if(i == 2006){
          annual_ave_stack = annual_ave_t
        }else{
          annual_ave_stack<-stack(annual_ave_stack, annual_ave_t)
        }  # end of if/else 
      }   # end of year loop
      #extract annual means for grid cells for each year corresponding to 
 important cities
  ave_annual_cities <- extract(annual_ave_stack, cities.points, df = T)
    }   # end of scenario loop
  }   # end of model loop
}  # end of variable loop


levelplot(subset(annual_ave_stack, 1), margin=F) + 
  layer(sp.points(cities.points, plot.grid = TRUE))

# Read lat/lon from .nc climate files
# http://geog.uoregon.edu/bartlein/courses/geog607/Rmd/netCDF_01.htm
climate.data <- nc_open(full)
lat <- ncvar_get(climate.data, varid = "lat")
nlat <- dim("lat")
lat
lon <- ncvar_get(climate.data, varid =  "lon")
nlon <- dim("lon")
lon
  # This gives all lat data. 

#print long and lat variables: confirms the dimensions of the data
print(c(nlon, nlat))


  # If I need time series... 
my.time <- nc_open(climate.data, "time")
n.dates <- trunc(length(climate.data))
n.dates

# open NetCDF choosing pop and lat/lon points
cities.pop.points <- subset(cities.read, select = c(1, 3, 4, 5))
# print NetCDF coordinates with pop
print(cities.pop.points)

Надеюсь, это имеет смысл.

1 ответ

Если ваши входные данные правильно считываются как многоканальный растр, вы можете прочитать netcdf как растр, используя:

 r     <- raster::stack(path)
 cells <- raster::cellFromXY(r, xy)
 data  <- raster::extract(r, cells)

, где xy это матрица координат x/y, которую вы можете легко получить из вашего CSV, используя что-то в строках:

 as.matrix(csv_read(cities.path))

НТН

Другие вопросы по тегам