O GanosBase PointCloud é uma extensão do PostgreSQL para o PolarDB for PostgreSQL que armazena e gerencia dados de nuvem de pontos provenientes de scanners LIDAR e sistemas de varredura 3D. Ele oferece tipos de dados especializados, codificação de dimensões baseada em schema e compressão para lidar com a escala e a heterogeneidade típicas dos conjuntos de dados de nuvem de pontos 3D. O GanosBase PointCloud integra-se a outros módulos do GanosBase para executar análises espaciais nesses dados.
Conceitos principais
Tipos de dados
O GanosBase PointCloud introduz dois tipos de dados: PcPoint e PcPatch.
PcPoint é a unidade básica dos dados de nuvem de pontos. Cada PcPoint contém pelo menos as coordenadas X e Y, podendo incluir dimensões adicionais como Z (elevação), intensidade ou valores RGB. Esse tipo permite importar e exportar dados, consultar o schema da nuvem de pontos e realizar consultas espaciais. Use PcPoint quando precisar processar ou consultar pontos individuais.
PcPatch representa um conjunto de objetos PcPoint próximos armazenados como uma única linha no banco de dados. O uso de objetos PcPatch reduz o número de linhas na tabela, tornando o armazenamento e as consultas espaciais significativamente mais eficientes. O PcPatch permite empacotar, comprimir e descomprimir pacotes de dados, além de consultar schemas e filtrar pacotes. Use PcPatch para armazenamento de nuvens de pontos em grande escala e consultas espaciais em massa.
A representação JSON de cada tipo é:
// PcPoint: a single point
{"pcid": 1, "pt": [0.01, 0.02, 0.03, 4]}
// PcPatch: a collection of points
{"pcid": 1, "pts": [[0.02, 0.03, 0.05, 6], [0.02, 0.03, 0.05, 8]]}
Schema de nuvem de pontos
Sensores LIDAR e scanners 3D variam amplamente: alguns capturam apenas valores X/Y/Z, enquanto outros adicionam intensidade, número de retorno, RGB ou dezenas de outras variáveis. Os formatos de armazenamento também diferem — a intensidade pode ser um inteiro de 4 bytes em um conjunto de dados e um único byte em outro. O documento de schema resolve essa heterogeneidade ao declarar exatamente quais dimensões cada ponto contém e como cada dimensão é codificada.
O GanosBase PointCloud utiliza o mesmo formato de schema da biblioteca PDAL. Cada schema é um documento XML que define:
As dimensões de cada ponto (nome, posição, tipo de dados, escala)
O método de compressão para o patch
Os schemas são armazenados na tabela pointcloud_formats juntamente com um identificador inteiro exclusivo chamado PCID (ID da nuvem de pontos). Todo objeto PcPoint e PcPatch referencia um PCID como chave estrangeira para identificar seu schema.
Sistema de referência espacial
Um sistema de referência espacial (SRS) mapeia as coordenadas da nuvem de pontos para locais reais na Terra. O GanosBase referencia definições de SRS por meio de um inteiro chamado SRID, que atua como chave estrangeira para a tabela spatial_ref_sys.
Para mais informações, consulte Referência espacial.
Visualização de colunas de dados
A visualize pointcloud_columns lista todas as colunas de nuvem de pontos no banco de dados atual, de forma semelhante à visualize de colunas de geometria no PostGIS.
|
Coluna |
Tipo |
Descrição |
|
schema |
varchar(256) |
Schema da tabela |
|
table |
varchar(63) |
Nome da tabela |
|
column |
varchar(63) |
Nome da coluna de nuvem de pontos |
|
pcid |
integer |
Chave estrangeira para |
|
srid |
integer |
Chave estrangeira para |
|
type |
varchar(30) |
|
Consulte todas as colunas de nuvem de pontos no banco de dados atual:
SELECT * FROM pointcloud_columns;
Compressão de dados
Conjuntos de dados de nuvem de pontos costumam ser volumosos. O GanosBase PointCloud suporta os seguintes métodos de compressão, especificados no bloco <pc:metadata> do schema:
<pc:metadata>
<Metadata name="compression">dimensional</Metadata>
</pc:metadata>
None (padrão): Sem compressão. Objetos PcPoint e PcPatch são armazenados como arrays de bytes brutos, utilizando os tipos e formatos definidos no schema.
Dimensional: Aplicável apenas a PcPatch. Os pontos são reorganizados por dimensão — todos os valores de X juntos, todos os valores de Y juntos, e assim por diante — e cada array de dimensão é comprimido independentemente usando o subalgoritmo mais adequado:
|
Subalgoritmo |
Mais indicado para |
|
Run-length encoding |
Dimensões com baixa variabilidade (muitos valores repetidos) |
|
Common bits removal |
Dimensões com variabilidade em uma faixa pequena |
|
Deflate (zlib) |
Dimensões onde os métodos acima não se aplicam |
|
LAZ (LASZip) |
Dados LIDAR (formato padrão de compressão LIDAR) |
Para objetos PcPatch pequenos que amostram áreas semelhantes, a compressão dimensional atinge uma taxa de compressão de 3:1 a 5:1. Objetos PcPoint em um schema com compressão dimensional são armazenados da mesma forma que no método None.
Como funciona a compressão dimensional
Antes da compressão, um PcPatch com 4 dimensões e 6 pontos é armazenado em ordem de linha principal (row-major):
{
"pcid": 1,
"pts": [
[-126.99, 45.01, 1, 0],
[-126.98, 45.02, 2, 0],
[-126.97, 45.03, 3, 0],
[-126.96, 45.04, 4, 0],
[-126.95, 45.05, 5, 0],
[-126.94, 45.06, 6, 0]
]
}
Após a compressão dimensional, os valores são reorganizados em arrays separados por dimensão:
{
"pcid": 1,
"dims": [
[-126.99, -126.98, -126.97, -126.96, -126.95, -126.94],
[45.01, 45.02, 45.03, 45.04, 45.05, 45.06],
[1, 2, 3, 4, 5, 6],
[0, 0, 0, 0, 0, 0]
]
}
Cada array de dimensão é comprimido independentemente — a última dimensão (todos zeros) é reduzida a quase zero bytes com run-length encoding.
Casos de uso
Modelagem e visualização 3D: Armazene e processe dados de varredura 3D para projetos arquitetônicos, planejamento urbano e preservação de patrimônio cultural.
Robótica e direção autônoma: Processe dados de percepção 3D para dar suporte à detecção de ambiente, identificação de obstáculos e planejamento de trajetória.
Medição industrial e garantia de qualidade: Analise dados de forma superficial obtidos por scanners 3D para assegurar a qualidade do produto, validar designs e otimizar processos de fabricação.
Início rápido
Esta seção aborda a criação de extensões, definição de schema, construção de tabelas, inserção de dados e consulta de agregações.
Instale as extensões
Instale ambas as extensões usando os seguintes comandos:
CREATE EXTENSION ganos_pointcloud CASCADE;
CREATE EXTENSION ganos_pointcloud_geometry CASCADE;
Para evitar problemas de permissão, instale as extensões no schema public:
CREATE EXTENSION ganos_pointcloud WITH SCHEMA public;
CREATE EXTENSION ganos_pointcloud_geometry WITH SCHEMA public;
Defina um schema de nuvem de pontos
Insira um schema na tabela pointcloud_formats. O schema abaixo define quatro dimensões — X, Y, Z (cada uma como um inteiro assinado de 4 bytes com escala de 0,01) e Intensity (inteiro não assinado de 2 bytes) — com compressão dimensional ativada.
INSERT INTO pointcloud_formats (pcid, srid, schema) VALUES (1, 4326,
'<?xml version="1.0" encoding="UTF-8"?>
<pc:PointCloudSchema xmlns:pc="http://pointcloud.org/schemas/PC/1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<pc:dimension>
<pc:position>1</pc:position>
<pc:size>4</pc:size>
<pc:description>X coordinate as a long integer. You must use the scale and offset
information of the header to determine the double value.</pc:description>
<pc:name>X</pc:name>
<pc:interpretation>int32_t</pc:interpretation>
<pc:scale>0.01</pc:scale>
</pc:dimension>
<pc:dimension>
<pc:position>2</pc:position>
<pc:size>4</pc:size>
<pc:description>Y coordinate as a long integer. You must use the scale and offset
information of the header to determine the double value.</pc:description>
<pc:name>Y</pc:name>
<pc:interpretation>int32_t</pc:interpretation>
<pc:scale>0.01</pc:scale>
</pc:dimension>
<pc:dimension>
<pc:position>3</pc:position>
<pc:size>4</pc:size>
<pc:description>Z coordinate as a long integer. You must use the scale and offset
information of the header to determine the double value.</pc:description>
<pc:name>Z</pc:name>
<pc:interpretation>int32_t</pc:interpretation>
<pc:scale>0.01</pc:scale>
</pc:dimension>
<pc:dimension>
<pc:position>4</pc:position>
<pc:size>2</pc:size>
<pc:description>The intensity value is the integer representation of the
pulse return magnitude. However, it should always be included if available.</pc:description>
<pc:name>Intensity</pc:name>
<pc:interpretation>uint16_t</pc:interpretation>
<pc:scale>1</pc:scale>
</pc:dimension>
<pc:metadata>
<Metadata name="compression">dimensional</Metadata>
</pc:metadata>
</pc:PointCloudSchema>');
Crie tabelas de nuvem de pontos
-- A table of individual points (PcPoint)
CREATE TABLE points (
id SERIAL PRIMARY KEY,
pt PCPOINT(1) -- references the schema with PCID = 1
);
-- A table of point patches (PcPatch)
CREATE TABLE patches (
id SERIAL PRIMARY KEY,
pa PCPATCH(1)
);
Insira dados PcPoint
Todos os exemplos abaixo usam ST_MakePoint para construir objetos PcPoint.
-- Insert 100 generated points
INSERT INTO points (pt)
SELECT ST_MakePoint(1, ARRAY[x, y, z, intensity])
FROM (
SELECT
-127 + a/100.0 AS x,
45 + a/100.0 AS y,
1.0 * a AS z,
a / 10 AS intensity
FROM generate_series(1, 100) AS a
) AS values;
-- Construct a single PcPoint and inspect it
SELECT ST_MakePoint(1, ARRAY[-127, 45, 124.0, 4.0]);
-- 010100000064CEFFFF94110000703000000400
SELECT ST_AsText('010100000064CEFFFF94110000703000000400'::pcpoint);
-- {"pcid":1,"pt":[-127,45,124,4]}
Insira dados PcPatch
Agrupe pontos em patches usando ST_Patch e inspecione-os com ST_MakePatch:
-- Group points into patches of 10
INSERT INTO patches (pa)
SELECT ST_Patch(pt) FROM points GROUP BY id/10;
-- Construct a patch from a flat coordinate array and inspect it
SELECT ST_AsText(ST_MakePatch(1, ARRAY[-126.99, 45.01, 1, 0,
-126.98, 45.02, 2, 0,
-126.97, 45.03, 3, 0]));
-- {"pcid":1,"pts":[[-126.99,45.01,1,0],[-126.98,45.02,2,0],[-126.97,45.03,3,0]]}
Consulte estatísticas de patch
Calcule o valor médio de cada dimensão de atributo em um PcPatch:
SELECT ST_AsText(ST_PatchAvg(pa)) FROM patches WHERE id = 7;
-- {"pcid":1,"pt":[-126.46,45.54,54.5,5]}
Remova as extensões
DROP EXTENSION ganos_pointcloud_geometry;
DROP EXTENSION ganos_pointcloud CASCADE;
Próximos passos
Referência SQL de nuvem de pontos — lista completa de funções e operadores para PcPoint e PcPatch
Referência espacial — detalhes sobre o sistema de referência espacial