Координаты rworldmap, как сопоставить данные NetCDF с картой?
Rworldmap выглядит как раз то, что мне нужно для отображения климатических данных, но у меня проблема с выравниванием базовой карты с климатическими данными. То, что я картирую, это данные о температуре океана от JAMSTEC за август 2015 года отсюда:
http://www.jamstec.go.jp/ARGO/argo_web/ancient/MapQ/Mapdataset_e.html
Имя набора данных - TS_201508_GLB.nc. Я использую скрипт R ниже. Контуры страны в порядке, но данные даны только для океанов, и данные не показывают, что в океанах они каким-то образом смещены. Можете ли вы сказать мне, как выровнять данные на карте?
Я прочитал много статей, но не могу сказать, как их совместить. У меня есть данные долготы и широты. Южная широта отрицательна, а западная долгота отрицательна, я не понимаю, как их можно спутать. Как отображается карта, есть ли какое-то специальное соглашение для широты и долготы?
Спасибо за любую помощь, которую вы можете предоставить. Код:
library(RNetCDF)
library(sp)
library(rworldmap)
library(rgeos)
library(RColorBrewer)
library (classInt)
library(grid)
library(spam)
library(maps)
library(maptools)
library(fields)
library(methods)
library(rgdal)
library(rworldxtra)
fname <- "G:/Climate_Change/Ocean_Warming/MOAA_GPV_Jamstec_Temperature/TS_201508_GLB.nc"
moaa <- open.nc(fname)
# moaa
print.nc(moaa)
file.inq.nc(moaa)
#TOI is the temperature array extracted from the NCDF file
TOI = var.get.nc(moaa,"TOI",start=c(1,1,1),count=c(360,132,25))
TOI[1,1,1]
Long = var.get.nc(moaa,"LONGITUDE")
Lat = var.get.nc(moaa, "LATITUDE")
Pres = var.get.nc(moaa,"PRES")
# create grid
offset=c(-179.5,-60.50)
cellsize = c(abs(Long[1]-Long[2]),abs(Lat[1]-Lat[2]))
cells.dim = c(dim(Long), dim(Lat))
# create gt
gt <- GridTopology(cellcentre.offset=offset,cellsize=cellsize,cells.dim=cells.dim)
# create map window
mapDevice()
# Create a color pallette
colourPalette=c('blue','lightblue','white',brewer.pal(9,'YlOrRd'))
# Values at 2000 decibar for August 2015
ncMatrix <- TOI[,,25]
# Gridvalues
gridVals <-data.frame(att=as.vector(ncMatrix))
# create a spatialGridDataFrame
sGDF <-SpatialGridDataFrame(gt,data=gridVals)
# Vector to classify data
catMethod=seq(from=0,to=4,by=.33)
# plotting the map and getting params for legend
mapParams <- mapGriddedData( sGDF, nameColumnToPlot='att',catMethod=catMethod,colourPalette=colourPalette,addLegend=FALSE)
1 ответ
Я наконец-то понял. rworldmap хочет организовать данные в верхнем левом углу карты (северо-западный угол), то есть Long = -180, Lat=90. Данные NetCDF начинаются с Long=0 и Lat=-90(середина карты и южный край). Таким образом, мы должны обратить значения в направлении Север-Юг:
#
# Flip the Latitude values so south is last
ncMatrix2 <- ncMatrix[,dim(Lat):1]
Затем переключите значения для восточной долготы и западной долготы:
#
#Longitude values need to be from -180 to 0 then 0 to 180
# So we divide into East and West, then recombine with rbind
East_Long_values <-ncMatrix2[1:180,]
West_Long_Values <-ncMatrix2[181:360,]
ncMatrix3 <- rbind(West_Long_Values,East_Long_values)
Тогда все остальное работает.