Как сделать топографическую карту из редких выборочных данных? - PullRequest
6 голосов
/ 26 августа 2009

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

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

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

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


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

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

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

Ответы [ 4 ]

3 голосов
/ 30 сентября 2009

R имеет много различных соответствующих инструментов. В частности, посмотрите в пространственном представлении . Подобный вопрос задавался в R-Help ранее, так что вы можете посмотреть на этот .

Посмотрите на функции 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. В конечном итоге это выглядит так (вы также можете использовать fill.contour, если хотите, чтобы он был закрашен):

image

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

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

2 голосов
/ 26 августа 2009

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

1 голос
/ 26 августа 2009

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

с

в R

...