如何在R中为自定义NetCDF文件添加坐标系以兼容ArcMap?
I’ve run into similar compatibility issues between custom NetCDFs from R and ArcMap, especially with Daymet data. Let’s break down why your current setup isn’t working and walk through a fix that aligns with CF Conventions (which ArcMap relies on for projection parsing):
Key Issues in Your Current Implementation
- Non-compliant standard parallel formatting: The original Daymet file uses duplicate
standard_parallelattributes (per CF rules for Lambert Conformal Conic), but you split them intostandard_parallelandstandard_parallel_2—ArcMap doesn’t recognize this non-standard naming. - Missing projection-data link: Your raster variables (like temperature or precipitation) aren’t associated with the
lambert_conformal_conicprojection variable. ArcMap needs this explicit link to apply the projection correctly. - Incorrect attribute value types: You’re passing numeric parameters (like
-100for central meridian) as strings, which can break ArcMap’s ability to parse projection settings. - Mismatched time_bnds dimension: The original Daymet file uses
time_bnds[nv, time](wherenv=2for time interval start/end), but your file uses a 1Dtime_bnds[time]—this disrupts time dimension parsing.
Step-by-Step Fixes
1. Define Projection Variable with CF-Compliant Attributes
Use numeric values for all parameters, and set both standard parallels as a vector to create duplicate attributes matching Daymet’s structure:
library(ncdf4) # Assuming `ncout` is your existing NetCDF output connection # Define the projection variable (matches Daymet's short data type) corddef <- ncvar_def("lambert_conformal_conic", "", list(), prec = "short") ncvar_add(ncout, corddef) # Add CF-compliant projection attributes (use numeric values, not strings) ncatt_put(ncout, "lambert_conformal_conic", "grid_mapping_name", "lambert_conformal_conic") ncatt_put(ncout, "lambert_conformal_conic", "longitude_of_central_meridian", -100) ncatt_put(ncout, "lambert_conformal_conic", "latitude_of_projection_origin", 42.5) ncatt_put(ncout, "lambert_conformal_conic", "false_easting", 0) ncatt_put(ncout, "lambert_conformal_conic", "false_northing", 0) # Set both standard parallels as a vector to create duplicate attributes ncatt_put(ncout, "lambert_conformal_conic", "standard_parallel", c(25, 60)) ncatt_put(ncout, "lambert_conformal_conic", "semi_major_axis", 6378137) ncatt_put(ncout, "lambert_conformal_conic", "inverse_flattening", 298.257232666016)
2. Link Raster Variables to the Projection
For every data variable in your NetCDF (e.g., tmax, prcp), add a grid_mapping attribute pointing to your projection variable. This tells ArcMap which projection applies to each raster:
# Example: Link temperature maximum variable to the projection ncatt_put(ncout, "tmax", "grid_mapping", "lambert_conformal_conic") # Repeat for all your data variables ncatt_put(ncout, "tmin", "grid_mapping", "lambert_conformal_conic") ncatt_put(ncout, "prcp", "grid_mapping", "lambert_conformal_conic")
3. Fix the time_bnds Dimension
Recreate time_bnds with the correct 2D structure (nv for interval bounds, time for time steps) matching Daymet:
# Define the nv dimension (length 2 for start/end of time intervals) nv_dim <- ncdim_def("nv", "", 1:2, unlim = FALSE) # Get your existing time dimension (assuming it's named "time") time_dim <- ncout$dim$time # Define the time_bnds variable time_bnds_def <- ncvar_def("time_bnds", "days since 1980-01-01 00:00:00 UTC", list(nv_dim, time_dim), prec = "float") ncvar_add(ncout, time_bnds_def) # Populate with your time interval data (e.g., start/end dates for each time step) ncvar_put(ncout, time_bnds_def, your_time_bnds_data)
4. Verify Metadata
After writing and closing the file, check that the metadata matches Daymet’s structure:
nc_close(ncout) # Open the new file to validate nc_check <- nc_open("your_custom_daymet_file.nc") print(nc_check) nc_close(nc_check)
Confirm:
- Duplicate
standard_parallelentries (25 and 60) - Each data variable has
grid_mapping = "lambert_conformal_conic" time_bndshas dimensionsnv, time
Testing in ArcMap
Once you’ve generated the corrected file:
- Use the Create NetCDF Raster Layer tool
- Select your target data variable (e.g.,
tmax) - Set X Dimension to
x, Y Dimension toy
ArcMap should now automatically recognize the Lambert projection and render the raster without distortion or unresponsiveness.
内容的提问来源于stack exchange,提问作者Cooper Springer




