2017-02-14 10 views
0

私は3D-LiDAR pointcoudをlaspyパッケージでPythonに読み込まれたツリーに置き換えました。これは、今すぐnumpy配列として格納されます。私の目的は、最高のz値を持つ点を見つけてその下のz値の最小値までの距離を計算することによって木の高さを計算することです。 だから私は、を介してデータをインポート:現時点で木の高さと冠の幅をnumpyの配列で検出します。

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

、iを高さを計算:

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

問題は、この方法は、私は、アカウントに地形にスロープを取らないということです。どのようにして、最高のポイントを正確に下回るポイントにインデックスを付けることができますか?

+0

ちょうど2点間のユークリッド距離を使うのか? – Dschoni

+0

私は何をしたいのですか?しかし、私はこれらの点を見つけるのに問題があります。私は質問を更新しました。 – Bob

+0

だから、基本的にこれは気の利いた質問ではありませんが、データがどのように見えるかという疑問があります。形式を少し説明できますか? – Dschoni

答えて

0

これは丁度盲目の推測です。なぜなら、良い答えのためには、多くの情報が欠落しているからです。

A = [1,2,3]

B = [1,2,4]

(Z、x、y)は我々が3点の配列を有していると仮定C = [0,1,2]。

私たちは基本的に、あなたがポイントのリストを通過し、すべてのポイントをフィルタリングZで最大であるとしてA点を特定し、

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 
関連する問題