Определить высоту дерева и ширину кроны в массиве
У меня есть 3D-LiDAR pointcoud, представляющий дерево, загруженное в python с помощью пакета laspy. Теперь он хранится в виде массива. Моя цель - вычислить высоту дерева, найдя точку с самым высоким z-значением и вычислить расстояние до самого низкого z-значения под ним. Поэтому я импортировал данные через:
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]
Проблема в том, что таким образом я не принимаю во внимание уклон на местности. Как я могу индексировать точку, которая находится точно ниже самой высокой?
1 ответ
Это только слепое предположение, потому что для хорошего ответа, много информации отсутствует.
Предположим, у нас есть массив из 3 точек с (x, y, z)
A = [1,2,3]
B = [1,2,4]
С = [0,1,2].
Мы определили точку A как максимум в z и имеем ее широту и длину с
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