简体   繁体   中英

How to transfer regions from a shapefile to a netcdf file using R?

I have a regional netcdf file with chlorophyll data and want to add a new variable "region" that maps information about the maritime region. So for each coordinate point there would be an information to which region this point belongs.

So for all points in the netcdf file laying in the region of the Mediterranean sea, the variable "region" would for example contain the value 0 and for all points laying in the region of the North Sea, the variable "region" would for example contain the value 1 and so on...

I found a shapefile containing maritime regions based on biogeochemical processes (Longhurst Provinces). Now I want to use this shapefile to define my "region" variable in the netcdf file. Does anybody know how I could do that in R?

I think my question is close to this post by DKRZ but I don't want to extract/mask only one region but map all regions that are defined in the shapefile.

The files can be found here:

https://drive.google.com/file/d/1kgPpHFapmuclDyUvw2TH_10i018GE9YH/view?usp=sharing

https://drive.google.com/file/d/1WLYEUs6XllZv6i0xjRif-N0syhR2lX01/view?usp=sharing

Thanks a lot already!

EDIT
I found this post that helped me to solve my problem: https://www.r-bloggers.com/2014/05/converting-shapefiles-to-rasters-in-r/ )

This is what I could put together based on Map Lat/Lon Points to a Shape File in R . The main work is done by over() , which takes a few minutes.

library(ncdf4)
nc_data = nc_open('/mnt/d/Downloads/CCI_ALL-v5.0-MONTHLY.nc', T)    # write
lon = ncvar_get(nc_data, "lon")
lat = ncvar_get(nc_data, "lat")
library(rgdal)
shapefile = readOGR('/mnt/d/Downloads/Longhurst_world_v4_2010.shp')
grid = expand.grid(lon=lon, lat=lat)
coordinates(grid) = ~lon+lat
grid@proj4string = shapefile@proj4string
# for each grid point, find the province it belongs to (if available):
prov = over(grid, shapefile['ProvCode'])
# define dimensions for the new variable
londim = ncdim_def("lon", ncatt_get(nc_data, "lon")$units, lon)
latdim = ncdim_def("lat", ncatt_get(nc_data, "lat")$units, lat)
# define the new variable
region = ncvar_def("region", "", list(londim, latdim), prec="integer")
# add the new variable to the netCDF file
nc_data = ncvar_add(nc_data, region)
# write the variable's values to the file
ncvar_put(nc_data, region, prov$ProvCode)
nc_close(nc_data)

rgdal version etc.:

Loading required package: sp
rgdal: version: 1.4-8, (SVN revision 845)
 Geospatial Data Abstraction Library extensions to R successfully loaded
 Loaded GDAL runtime: GDAL 3.0.4, released 2020/01/28
 Path to GDAL shared files:
 GDAL binary built with GEOS: TRUE
 Loaded PROJ.4 runtime: Rel. 6.3.1, February 10th, 2020, [PJ_VERSION: 630]
 Path to PROJ.4 shared files: (autodetected)
 Linking to sp version: 1.3-2
OGR data source with driver: ESRI Shapefile
Source: "/mnt/d/Downloads/Longhurst_world_v4_2010.shp", layer: "Longhurst_world_v4_2010"
with 54 features
It has 2 fields

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