Schema and compression
This tutorial is an introduction for investigating XML schemas and playing with compression of patches.
Compression type
The compression of a patch may be retrieved through its XML schema but it’s also stored in the patch itself. Of course, both needs to be consistent so updating an existing schema is hardly discouraged and may lead to errors.
In the first case, the XML schema needs to be parsed with xpath
function to
retrieve the pc:metadata
tag of a specific patch:
WITH tmp AS (
SELECT pc_pcid(pa)
AS _pcid
FROM airport
LIMIT 1
)
SELECT unnest(
xpath(
'/pc:PointCloudSchema/pc:metadata/Metadata/text()',
schema::xml,
array[
['pc', 'http://pointcloud.org/schemas/PC/'],
['xsi', 'http://www.w3.org/2001/XMLSchema-instance']
]
)
)
FROM tmp,pointcloud_formats
WHERE pcid=tmp._pcid;
--> dimensional
A much easier way to retrieve the compression type is to take a look to the JSON summary of the patch:
SELECT pc_summary(pa)::json->'compr' FROM airport LIMIT 1;
--> dimensional
Create a new schema
A schema is just a XML document and may be manually inserted into the
pointcloud_formats
table directly from a file. We can also duplicate an
existing schema and tweak some parameters.
For example, we can create a new schema without compression and based on the
schema pcid=1
:
INSERT INTO pointcloud_formats (pcid, srid, schema)
SELECT 2, srid, regexp_replace(schema, 'dimensional', 'none', 'g')
FROM pointcloud_formats
WHERE pcid=1;
Transform a patch
Thanks to the pc_transform
function, we can transform the underlying data
of a patch to match a specific schema. So if we want to remove the dimensional
compression from an existing patch, we can use the schema with pcid=2
previously created.
In this particular case, the transformed patch doesn’t have compression anymore:
SELECT pc_summary(pc_transform(pa, 2))::json->'compr' FROM airport LIMIT 1;
--> none
So a new table of uncompressed patches may be easily created:
CREATE TABLE airport_uncompressed AS SELECT pc_transform(pa, 2) AS pa FROM airport;
SELECT pc_summary(pa)::json->'compr' FROM airport_uncompressed LIMIT 1;
--> none
SELECT pc_astext(pc_patchavg(pa)) FROM airport LIMIT 1;
--> {"pcid":1,"pt":[65535,0,0,0,0,0,0,0,0,30744,25999,17189,728265,4.67644e+06,299.08]}
SELECT pc_astext(pc_patchavg(pa)) FROM airport_uncompressed LIMIT 1;
--> {"pcid":2,"pt":[65535,0,0,0,0,0,0,0,0,30744,25999,17189,728265,4.67644e+06,299.08]}