2011-08-01 32 views
21

He creado un mapa en 3D usando rgl.surface(), principalmente siguiendo la respuesta de Shane en this publicación. Usando mis propios datos, consigo este mapaSuperponer un mapa en la parte superior de un mapa de superficie 3D en r

enter image description here

En la parte superior de este mapa de la superficie, me gustaría añadir un mapa de densidad de la vegetación de tal manera que puedo obtener algo como esto (obtenido con el Surfer software):

enter image description here

¿es posible hacer esto con RGL, o para el caso cualquier otro paquete en I o es la única solución para tener dos mapas como en la respuesta de Shane?

Gracias.

Editar:

Siguiendo @ petición de GSK3, aquí es el código de este mapa:

library(rgl) 

# Read the z (i.e. elevation) dimension from file 
z1 = matrix(scan("myfile.txt"),nrow=256, ncol=256, byrow=TRUE) 
#create/open x y (i.e. easting and northing coordinates) dimensions 
y=8*(1:ncol(z)) # Each point is 8 m^2 
x=8*(1:nrow(z)) 

# See https://stackoverflow.com/questions/1896419/plotting-a-3d-surface-plot-with-contour-map-overlay-using-r for details of code below 
zlim <- range(z) 
zlen <- zlim[2] - zlim[1] + 1 
colorlut <- terrain.colors(zlen,alpha=0) # height color lookup table 
col <- colorlut[ z-zlim[1]+1 ] # assign colors to heights for each point 
open3d() 
rgl.surface(x,y,z) 

no puedo enviar el código de elevación debido a que hay 65.536 (es decir, x * y = 256 * 256) puntos pero es una matriz que se ve así

  [,1]  [,2]  [,3]  [,4]  [,5] 
[1,] 1513.708 1513.971 1514.067 1513.971 1513.875 
[2,] 1513.622 1513.524 1513.578 1513.577 1513.481 

y así sucesivamente. Lo mismo para el mapa de densidad de vegetación, que es exactamente el mismo formato y para el que tengo un valor único para cada punto x * y. Espero que esto aclare un poco ...?

Editar 2, versión final

Este es el mapa que he producido con R. No tengo la leyenda en él todavía, pero esto es algo que voy a hacer en una etapa posterior.

enter image description here

El código final de esto es

library(rgl) 
z1 = matrix(scan("myfile.txt"),nrow=256, ncol=256, byrow=TRUE) 
# Multiply z by 2 to accentuate the relief otherwise it looks a little bit flat. 
z= z1*2 

#create/open x y dimensions 
y=8*(1:ncol(z)) 
x=8*(1:nrow(z)) 

trn = matrix(scan("myfile.txt"),nrow=256, ncol=256, byrow=TRUE) 
fv = trn*100 
trnlim = range(fv) 

fv.colors = colorRampPalette(c("white","tan4","darkseagreen1","chartreuse4")) ## define the color ramp 
colorlut =fv.colors(100)c(1,seq(35,35,length.out=9),seq(35,75,length.out=30),seq(75,100,length.out=61))] 

# Assign colors to fv for each point 
col = colorlut[fv-trnlim[1]+1 ] 
open3d() 
rgl.surface(x,y,z,color=col) 

muchas gracias a @ GSK3 y @nullglob en this puesto por su ayuda. Espero que esta publicación ayude a muchos otros!

+0

Pregunta interesante pero difícil de responder sin más información. Por favor publique su código y si puede su mapa en alguna parte, o al menos descríbalo. Una posibilidad sería poner la fracción de vegetación como un mapa de color, que estoy bastante seguro de que 'rgl.surface()' apoyaría ... Sin embargo, es difícil decirlo sin más información. –

+0

Para obtener información, no sé cómo poner la fracción de vegetación en un mapa de color como lo sugiere @ gsk3, así que sería genial si pudiera obtener un ejemplo de cómo hacerlo. Gracias. – SnowFrog

+0

Simplemente cambie todas las líneas de color con las que está trabajando para trabajar con la matriz de terreno en lugar de la matriz z .... –

Respuesta

8

Se modificó el código anterior para dar una respuesta. Tenga en cuenta que el terreno debe ser una matriz en el mismo formato que la matriz de elevación. Y agregué un argumento ,color a su llamada de función para que realmente use la matriz de color que creó.

library(rgl) 

# Read the z (i.e. elevation) dimension from file 
z1 = matrix(scan("myfile.txt"),nrow=256, ncol=256, byrow=TRUE) 
#create/open x y (i.e. easting and northing coordinates) dimensions 
y=8*(1:ncol(z)) # Each point is 8 m^2 
x=8*(1:nrow(z)) 

# Read the terrain types from a file 
trn = matrix(scan("terrain.txt"),nrow=256, ncol=256, byrow=TRUE) 

# See http://stackoverflow.com/questions/1896419/plotting-a-3d-surface-plot-with-contour-map-overlay-using-r for details of code below 
trnlim <- range(trn) 
trnlen <- trnlim[2] - trnlim[1] + 1 
colorlut <- terrain.colors(trnlen,alpha=0) # height color lookup table 
col <- colorlut[ trn-trnlim[1]+1 ] # assign colors to heights for each point 
open3d() 
rgl.surface(x,y,z,color=col) 
+0

Muchas gracias. Todavía no obtengo exactamente lo que quiero, pero creo que es porque el código de color que te di no es apropiado para lo que quiero. Lo resolveré gracias a su sugerencia y publicaré mi código y mapa final cuando termine. – SnowFrog

+0

Claro.Gracias por comprometerse a seguir aquí :-). Espero que las sugerencias hayan sido de ayuda. –

Cuestiones relacionadas