mirror of
https://github.com/pgpointcloud/pointcloud.git
synced 2025-12-08 20:36:04 +00:00
99 lines
3.3 KiB
ReStructuredText
99 lines
3.3 KiB
ReStructuredText
******************************************************************************
|
||
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:
|
||
|
||
.. code-block:: sql
|
||
|
||
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:
|
||
|
||
.. code-block:: sql
|
||
|
||
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``:
|
||
|
||
.. code-block:: sql
|
||
|
||
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:
|
||
|
||
.. code-block:: sql
|
||
|
||
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:
|
||
|
||
.. code-block:: sql
|
||
|
||
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]}
|