2017-02-14 4 views
0

J'ai un pointage 3D-LiDAR qui représente un arbre chargé en python avec le paquet laspy. Il est maintenant stocké sous forme de tableau numpy. Mon but est de calculer la hauteur de l'arbre en trouvant le point avec la valeur z la plus élevée et calculer la distance à la valeur z la plus basse en dessous. J'importer les données via:Détection de la hauteur de l'arbre et de la largeur de la couronne dans un tableau numpy

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

En ce moment, je calcule la hauteur par:

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

Le problème est que cette façon, je ne prends pas la pente du terrain en compte. Comment puis-je indexer le point qui est exactement au-dessous du point le plus élevé?

+0

utiliser juste la distance euclidienne entre deux points? – Dschoni

+0

ce que je veux faire mais j'ai du mal à trouver ces points. J'ai mis à jour la question. – Bob

+0

Donc, fondamentalement, ce n'est pas une question numpy, mais plutôt une question à quoi ressemblent vos données. Pouvez-vous expliquer le format un peu? – Dschoni

Répondre

0

Ceci est juste une supposition aveugle, car pour une bonne réponse, il y a beaucoup d'informations manquantes.

Supposons que nous avons un réseau de 3 points avec (x, y, z)

A = [1,2,3]

B = [1,2,4]

C = [0,1,2].

Nous avons identifié le point A comme étant le maximum z et ont sa latitude et à long avec

lat = 1 
long = 2 

Fondamentalement, vous allez dans la liste des points et filtrer tous les points, vous voulez regarder , et prenez le point minimal. Voici une façon simple de le faire, en utilisant une boucle for. Ce n'est pas idéal pour la vitesse. np.where() et FancyIndexing peuvent être utilisés pour faire plus facile et plus rapide, mais cela est plus lisible et réglable:

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