简体   繁体   中英

How to extract data point for a xy coordiante from raster without projected lat lopn coordinates

Hi am trying to extract values for xy point from a sample raster stack ras_dt . The ras_dt is EQUATES data with gridded coordinates within the domain of -115.00,38.00,-110.05,45.00 . How can I change the projection and the lat lon coordinates of this raster stack so that I can extract data for point xy as in the code below.

library(raster)
dturl<- "https://www.dropbox.com/s/ztxqpszjfjhpavz/EQUATES_ACONC_O3_SAM.nc?dl=1"
download.file(dturl, "EQUATES_ACONC_O3_SAM.nc")
ras_dt <- raster::stack("EQUATES_ACONC_O3_SAM.nc",varname = "O3") 
ras_dt

# the data domain is -115.00,38.00,-110.05,45.00
plot(ras_dt)

xy <- data.frame(lon=-113.0,lat=40.0)
coordinates(xy) <-  ~lon + lat
extr_dt <- raster::extract(ras_dt, xy) # how to get O3 values for xy here?
extr_dt

The ras_dt is in "lambertConformalProjection" with following info:

char LambertConformalProjection;
  :grid_mapping_name = "lambert_conformal_conic";
  :latitude_of_projection_origin = 40.0; // double
  :longitude_of_central_meridian = -97.0; // double
  :standard_parallel = 33.0, 45.0; // double
  :earth_radius = 6370000.0; // double
  :_CoordinateTransformType = "Projection";
  :_CoordinateAxes = "x y";

You need to set the extent and the coordinate reference system (CRS). Then transform your lon/lat points to that CRS and use extract. From your edited question we now have the CRS.

You specify the "domain", but you need to coordinates in the actual CRS. I do not know what these are, so I will guestimate it, but it will not be correct.

The data

library(terra)
dturl<- "https://www.dropbox.com/s/ztxqpszjfjhpavz/EQUATES_ACONC_O3_SAM.nc?dl=1"
download.file(dturl, "EQUATES_ACONC_O3_SAM.nc", mode="wb")
ras_dt <- rast("EQUATES_ACONC_O3_SAM.nc", "O3") 
pcrs <- "+proj=lcc +lon_0=-97 +lat_0=40 +lat_1=33 +lat_2=45 +r =6370000.0"

Rough estimate of the extent:

v <- vect(rbind(c(-115, 38), c(-115, 45), c(-110.05, 38), c(-110.05, 45)), crs="+proj=longlat")
p <- project(v, pcrs)
e <- crds(p) |> apply(2, range) |> as.vector()
e
#[1] -1562368.5 -1025418.3  -139104.3   693662.9
 

Set the extent and the crs

ext(ras_dt) <- e
crs(ras_dt) <- pcrs 

Transform the points to the crs of the raster

xy <- vect(cbind(lon=-113.0,lat=40.0), crs="+proj=longlat")
pxy <- project(xy, pcrs)

And extract

extract(ras_dt, pxy)
#  ID O3_LAY=1_TSTEP=1 O3_LAY=1_TSTEP=2
#1  1         41.88482         40.99662

So our raster now looks like this. The spatial resolution should probably be a round number (12,000?)

ras_dt
#class       : SpatRaster 
#dimensions  : 70, 45, 2  (nrow, ncol, nlyr)
#resolution  : 11932.23, 11896.67  (x, y)
#extent      : -1562369, -1025418, -139104.3, 693662.9  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=lcc +lat_0=40 +lon_0=-97 +lat_1=33 +lat_2=45 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs 
#source      : EQUATES_ACONC_O3_SAM.nc:O3 
#varname     : O3 (O3              ) 
#names       : O3_LAY=1_TSTEP=1, O3_LAY=1_TSTEP=2 
#unit        : ppbV            , ppbV  

Can you find and provide the correct extent somewhere in the documentation? And perhaps ask the data providers to follow the NetCDF conventions such that all the metadata required to use the data is stored in the files.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM