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