Добавление индекса в файл laspy (.las)
У меня есть два файла, один шейп-файл esri (.shp), другой облако точек (.las).
Используя модули laspy и shapefile, мне удалось выяснить, какие точки файла.las попадают в определенные полигоны шейп-файла. Теперь я хочу добавить индексный номер, позволяющий идентифицировать два набора данных. Так, например, все точки, которые попадают в полигон 231, должны получить число 231.
Проблема в том, что пока я не могу добавить что-либо в список точек при записи файла.las. Часть кода, в которой я пытаюсь это сделать, находится здесь:
outFile1 = laspy.file.File("laswrite2.las", mode = "w",header = inFile.header)
outFile1.points = truepoints
outFile1.points.append(indexfromshp)
outFile1.close()
Ошибка, которую я получаю сейчас: AttributeError: у объекта 'numpy.ndarray' нет атрибута 'append'. Я уже пробовал несколько вещей, включая np.append, но я действительно в растерянности относительно того, как добавить что-либо в файл las.
Любая помощь высоко ценится!
1 ответ
Есть несколько способов сделать это.
Las файлы имеют поле классификации, вы можете хранить индексы в этом поле
las_file = laspy.file.File("las.las", mode="rw")
las_file.classification = indexfromshp
Однако, если файл Las имеет версию <= 1.2, поле классификации может хранить только значения в диапазоне [0, 35], но вы можете использовать поле 'user_data', которое может содержать значения в диапазоне [0, 255].
Или, если вам нужно сохранить значения выше 255 / вам нужно отдельное поле, вы можете определить новое измерение (см. Документ laspy о том, как добавить дополнительные измерения). Ваш код должен быть примерно таким
outFile1 = laspy.file.File("laswrite2.las", mode = "w",header = inFile.header)
# copy fields
for dimension in inFile.point_format:
dat = inFile.reader.get_dimension(dimension.name)
outFile1.writer.set_dimension(dimension.name, dat)
outFile1.define_new_dimension(
name="index_from_shape",
data_type=7, # uint64_t
description = "Index of corresponding polygon from shape file"
)
outFile1.index_from_shape = indexfromshp
outFile1.close()