[英]How to correctly add map to raster image in R
我正在嘗試繪制海面溫度數據並添加彩色的土地圖像,以便數據不會與NAs
混淆。 我嘗試了多種方法,但正如您在下面的圖像中看到的那樣,地圖相對於數據沒有正確排列。
為了使這個問題可以重現,這里有一個鏈接到我正在使用的文件的Dropbox: https : //www.dropbox.com/s/e8pwgmnhvw4s0nf/sst.nc4?dl = 0
library(ncdf4)
library(raster)
library(mapdata)
library(mapproj)
library(rgeos)
library(ggplot2)
eight = nc_open("Downloads/sst.nc4")
sst = ncvar_get(eight, "sst")
sst = raster(sst)
sst = t(flip(sst, 1)) # have to orient the data properly
# extract the dimensions and set the extent
lat.min = min(eight$dim$lat$vals)
lat.max = max(eight$dim$lat$vals)
lon.min = min(eight$dim$lon$vals)
lon.max = max(eight$dim$lon$vals)
sst = setExtent(sst, ext = c(lon.min, lon.max, lat.min, lat.max))
# provide proper projection
crs(sst) = "+init=epsg:4326"
# convert raster to points
sst.p <- rasterToPoints(sst)
df <- data.frame(sst.p)
colnames(df) <- c("Longitude", "Latitude", "sst")
usa = map_data("usa")
ggplot(data=df, aes(y=Latitude, x=Longitude)) +
geom_raster(aes(fill=sst)) +
theme_bw() +
coord_equal() +
scale_fill_gradient("SST (Celsius)", limits=c(0,35)) +
geom_polygon(data = usa, aes(x=long, y = lat, group = group)) +
theme(axis.title.x = element_text(size=16),
axis.title.y = element_text(size=16, angle=90),
axis.text.x = element_text(size=14),
axis.text.y = element_text(size=14),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
legend.position = "right",
legend.key = element_blank()
)
#read in the data
sst = raster("Downloads/sst.nc4", varname = "sst", stopIfNotEqualSpaced=FALSE)
# get world map data
data("wrld_simpl", package="maptools")
## Crop to the desired extent, then plot
newext <- c(lon.min, lon.max, lat.min, lat.max)
out <- crop(wrld_simpl, newext)
#transform to proper CRS
out = spTransform(out, "+init=epsg:4326")
#plot
plot(out, col="khaki", bg="azure2")
plot(sst, add = T)
- 我用於此空間數據的投影是EPSG:4326
-Here是指示sst.nc4
輸出投影的XML片段
<crs>PROJCS["Mercator_1SP / World Geodetic System 1984",
GEOGCS["World Geodetic System 1984",
DATUM["World Geodetic System 1984",
SPHEROID["WGS 84", 6378135.0, 298.257223563, AUTHORITY["EPSG","7030"]],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]],
UNIT["degree", 0.017453292519943295],
AXIS["Geodetic longitude", EAST],
AXIS["Geodetic latitude", NORTH]],
PROJECTION["Mercator_1SP"],
PARAMETER["latitude_of_origin", 0.0],
PARAMETER["central_meridian", 0.0],
PARAMETER["scale_factor", 1.0],
PARAMETER["false_easting", 0.0],
PARAMETER["false_northing", 0.0],
UNIT["m", 1.0],
AXIS["Easting", EAST],
AXIS["Northing", NORTH]]</crs>
我也嘗試使用map()
函數和mapproj
的projection
參數,但它似乎沒有偽mercator投影作為選項。
這個有點令人困惑。 通常最簡單的方法是
sst = raster("sst.nc4", varname = "sst")
但是,對於此文件,會出現此錯誤:
"cells are not equally spaced; you should extract values as points"
所以我們這樣做:
library(ncdf4)
library(raster)
library(maptools)
d <- nc_open("sst.nc4")
sst <- ncvar_get(d, "sst")
lon <- ncvar_get(d, "lon")
lat <- ncvar_get(d, "lat")
nc_close(d)
xy <- cbind(rep(lon, length(lat)), rep(lat, each=length(lon)))
合並並刪除NA值(大約一半的細胞......
xyv <- na.omit(cbind(xy, as.vector(sst)))
設置一個RasterLayer,其分辨率足以滿足您的需要,並柵格化這些點
r <- raster(extent(range(lon), range(lat)), res=1/6)
r <- rasterize(xyv[, 1:2], r, xyv[,3], fun=mean)
情節
data(wrld_simpl)
w <- crop(wrld_simpl, r)
plot(r)
plot(w, col='gray', add=TRUE)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.