LAS dosyası numpy dizisine dönüştürülüyor mu?


15

Python LAS verileri nasıl manipüle öğrenmeye başladım ve başkalarının LAS dosyaları nasıl işlediğini görmek istedim. (Ben bir numpy dizi kullanıyorum) noktaları okumak ve sınıf 1 ve 2 (sınıflandırılmamış ve zemin) ayrı bir diziye filtre istiyorum. Aşağıdaki kod var ama puan filtre alınamıyor.

# Import modules
from liblas import file
import numpy as np

if __name__=="__main__":
    '''Read LAS file and create an array to hold X, Y, Z values'''
    # Get file
    las_file = r"E:\Testing\ground_filtered.las"
    # Read file
    f = file.File(las_file, mode='r')
    # Get number of points from header
    num_points = int(f.__len__())
    # Create empty numpy array
    PointsXYZIC = np.empty(shape=(num_points, 5))
    # Load all LAS points into numpy array
    counter = 0
    for p in f:
        newrow = [p.x, p.y, p.z, p.intensity, p.classification]
        PointsXYZIC[counter] = newrow
        counter += 1

Arcpy.da.featureClassToNumpyArray'i gördüm, ancak arcpy'yi içe aktarmak veya şekil dosyasına dönüştürmek istemedim.

LAS verilerini nümerik bir diziye nasıl filtreleyebilir / okuyabilirim?


Hata mesajı (varsa) nedir?
39'da til_b

Hata yok. Ben sadece filtre nasıl bilmiyordum ve dizi içine LAS almak için daha iyi bir yolu olup olmadığından emin değildi.
Barbarossa

Yanıtlar:


14

Sizin PointsXYZICşimdi bir numpy dizidir. Bu , ilgilendiğiniz verilere filtre uygulamak için numpy endekslemeyi kullanabileceğiniz anlamına gelir . Örneğin, hangi noktaların yakalanacağını belirlemek için bir boole dizini kullanabilirsiniz.

#the values we're classifying against
unclassified = 1
ground = 2

#create an array of booleans
filter_array = np.any(
    [
        PointsXYZIC[:, 4] == unclassified, #The final column to index against
        PointsXYZIC[:, 4] == ground,
    ],
    axis=0
)

#use the booleans to index the original array
filtered_rows = PointsXYZIC[filter_array]

Artık verilerin sınıflandırılmamış veya topraklanmamış tüm değerlerini içeren bir numpy diziniz olmalıdır. Sınıflandırılmış değerleri almak için şunları kullanabilirsiniz:

filter_array = np.all(
    [
        PointsXYZIC[:, 4] != unclassified, #The final column to index against
        PointsXYZIC[:, 4] != ground,
    ],
    axis=0
)

Filtre çalışıyor gibi görünüyor, ancak sadece 5 kayıt yazıyor. Sadece 1 ve 2 sınıfları filtrelemeye çalıştım ve sonra 1 ve 2 dışındaki her şeyi filtrelemeye çalıştım, her ikisi de bana sadece 5 sonuç verdi. Herhangi bir fikir?
Barbarossa

Bu 5 kayıt 1-d dizidedir.
Barbarossa

Maalesef, yukarıdaki kodu, herhangi bir hesaplamayı yapmak için eksenin spesifikasyonunu gerektirdiği için güncelledi (dizinin tüm boyutlarını veya tüm boyutlarını gerçekleştirmeden).
om_henners

5

LAS dosyalarını okumak ve etkileşime girebileceğiniz sayısal diziler olarak verileri kolayca döndürmek için laspy kullanın . laspy saf python, neredeyse libLAS kadar hızlı, libLAS Python bağlarından daha fazla özelliğe sahiptir ve dağıtımı çok daha kolaydır.


0

Bunu zaten biliyorsan özür dilerim, ancak LASTools şimdi hem ArcGIS hem de QGIS 2.0 ile entegre olan harika bir Açık Kaynak aracıdır - Bu, verileri baktığınız şekilde filtreleme seçeneklerine sahiptir.


Teşekkürler @Nicholas, LASTools
Barbarossa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.