Исходные .las файлы обработаны с помощью методов топологического анализа. Выявлены зоны интереса, которые сохранены в векторные файлы. Ссылка: Google Drive.
Использовались три различных метода анализа, каждый из которых лучше подходит для определённых задач:
fromZero— высота анализируется "снизу-вверх". Чаще всего при таком подходе определяются углубления.fromMax— анализ производится "сверху-вниз", позволяя лучше определить возвышенности и бугры.radius— сперва выделяются объекты из точек со схожей высотой, затем они расширяются.
Использованный код обработки хранится в файле main.py в виде набора функций. Для получения shape-файла из карты высот необходимо вызвать функцию process_las_file, передав путь к исходному файлу, выходной путь и экземпляр объекта с настройками чтения и обработки LasReaderSetup. Пример работы также представлен в main.py. Для обработки сразу нескольких файлов с облаком точек предусмотрена функция process_multiple_files.
У каждого объекта в shape-файле есть свойства:
id— уникальный идентификатор в области чтения.ParentID— идентификатор родительского объекта в области. Если родитель отсутствует, значение равно4294967295.Depth— показатель глубины. У самой верхней (без родительской) области равен1.Start— время появления объекта. ДляfromZeroиfromMaxвыражается в показателе высоты, от которого объект начал разрастаться; дляradius— показатель схожести начальных точек в компоненте.End— время исчезновения объекта. ДляfromZeroиfromMaxвыражается в показателе высоты, на котором объект перестал разрастаться; дляradius— показатель схожести конечных точек.NumPoints— количество точек в объекте.
По данным свойствам можно производить фильтрацию. Сначала убираются слишком малые и слишком большие компоненты, так как они мешают визуализации:
"NumPoints" < 1000000 AND "NumPoints" > 100Следующий фильтр выделит дорогу:
"Start" = 0
AND to_real("End") >= 17204 AND to_real("End") <= 17413.33398
AND "NumPoints" >= 82461 AND "NumPoints" <= 112220
AND "Depth" IN (2, 3)
AND area($geometry) < 1000000Следующий фильтр выделит кочкообразные элементы:
"NumPoints" >= 2000 AND "NumPoints" <= 210000
AND to_real("Start") >= 20100
AND (
"End" = -9999 OR (to_real("End") >= 17400 AND to_real("End") <= 30000)
)
AND "Depth" IN (2, 3, 4)Следующий фильтр выделит малые (шумовые) объекты:
"Depth" > 2
AND "NumPoints" <= 26000- Открывается
.lasфайл. - Файл читается по кускам (тайлам) с наложением. Это нужно, т.к. исходный размер слишком большой (в рамках потребления ОЗУ) для обработки на домашнем компьютере
- Точки тайла сужаются и проецируются на матрицу.
- По матрице строится топологическая характеристика.
- Из характеристики извлекаются найденные объекты.
- Объекты векторизируются и проецируются по системе координат файла.
- Найденные объекты фильтруются и записываются в выходной файл.
В среднем полная обработка (шаги 2-7) одного тайла размером 1600 на 1600 пикселей занимает 79 сек. на процессоре Apple M2.
Запустить утилиту с аргументами (указать корректный путь к las файлу):
LasTopoDec "LiDAR_BIGDATA_GN/Ground_2020_Участок 1.las" output.shpПервым аргументом передаётся исходный las файл, вторым – выходной. Также возможно передать опции построения. Их можно посмотреть через вызов справочной информации:
LasTopoDec -h- Установить Python версии не ниже
3.11. - Создать виртуальную среду:
python -m venv venv- Активировать виртуальную среду:
- На Windows:
venv\Scripts\activate
- На macOS/Linux:
source venv/bin/activate - Установить зависимости:
pip install -r requirements.txt- Запустить
main.pyили использовать его в своём скрипте. Пример:
preferences = LasReaderSetup()
# В .las точки неравномерны, между x1 и x10 может быть 3-5 точек,
# поэтому нужно уменьшить размерность
preferences.aproximateRectSize = 10
# Целиком обработка файла слишком затратна из-за большого размера.
# Для выполнения обработки на обычном компьютере необходимо разбить на чанки.
# Размер указывается в пикселях после уменьшения размерности.
preferences.chunkSize = 1500
# Так как важные объекты могут быть на границе чанка, нужно брать с захлёстом.
# В идеале размер нахлёста — максимальный размер объекта.
preferences.chunkOversize = 100
preferences.procType = bc.ProcType.Radius
# True — пропускать отсутствующие данные, тогда в обработке ,будут использоваться только существующие точки (области точек).
# False — подставлять на место отсутствующих точек значение по умолчанию (-9999 или 9999).
preferences.useMask = False
process_las_file(las_file_path, output, preferences)Чтобы привязать растровое изображение к координатам .las файла, написан скрипт bind_image.py.


