LINUX.ORG.RU

Как ловчее интерполировать данные на большой криволинейной сетке (6K x 6K)?

 


1

1

Есть у меня данные, вытащенные из geotiffки: x_mesh, y_mesh, z_mesh. Это данные уже в декартовых координатах, причём z_mesh — это высота не над уровнем моря, а от некоей касательной плоскости к Земле, можно их рисовать с помощью matplotlib.pyplot.pcolormesh:

http://i.zlowiki.ru/170918_e4b6b2da.png

Всё бы круто, однако хочу я получить значения z в произвольных точках (например, туда, куда я ткну мышкой — или на отрезке между центром карты и кликом мышкой). Для этого я попытался подключить интерполятор из scipy:

interpolator = scipy.interpolate.interp2d(x_mesh, y_mesh, z_mesh)

Но не тут-то было, мне говорят, что точек слишком много: OverflowError: Too many data points to interpolate

Хотя картинка всего 6001x6001px, да и сам pcolormesh как-то значения между узлами интерполирует, при увеличении-то...

Имею спросить: а как же мне эту сволочь интерполировать?



Последнее исправление: Yak (всего исправлений: 1)

короче, слухай сюда. универсальное решение на OpenGL 4.3

создаешь помимо основного фреймбуфера(RGBA+depth+stencil), куда ты рисуешь геометрию, еще и буфер в формате RGBA32F и в пиксельном шейдере туда выкладываешь координаты пикселя в пространстве. в RGB положи координаты ХYZ. Возможно тебе будет надо выделять какие-то объекты на карте. Назнач им ID, и его пропихивай в W.

Далее, как забирать их? Можно просто прочитать через glReadPixels. Мой совет - читай сразу блок 4х4 пикселя вокруг курсора. Это удобно когда надо тыкать мышкой в объекты, а мышевозить выцеливая пиксель не охота. Можно ходить по блоку 4х4 выискивая ближайший пиксель с W!=0(например)

ckotinko ☆☆☆
()

А благородный Дон точно

ничего не путает?

это 2д массивы х-ов, у-ков и значений в этих точках? зачем нам тогда z-mesh? нужно скорее height; а само название z-mesh в заблуждение вводит.

Т.е. если бы оно было на равномерной сетке, интерполировать бы вовсе нужно было только 2D массив height.

6к х 6к - это вообще не серьезный массив. В этом вашем питоне FFT от него должен ~5 сек считаться (на декартовых координатах, конечно), а тут интерполяция.

Она, кстати, какая? Если линейная, то это совсем просто руками прикрутить.

PS: никакой жл тут нафиг не нужен (если не шашечки)

sshestov ★★
()
Ответ на: А благородный Дон точно от sshestov

возможно вы не заметили, но по условию имеется сетка, изогнутая в 3Д-пространстве. Вам никто не дает гарантий, что в соседних пикселах отображаются «соседние» области на сетке. Там могут быть разрывы изза перекрытий «горами» при определённых углах обзора.

ckotinko ☆☆☆
()

на матлабе это запросто, но мы же не такие, потому octave, бесплатный матлаб к вашим услугам

anonymous
()

А просто делать так нельзя?

var mouse_x, mouse_y;

var matrix[xlim][ylim]; // Содержит только z-value

// Тыкнули мышкой
// Получили что mouse_x и mouse_y лежат между x=20 и x=21 и y=44 и y=45
// Получили центральный z усреднением:
var c = (matrix[20][44] + matrix[21][44] + matrix[20][45] + matrix[21][45]) / 4;
// Теперь получаем долю смещения от центра в сторону одной из точек. Например mouse_x = 20.2, mouse_y = 44.1
// 20, 44
//   +----+----+
//   | X  |    |
//   |    |    |
//   +----C----+
//   |    |    |
//   |    |    |
//   +----+----+
//           21,45
// Теперь мы получаем долевую разницу между matrix[20][44] и c
// full = sqrt(0.5^2 + 0.5^2) = 0,707;
// our  = sqrt((20.2 - 20)^2 + (44.1 - 44)^2) = sqrt(0.2^2 + 0.1^2) = 0,223;
// Z_diff = c - matrix[20][44];
// Z_mouse = matrix[20][44] + Z_diff * (our / full)
Как-то так, если руками по ближайшим точкам.

PPP328 ★★★★★
()

Ну, проинтерполируй линейно, фигли.

Waterlaz ★★★★★
()

Для интерполяции тебе нужны не все точки, а только ближайшие к искомой. Попробуй интерполировать на квадрате 10х10, окружающем каждую интересующую тебя точку.

anonymous
()
Ответ на: комментарий от anonymous

в общем случае задачка неординарная.

Как сказал выше анусимоус, для точек ввиде облака,

один из способов - Poisson surface reconstruction,

3D Kernel Density Estimation, etc.

Если точки регулярные и необходимо строить изоповерхность -

marching cubes algorithm.

Как бывший разработчик рекоммендую ROOT

http://root.cern.ch

Там всё это есть + python binding

Valeriy_Onuchin ★★
()
Ответ на: комментарий от anonymous

А можно подробностей насчёт MATLABа?

Yak
() автор топика

отображаете чем? в смысле GUI на чем написан?

я так понял ты с физтеха, а по питону и описаниям вакансий предположил, что вы пишете на гуй PyQt. Может вам подкинуть растеризатор где уже можно в любую точку на экране ткнуть и узнать где она лежит и что там нарисовано?

Я смотрю на предложения в этом топике и офигеваю. Это мазохизм какой-то или что вообще такое.

ckotinko ☆☆☆
()
Ответ на: комментарий от Yak

а инфа есть что и в каком формате на вход будет подаваться? точность, диапазон значений, требования к отображению

на krugomvolki гмылоком напиши.

ckotinko ☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.