Преобразование вектора координат в пустую двумерную матрицу
У меня есть набор трехмерных координатных точек: [широта, долгота, высота] ([X,Y,Z]), полученных из данных LIDAR. Точки не сортируются, а размер шагов между точками более или менее случайный.
Моя цель - создать функцию, которая преобразует этот набор точек в двухмерную матрицу с постоянным числом пикселей, где каждая ячейка (X,Y) содержит значение Z, а затем строит график в виде тепловой карты высот.
- шкалы должны оставаться реалистичными, X и Y должны иметь одинаковый размер шага.
- матрица не должна улавливать точную картину возвышений. Очевидно, что для того, чтобы иметь постоянное количество пикселей, потребуется какое-то уменьшение разрешения.
Решение, о котором я думал, состоит в том, чтобы построить сегмент для каждого пикселя, выполнить итерации по точкам и поместить каждый в сегмент в соответствии со значениями (X,Y). Наконец, создайте матрицу, в которой каждая продажа содержит среднее значение Z в соответствующем сегменте.
- Поскольку у меня нет большого опыта в этой области, я хотел бы услышать некоторые советы и особенно, если есть лучшие способы для решения этой задачи.
- Есть ли функция numpy для преобразования моего набора точек в нужную матрицу? (может быть сетка с шагами постоянного значения?)
Если я построю очень разреженную матрицу, где размер шага
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()
Я знаю, что я не отвечаю на половину ваших вопросов, но вот как я это сделаю:
- Создать двумерный массив желаемого разрешения,
- "Самые левые" значения соответствуют наименьшим значениям x и т. Д.
- Заполните массив значением высот ближайшего совпадения в терминах значений x и y
- Сгладить результат.