2009-08-26 9 views
6

Je dois faire une carte topographique d'un terrain pour lequel je n'ai que des échantillons assez clairsemés de (x,   y,   altitude) données. Évidemment je ne peux pas faire une carte complètement précise, mais je voudrais un qui soit en quelque sorte "lisse". Je dois quantifier « la douceur » (probablement la moyenne réciproque du carré de la courbure de la surface) et je veux minimiser une fonction objective qui est la somme de deux quantités:Comment faire une carte topographique à partir de données d'échantillonnage clairsemées?

  • La rugosité de la surface
  • la distance quadratique moyenne entre l'altitude de la surface au point d'échantillonnage et l'altitude réelle mesurée à ce moment

Depuis ce que je veux en fait une carte topographique, je suis vraiment un moyen de construire des lignes de contour d'altitude constante, et il peut y avoir une certaine façon géométrique intelligente de le faire sans jamais avoir à parler à propos des surfaces. Bien sûr, je veux que les lignes de contour soient également lisses.

Toutes les suggestions sont les bienvenues. J'espère que c'est un problème numérique bien connu. Je suis assez à l'aise en C et j'ai une connaissance pratique de FORTRAN. À propos de Matlab et R Je suis assez désemparé.


En ce qui concerne nos échantillons où sont situés: nous prévoyons même espacement à peu près, mais nous allons prendre plus d'échantillons où la topographie est plus intéressante. Ainsi, par exemple, nous échantillonnerons les régions montagneuses plus densément qu'une plaine. Mais nous avons certainement quelques choix à propos de l'échantillonnage, et pourrions même prendre des échantillons si cela simplifie les choses. Les seuls problèmes sont

  • Nous ne savons pas combien de terrain nous devrons cartographier afin de trouver les fonctionnalités que nous recherchons.

  • La prise d'un échantillon est modérément coûteuse, de l'ordre de 10 minutes. Ainsi, l'échantillonnage d'une grille de 100x100 peut prendre beaucoup de temps.

+0

Vos échantillons sont-ils espacés régulièrement ou de façon aléatoire? –

+0

Mark: on peut les mettre où on veut. J'ai ajouté une note ci-dessus. –

Répondre

2

examen Excellente contouring algorithm, vous pourriez avoir besoin de maillage d'abord la surface à interpoler sur une grille.

+0

semble génial; merci –

+0

Le lien est cassé. –

+0

Pas cassé plus mais je pense que ce n'est pas vraiment une réponse à la question posée. Il semble que cette ressource externe doit avoir une fonction et à partir de cette fonction, elle dessine une carte de contour. –

1

vous pouvez peut-être utiliser:

avec

in R

+0

Un peu trop dispersé pour être utile, j'en ai peur. GEOMap pourrait être utile mais la documentation est si complexe que je ne peux pas le dire. La carte topographique générative http://en.wikipedia.org/wiki/Generative_topographic_map semble plus prometteuse. –

+0

@Norman Ramsey c'est toujours une aventure en R :) – pageman

+0

en fait c'est ce que gtm est - Generative Topographic Mapping - http://cran.r-project.org/web/packages/gtm/gtm.pdf – pageman

3

Kriging interpolation peut être utile pour interpoler facilement vos échantillons rares.

+0

Ça a l'air vraiment utile, merci ! –

3

R dispose de nombreux outils pertinents différents. En particulier, jetez un oeil at the spatial view. Une question similaire was asked in R-Help before, so you may want to look at that.

Regardez les fonctions contour. Voici quelques données:

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

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

Une parcelle initiale est un peu rude:

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

Bill Dunlap a suggéré une amélioration: « Il fonctionne souvent mieux adapter une surface lisse aux données, évaluer la surface sur un Cela permet de s'assurer que les lignes de contour ne se croisent pas et tend à éviter les boucles parasites que vous pourriez obtenir en lissant les courbes de niveau elles-mêmes (Tps from library ("fields"))) et loess (entre autres) peuvent s'adapter à la surface. "

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

Il en résulte une parcelle très lisse, car il utilise Tps() pour ajuster les données, puis appelle contour. Il finit par ressembler à ceci (vous pouvez aussi utiliser filled.contour si vous voulez qu'il soit ombrée):

Pour la parcelle, vous pouvez utiliser lattice (comme dans l'exemple ci-dessus) ou ggplot2 paquet. Utilisez la fonction geom_contour() dans ce cas. Un exemple 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() 
Questions connexes