2009-08-26 7 views
6

Necesito hacer un mapa topográfico de un terreno para el cual tengo solo muestras bastante dispersas de (x,   y,   altitud) data. Obviamente no puedo hacer un mapa completamente preciso, pero me gustaría uno que en cierto sentido sea "suave". Necesito de cuantificar "suavidad" (probablemente el recíproco de la media del cuadrado de la curvatura de la superficie) y yo quiero minimizar una función objetivo que es la suma de dos cantidades:¿Cómo hacer un mapa topográfico a partir de datos de muestreo dispersos?

  • La rugosidad de la superficie
  • la distancia media cuadrática entre la altitud de la superficie en el punto de muestreo y la altitud real medido en ese punto

Dado que lo que realmente quiero es un mapa topográfico, realmente estoy buscando una manera de construir las curvas de nivel de altitud constante, y puede haber alguna forma geométrica inteligente para hacer eso sin tener que hablar sobre superficies Por supuesto, quiero que las curvas de nivel también sean suaves.

Todas y cada una de las sugerencias son bienvenidas. Espero que este sea un problema numérico bien conocido. Estoy bastante cómodo en C y tengo un conocimiento práctico de FORTRAN. Acerca de Matlab y R. No tengo ni idea.


En cuanto a donde nuestros ejemplos se encuentran: estamos pensando en más o menos las mismas distancias, pero vamos a tomar más muestras donde la topografía es más interesante. Entonces, por ejemplo, probaremos regiones montañosas más densamente que una llanura. Pero definitivamente tenemos algunas opciones sobre el muestreo, y podríamos tomar incluso muestras si eso simplifica las cosas. Los únicos problemas son

  • No sabemos la cantidad de terreno que necesitaremos para mapear el fin de encontrar las características que estamos buscando.

  • Tomar una muestra es moderadamente costoso, del orden de 10 minutos. Por lo tanto, el muestreo de una grilla de 100x100 podría tomar mucho tiempo.

+0

¿Están sus muestras espaciadas uniformemente, o al azar? –

+0

Marca: podemos ponerlos donde queramos. He agregado una nota arriba. –

Respuesta

2

excelente revisión de contouring algorithm, es posible que necesite para engranar la primera superficie para interpolar en una rejilla.

+0

se ve increíble; gracias –

+0

El enlace está roto. –

+0

Ya no está roto, pero creo que no es realmente una respuesta a la pregunta planteada. Parece que este recurso externo necesita tener una función y de esa función dibujará un mapa de contorno. –

1

tal vez usted puede utilizar:

con

in R

+0

Un poco demasiado scattershot para ser útil, me temo. GEOMap podría ser útil, pero la documentación es tan compleja que no puedo decirlo. El Mapa Topográfico Generativo http://en.wikipedia.org/wiki/Generative_topographic_map parece más prometedor. –

+0

@Norman Ramsey siempre es una aventura en R :) – pageman

+0

en realidad eso es lo que es gtm - Mapeo Topográfico Generativo - http://cran.r-project.org/web/packages/gtm/gtm.pdf – pageman

3

Kriging interpolation puede ser de alguna utilidad para interpolar suavemente sus muestras dispersas.

+0

Parece realmente útil, gracias ! –

3

R tiene muchas herramientas relevantes diferentes. En particular, eche un vistazo at the spatial view. Una pregunta similar was asked in R-Help before, so you may want to look at that.

Mire las funciones contour. He aquí algunos datos:

x <- seq(-3,3) 
y <- seq(-3,3) 

z <- outer(x,y, function(x,y,...) x^2 + y^2) 

Una trama inicial es algo áspera:

contour(x,y,z, lty=1) 

Bill Dunlap sugirieron una mejora: "A menudo funciona mejor para adaptarse a una superficie lisa de los datos, evaluar esa superficie en una una cuadrícula más fina, y pasar el resultado al contorno. Esto asegura que las líneas de contorno no se crucen entre sí y tiende a evitar los bucles espurios que podría obtener al suavizar las líneas de contorno. Thin plate splines (Tps de la biblioteca ("campos"))) y loess (entre otros) pueden caber en la superficie ".

library("fields") 
contour(predict.surface(Tps(as.matrix(expand.grid(x=x,y=y)),as.vector(z)))) 

Esto se traduce en una parcela muy suave, ya que utiliza Tps() para ajustar los datos en primer lugar, a continuación, llama contour. Se termina pareciéndose a esto (también se puede utilizar filled.contour si usted quiere que sea sombreada):

Para la trama, puede utilizar cualquiera lattice (como en el ejemplo anterior) o la ggplot2 paquete. Use la función geom_contour() en ese caso. Un ejemplo can be found here (ht Thierry):

ds <- matrix(rnorm(100), nrow = 10) 
library(reshape) 
molten <- melt(data = ds) 
library(ggplot2) 
ggplot(molten, aes(x = X1, y = X2, z = value)) + geom_contour() 
Cuestiones relacionadas