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]}