Vou recomendar PDAL a biblioteca de abstração de dados de pontos. Eu tive um bom sucesso usando o PDAL para um problema de filtragem semelhante. Eu gosto do PDAL porque é de código aberto, fornece suporte ao Python e facilita a reprodução do processamento e o controle dos meus parâmetros de filtragem. Também gosto porque possui 'pipelines' onde você pode encadear várias etapas (por exemplo, cortar, filtrar e exportar) e executá-las de uma só vez. Observe que, se você tem nuvens de pontos realmente grandes, o PDAL pode não ser tão rápido quanto algumas outras soluções (LASTools, QTM etc.).
Você poderia resolver o problema dos pontos periféricos com um pipeline PDAL semelhante ao seguinte:
{
"pipeline": [
"input_utm.las",
{
"type":"filters.crop",
"bounds":"([401900,415650],[7609100,7620200])"
},
{
"type":"filters.outlier",
"method":"statistical",
"mean_k":12,
"multiplier":2.0
},
{
"type":"filters.range",
"limits":"Classification![7:7]"
},
{
"filename":"output.tif",
"resolution":1.0,
"output_type":"mean",
"radius":3.0,
"bounds":"([401900,415650],[7609100,7620200])",
"type": "writers.gdal"
}
]
}
Esse pipeline lê em um LAS, o recorta em uma extensão UTM especificada e, em seguida, executa um filtro que sinaliza todos os pontos externos, depois executa um segundo filtro que retém apenas pontos não externos (ou seja, o sinalizador de classificação! = 7) e depois exporta para GeoTIFF com uma resolução de 1 m. O filtro estatístico está executando um cálculo de distância média do vizinho mais próximo para testar se um ponto está ou não "muito distante" de seus vizinhos e, portanto, um valor externo.
A partir da documentação :