将坐标向量转换为numpy 2D矩阵

时间:2015-11-25 21:28:28

标签: python numpy matrix matplotlib lidar

我有一组3D坐标点:[lat,long,elevation]([X,Y,Z]),来自LIDAR数据。 这些点没有排序,点之间的步长或多或少是随机的。

我的目标是构建一个函数,将这组点转换为具有恒定像素数的2D numpy矩阵,其中每个(X,Y)单元格保持Z值,然后将其绘制为高程热图。

  • 刻度必须保持真实,X和Y应具有相同的步长。
  • 矩阵不必捕捉到精确的高程图片,显然需要某种分辨率降低以获得恒定的像素数。

我想到的解决方案是为每个像素构建一个桶,迭代点并根据它的(X,Y)值将每个点放入桶中。最后创建一个矩阵,其中每个sell保存相应桶中Z值的平均值。

  1. 由于我在这个领域没有丰富的经验,我很乐意听到一些提示,特别是如果有更好的方法来解决这个问题。
  2. 是否存在将我的点集转换为所需矩阵的numpy函数? (也许是使用常量值的步长进行网格化?)
  3. 如果我构建非常稀疏的矩阵,其步长为

    所有i,j,k,l

    min [min {Xi,Xj},min {Yk,Yl}]

    有没有办法减少"分辨率并将其转换为具有所需大小的矩阵?

  4. 谢谢!

2 个答案:

答案 0 :(得分: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 :(得分:0)

我知道我没有回答你的一半问题,但我就是这样做的:

  1. 创建所需分辨率的二维数组
  2. "最左边"值对应于x的最小值等等
  3. 使用x和y值方面最接近匹配的高程值填充数组
  4. 使结果顺畅。