Определить высоту дерева и ширину кроны в массиве

У меня есть 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
Другие вопросы по тегам