2017-02-14 67 views
0

我有一个3D-LiDAR pointcoud,用一个laspy包加载到python中。它现在被存储为一个numpy数组。我的目的是通过找到具有最高z值的点并计算到它下面的最低z值的距离来计算树的高度。 所以我通过导入的数据:在numpy数组中检测树的高度和树冠宽度

inFile = laspy.file.File("~/DATA/tree.las", mode='r') 
point_records = inFile.points 

目前,我通过计算身高:

min = inFile.header.min 
max = inFile.header.max 
zdist = max[2] -min[2] 

的问题是,这样一来,我不带坡度的地形考虑在内。我如何索引恰好低于最高点的点?

+0

只要使用两个点之间的欧氏距离? – Dschoni

+0

这就是我想要做的,但我有问题找到这些要点。我更新了这个问题。 – Bob

+0

所以,基本上这不是一个粗糙的问题,但更多的是一个问题,你的数据是怎么样的。你能解释一下这个格式吗? – Dschoni

回答

0

这只是一个盲目的猜测,因为对于一个很好的答案,缺少很多信息。

假设我们有3个点与(X,Y,Z)

A = [1,2,3]

B = [1,2,4]

阵列C = [0,1,2]。

我们已经确定了A点为Z轴的最大和具有其lat和长着

lat = 1 
long = 2 

基本上,你通过点的列表,并过滤掉所有的点,你想看看,并采取最低点。下面是使用for循环的简单方法。这对速度并不理想。 np.where()和花哨的索引可以使用,这样做更容易和更快,但是这是更具可读性和可调节:

import numpy as np 
# This is some test data, with three data points 
a = np.array([[1,2,3],[1,2,4],[0,1,2]]) 
# Now we define the lat and long we want to get 
filter_x = 1 
filter_y = 2 
filtered_points = [] 
for i in range(a.shape[0]): # iterating through all points 
    if a[i][0] == filter_x and a[i][1] == filter_y: 
     filtered_points.append(a[i][2]) # Append z of point to list 
print min(filtered_points) # print minimum