【发布时间】:2018-11-14 09:39:15
【问题描述】:
我通过单次扫描获得了地面 LiDAR 点云。我导入了点云(.las 文件)并创建了 GeoPandas 数据框,包括每个点的 XY 坐标。有人可以给我指导如何使用 Python 3x 从扫描位置(X = 0,Y = 0)提取半径 20 米内的点。
【问题讨论】:
标签: python extract geopandas lidar
我通过单次扫描获得了地面 LiDAR 点云。我导入了点云(.las 文件)并创建了 GeoPandas 数据框,包括每个点的 XY 坐标。有人可以给我指导如何使用 Python 3x 从扫描位置(X = 0,Y = 0)提取半径 20 米内的点。
【问题讨论】:
标签: python extract geopandas lidar
我建议使用PDAL 并开发pipeline 来实施您的工作流程。你可以轻松install PDAL via Conda。
使用 PDAL,您可以crop 将点保留在指定点的 2D 或 3D 半径内(分别使用 distance 和 point 选项)。 PDAL 还有像SMRF 和PMF 这样的接地滤波器。
我想您要使用的 basic 管道是这样的,尽管您可能需要根据您的数据对其进行调整或设置一些高级选项。
{
"pipeline":[
{
"type":"filters.crop",
"point":"POINT (0 0)",
"distance":20.0
},
{
"type":"filters.smrf"
}
]
}
一旦你安装了 PDAL 并弄清楚你的处理管道需要是什么样子,你也可以在 Python 中execute it,最终结果是一个 Numpy 数组。
更新
SMRF 过滤器的建议用法对点进行分类,但不提取它们。您需要使用 PDAL 或 Python 通过逐点检查 Classification 值来提取地面返回,其中值 2 表示地面返回。
更新
前面提到的例子,用 Python 显示,在 cmets 中讨论过。
import pdal
json = """{
"pipeline":[
"/path/to/input.laz",
{
"type":"filters.crop",
"point":"POINT (0 0)",
"distance":20.0
},
{
"type":"filters.smrf"
},
"/path/to/output.laz"
]
}"""
pipeline = pdal.Pipeline(json)
pipeline.validate()
pipeline.execute()
【讨论】:
POINT (1000, 2000) 而不是POINT(1000 2000)(没有逗号)。
filename 键(它只列出了值)。此外,读取器和写入器中的路径都不正确 - 斜杠应该颠倒(这表明两个文件都位于根目录中)。
True 表明管道是有效的,但您仍然没有执行它。也尝试运行pipeline.execute()。
pipeline.execute() 后,它现在正在运行并按预期创建子集。