2017-02-14 13 views
0

У меня есть 3D-LiDAR pointcoud, представляющий дерево, загруженное в python с помощью пакета laspy. Теперь он хранится в виде массива 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

thts, что я хочу делать, но у меня проблемы с поиском этих точек. Я обновил вопрос. – Bob

+0

Итак, в основном это не вопрос, а вопрос о том, как выглядят ваши данные. Не могли бы вы немного объяснить формат? – Dschoni

ответ

0

Это просто слепое предположение, потому что для хорошего ответа есть много информации.

Предположим, что мы имеем массив из 3 точек с (х, у, г)

А = [1,2,3]

В = [1,2,4]

C = [0,1,2].

Мы определили точку А как максимум в г и имеем его широту и долго с

lat = 1 
long = 2 

В принципе, вы идете по списку точки и отфильтровать все точки, вы хотите посмотреть на , и возьмем минимальную точку. Ниже приведен простой способ сделать это, используя for-loop. Это не идеально подходит для скорости. 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