Преобразование вектора координат в пустую двумерную матрицу

У меня есть набор трехмерных координатных точек: [широта, долгота, высота] ([X,Y,Z]), полученных из данных LIDAR. Точки не сортируются, а размер шагов между точками более или менее случайный.

Моя цель - создать функцию, которая преобразует этот набор точек в двухмерную матрицу с постоянным числом пикселей, где каждая ячейка (X,Y) содержит значение Z, а затем строит график в виде тепловой карты высот.

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

Решение, о котором я думал, состоит в том, чтобы построить сегмент для каждого пикселя, выполнить итерации по точкам и поместить каждый в сегмент в соответствии со значениями (X,Y). Наконец, создайте матрицу, в которой каждая продажа содержит среднее значение Z в соответствующем сегменте.

  1. Поскольку у меня нет большого опыта в этой области, я хотел бы услышать некоторые советы и особенно, если есть лучшие способы для решения этой задачи.
  2. Есть ли функция numpy для преобразования моего набора точек в нужную матрицу? (может быть сетка с шагами постоянного значения?)
  3. Если я построю очень разреженную матрицу, где размер шага

    min[min{Xi,Xj}, min{Yk,Yl}] для всех i,j,k,l

    Есть ли способ "уменьшить" разрешение и преобразовать его в матрицу с требуемым размером?

Спасибо!

2 ответа

Решение

Вам не нужно изобретать велосипед.

from matplotlib.mlab import griddata
import numpy as np

#-- Your coordinates
x = np.random.random(100)
y = np.random.random(100)
z = np.random.random(100)*10
#--

#-- Your new grid
xsteps=200    # resolution in x
ysteps=200    # resolution in y
xi = linspace(min(x), max(x), xsteps)
yi = linspace(min(y), max(y), ysteps)
Z = griddata(x, y, z, xi, yi)  # interpolates between points in your data
#--

plt.pcolormesh(xi, yi, Z, cmap=plt.cm.hot)   # plot your elevation map :D
plt.show()

Я знаю, что я не отвечаю на половину ваших вопросов, но вот как я это сделаю:

  1. Создать двумерный массив желаемого разрешения,
  2. "Самые левые" значения соответствуют наименьшим значениям x и т. Д.
  3. Заполните массив значением высот ближайшего совпадения в терминах значений x и y
  4. Сгладить результат.
Другие вопросы по тегам