2009-08-26 2 views
6

Мне нужно сделать топографическую карту местности, для которой у меня есть только довольно редкие образцы (x,   y,   высота) данные. Очевидно, я не могу сделать абсолютно точную карту, но мне бы хотелось, чтобы она была в некотором смысле «гладкой». Мне нужно дать количественную оценку «гладкость» (вероятно, обоюдное среднее значение квадрата кривизны поверхности), и я хочу, чтобы минимизировать целевую функцию, которая является суммой двух величин:Как сделать топографическую карту из разреженных данных выборки?

  • Шероховатость поверхности
  • Среднеквадратичное расстояние между высотой поверхности в точке образца и фактической измеренной высотой в этой точке

Так что я на самом деле хочу это топографическая карта, я действительно искал способ построения горизонталей постоянной высоты, и может быть какой-то умный геометрический способ сделать это, не имея необходимости говорить о поверхностях. Конечно, я хочу, чтобы контурные линии были гладкими.

Любые предложения приветствуются. Я надеюсь, что это хорошо известная численная проблема. Я очень удобен в C и имею хорошее знание FORTRAN. О Matlab и R Я довольно невежественный.


Относительно где наши образцы расположены: мы планируем примерно одинаковое расстояние, но мы будем принимать больше образцов, где рельеф более интересен. Так, например, мы будем рассматривать горные районы более плотно, чем равнина. Но у нас определенно есть выбор на выборку, и мы можем взять даже образцы, если это упростит ситуацию. Единственными вопросами являются

  • Мы не знаем, сколько мест нам нужно будет отображать, чтобы найти функции, которые мы ищем.

  • Принимая образец умеренно дорого, порядка 10 минут. Таким образом, выборка сетки 100x100 может занять много времени.

+0

Являются ли ваши образцы равномерно распределенными или случайными? –

+0

Марк: мы можем поместить их туда, куда захотим. Я добавил примечание выше. –

ответ

2

Отличный обзор contouring algorithm, возможно, потребуется сетка поверхность первой интерполировать на сетку.

+0

выглядит потрясающе; thanks –

+0

Ссылка не работает. –

+0

Больше не сломан, но я думаю, что это не ответ на поставленный вопрос. Похоже, этот внешний ресурс должен иметь функцию, и из этой функции он будет нарисовать карту контура. –

1

может быть, вы можете использовать:

с

in R

+0

Я боюсь, что слишком полезна, чтобы быть полезной. GEOMap может быть полезен, но документация настолько сложна, что я не могу сказать. Генерирующая топографическая карта http://en.wikipedia.org/wiki/Generative_topographic_map выглядит более перспективной. –

+0

@Norman Ramsey это всегда приключение в R :) – pageman

+0

на самом деле это то, что gtm - Generative Topographic Mapping - http://cran.r-project.org/web/packages/gtm/gtm.pdf – pageman

3

Kriging interpolation может быть полезна для плавного интерполирования ваших редких образцов.

+0

Выглядит очень полезно, спасибо ! –

3

R имеет множество различных соответствующих инструментов. В частности, посмотрите at the spatial view. Аналогичный вопрос was asked in R-Help before, so you may want to look at that.

Посмотрите на функции contour. Вот некоторые данные:

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

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

Начальный участок несколько грубо:

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

Билл Данлоп предложил усовершенствование: «Это часто работает лучше, чтобы соответствовать гладкой поверхности данных, оценить эту поверхность на более тонкую сетку и передать результат контуру, что гарантирует, что контурные линии не пересекаются друг с другом и имеют тенденцию избегать ложных петель, которые вы могли бы получить от сглаживания самих контурных линий. Тонкие пластинчатые сплайны (Tps из библиотеки («поля»))) и лесс (среди прочих) могут поместиться на поверхность ».

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

Это приводит к очень гладкой сюжет, потому что он использует Tps(), чтобы соответствовать данным первого, а затем вызывает contour. Он заканчивает тем, как это (вы также можете использовать filled.contour, если вы хотите, чтобы быть заштрихованы):

Для сюжета, вы можете использовать либо lattice (как в приведенном выше примере) или ggplot2 упаковка. Используйте функцию geom_contour() в этом случае. Пример 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() 
Смежные вопросы