5 votos

El polígono y la trama no se alinean en el mismo gráfico

No consigo trazar una trama y un límite de país (marco de datos sp) en el mismo gráfico. Los datos (lon,lat,value) están en el marco de datos mat. La cuadrícula no es regular y proviene de un archivo ncdf de cambio climático.

Aquí está el archivo original ncdump :

7 variables (excluding dimension variables):
        double lat[rlon,rlat]   
            bounds: lat_vertices
            long_name: latitude coordinate
            standard_name: latitude
            units: degrees_north
        double lat_vertices[vertices,rlon,rlat]   
            units: degrees_north
        double lon[rlon,rlat]   
            bounds: lon_vertices
            long_name: longitude coordinate
            standard_name: longitude
            units: degrees_east
        double lon_vertices[vertices,rlon,rlat]   
            units: degrees_east
        double time_bnds[bnds,time]   
        float hfss[rlon,rlat,time]   
            standard_name: surface_upward_sensible_heat_flux
            long_name: Surface Upward Sensible Heat Flux
            units: W m-2
            original_name: HFX
            cell_methods: time: mean
            missing_value: 1.00000002004088e+20
            _FillValue: 1.00000002004088e+20

            grid_mapping: rotated_latitude_longitude
            coordinates: lat lon
            positive: up
        int rotated_pole[]   
            grid_mapping_name: rotated_latitude_longitude
            grid_north_pole_latitude: 39.25
            grid_north_pole_longitude: -162

Intento trazar esta cuadrícula con el paquete raster y levelplot.

library(raster)
library(rasterVis)
library(rworldmap)

data(wrld_simpl)
colnames(mat) <-c("lon","lat","value")

x.min=min(mat$lon)
x.max=max(mat$lon)
y.min=min(mat$lat)
y.max=max(mat$lat)

v.min=min(mat$value)
v.max=max(mat$value)

breaks=seq(v.min,v.max,2)
colour=rev(rainbow(length(breaks), alpha=1))

ras <- raster(nrows=453, ncols=453,xmn=x.min,xmx=x.max, ymn=y.min, ymx=y.max)
rvm <- matrix(mat[,3],453,453,byrow=TRUE)
ras[]=rvm[nrow(rvm):1,]

levelplot

levelplot(ras,at=breaks,col.regions=colour, margin = FALSE) +
layer(sp.polygons(wrld_simpl, fill = NA, col = "grey50"))

y parcela enter image description here

Por supuesto, el polígono SP (en WGS84) no se ajusta a la cuadrícula ncdf original. El marco de datos original está disponible aquí :

[ [https://drive.google.com/file/d/0Byd6YJGGADrfN255ZGhhTjRSUkU/view?usp=sharing\]\[2\]](https://drive.google.com/file/d/0Byd6YJGGADrfN255ZGhhTjRSUkU/view?usp=sharing][2])

1voto

ruby Puntos 16

El problema aquí es que, al redefinir la extensión del raster, las coordenadas reales de los datos cambiaron. Puedes ver que los valores raster están mal localizados si muestras algunas directrices (yo he usado las coords de Santiago de Compostela). Aquí proceso:

  1. Pruébalo con tus datos y utilizando el sistema de trazado base R.
  2. Pruebe a definir exactamente el mismo CRS para el raster y wrld_simpl. (no funciona)
  3. Prueba de definir un nuevo CRS para el raster para vistas generales de la UE. (no funciona)
  4. Pruebe a evitar la definición de trama en su código y utilizar en su lugar la función rasterFromXYZ(). --> FUNCIONÓ

Aquí está el código:

library(raster);    library(rasterVis);    library(rworldmap)
library(maptools);    library(raster);    library(lattice);
library(gdal);    library(plotly)

load("mat.rda");    data(wrld_simpl);    colnames(mat) <-c("lon","lat","value")
x.min=min(mat$lon);    x.max=max(mat$lon)
y.min=min(mat$lat);    y.max=max(mat$lat)
v.min=min(mat$value);    v.max=max(mat$value)
breaks=seq(v.min,v.max,2)
colour=rev(rainbow(length(breaks), alpha=1))
ras <- raster(nrows=453, ncols=453,xmn=x.min,xmx=x.max, ymn=y.min, ymx=y.max)
rvm <- matrix(mat[,3],453,453,byrow=TRUE)
ras[]=rvm[nrow(rvm):1,]

# 1. Plot them, one layer after another
plot(ras)
plot(wrld_simpl, add=TRUE)

# 2. Plot them with the same exact CRS
crs(ras) <- crs(wrld_simpl)
plot(ras)
plot(wrld_simpl, add=TRUE)
abline(h = 42.883, v = -8.533, col="red") #location of Santiago de Compostela

# 3. CRS to one of the common EPSG used for EU view:
crs(ras) <- CRS("+init=epsg:3035")
plot(ras)
plot(wrld_simpl, add=TRUE)
abline(h = 42.883, v = -8.533, col="red") #location of Santiago de Compostela

# 4. represent your xyz data directly like here:
ras2 <- rasterFromXYZ(mat, res = 0.25, crs = crs(wrld_simpl), digits = 0)
plot(ras2, breaks = breaks, col = colour)
plot(wrld_simpl, add=TRUE)
abline(h = 42.883, v = -8.533, col="red") #location of Santiago de Compostela

Aquí está la trama final: enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X