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

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

Я уже пытался запустить модуль lasInfo для всего блока, но я получаю только значения min и max 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.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)
Другие вопросы по тегам