Как получить уникальные «идентификаторы точечного источника» для лидарного блока?

#python-3.x #lidar #laspy #las

#python-3.x #лидарный #laspy #las

Вопрос:

Я пытаюсь получить информацию об уникальных линиях полета, появляющихся в блоке лидарных данных, используя laspy.

Я уже пытался запустить модуль lasInfo для всего блока, но я получаю только минимальные и максимальные значения point_source_ID, противоположные списку отдельных линий, которые мне нужны.

Это то, что я пробовал до сих пор:

 import laspy
import glob

las_files_list = glob.glob(r'PATH*.las')
print(las_files_list)

las_source_id_set = set()

for f in las_files_list:
    las_file = laspy.file.File(f, mode='r')
    las_source_id_list = las_file.pt_src_id


    for i in las_source_id_list:
        las_source_id_set.add(i)

    las_file.close()
    print(las_source_id_set,' ', f)

print(las_source_id_set)

with open('point_source_id.txt', 'w') as f:
    f.write(las_source_id_set)
  

К сожалению, весь процесс довольно медленный, и с большим набором данных я получаю ошибку переполнения стека и в конечном итоге никогда не добираюсь до части «запись файла».

Ответ №1:

Процесс идет медленнее, чем мог бы быть, потому что вы выполняете цикл в Python. Существует функция numpy, которую вы можете использовать для ускорения процесса: numpy.unique

Ваш скрипт станет:

 import laspy
import glob
import numpy as np

las_files_list = glob.glob(r'PATH*.las')
print(las_files_list)

las_source_id_set = set()

for f in las_files_list:
    with laspy.file.File(p) as las:
        las_source_id_set.update(np.unique(las.pt_src_id))


    print(las_source_id_set,' ', f)

print(las_source_id_set)

with open('point_source_id.txt', 'w') as f:
    f.write(las_source_id_set)