Перетворення файлу LAS в масив numpy?


15

Я почав вчитися маніпулювати даними LAS в python і хотів побачити, як інші обробляють файли LAS. Я хотів би прочитати точки (я використовую нумерований масив) та відфільтрувати класи 1 та 2 (некласифіковані та ґрунтові) до окремого масиву. У мене є наступний код, але, здається, бали не фільтруються.

# 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, але я не хотів імпортувати arcpy, ані перетворювати його у shapefile.

Як інакше я можу фільтрувати / читати дані LAS в масивний масив?


Що таке повідомлення про помилку (якщо воно є)?
til_b

Немає помилок. Я просто не знав, як фільтрувати, і не знав, чи є кращий спосіб залучити LAS у масив.
Барбаросса

Відповіді:


14

Ваш PointsXYZICтепер масивний масив. Це означає, що ви можете використовувати нумеровану індексацію для фільтрації даних, які вас цікавлять. Наприклад, ви можете використовувати індекс булевих даних, щоб визначити, які точки потрібно захопити.

#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]

Тепер у вас має бути нумерований масив із усіма значеннями, за якими дані не є класифікованими чи підпорядкованими. Щоб отримати класифіковані значення, ви можете використовувати:

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

Фільтр, здається, працює, але пише лише 5 записів. Я намагався фільтрувати лише 1 та 2 класи, а потім спробував відфільтрувати всі, крім 1 та 2, давши мені лише 5 результатів. Будь-які ідеї?
Barbarossa

Ці 5 записів знаходяться в 1-денному масиві.
Barbarossa

На жаль, оновлено код вище, оскільки він вимагає специфікації осі, щоб зробити будь-який обчислення разом (без нього він виконує або по всіх вимірах масиву).
om_henners

5

Використовуйте laspy для читання файлів LAS і легко повертайте дані у вигляді numpy масивів, з якими ви можете взаємодіяти. laspy - чистий пітон, майже такий же швидкий, як libLAS, має більше можливостей, ніж прив'язки libLAS Python, і його набагато простіше розгортати.


0

Прошу вибачення, якщо ви вже знаєте про це, але LASTools - це фантастичний інструмент з відкритим кодом, який тепер інтегрується як з ArcGIS, так і з QGIS 2.0 - у нього є можливості фільтрувати дані таким чином, як ви дивитесь.


Дякую @Nicholas, я використовую бібліотеку пітонів liblas, яка тісно пов'язана з LASTools
Barbarossa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.