名称

ST_QuantizeCoordinates — 将坐标的最低有效位设置为零

概要

geometry ST_QuantizeCoordinates ( geometry g , int prec_x , int prec_y , int prec_z , int prec_m );

描述

ST_QuantizeCoordinates 确定表示具有指定小数位数的坐标值所需的位数 (N),然后将除 N 个最高有效位之外的所有位设置为零。生成的坐标值仍将四舍五入到原始值,但可压缩性会得到提高。只要几何列使用 可压缩存储类型,这将导致磁盘使用量显着减少。该函数允许在每个维度中指定不同的小数位数;未指定的维度假定具有 x 维度的精度。负数位数被解释为指小数点左侧的位数(即,prec_x=-2 将保留最接近 100 的坐标值)。

ST_QuantizeCoordinates 生成的坐标独立于包含这些坐标的几何体以及这些坐标在几何体内的相对位置。因此,几何体之间现有的拓扑关系不受此函数使用影响。当使用低于几何体固有精度的位数调用该函数时,该函数可能会生成无效的几何体。

可用性:2.5.0

技术背景

PostGIS 将所有坐标值存储为双精度浮点整数,可以可靠地表示 15 个有效数字。但是,PostGIS 可用于管理本质上具有少于 15 个有效数字的数据。一个例子是 TIGER 数据,它以具有六位小数精度的地理坐标形式提供(因此只需要九位有效数字的经度和八位有效数字的纬度)。

当有 15 位有效数字时,可以用多种方式表示 9 位有效数字的数字。双精度浮点数使用 52 个显式位来表示坐标的有效数字(尾数)。表示 9 位有效数字的尾数只需要 30 位,剩下 22 位无效位;我们可以将这些位的数值设置为任何值,最终得到的数字仍然会四舍五入到我们的输入值。例如,值 100.123456 可以由最接近 100.123456000000、100.123456000001 和 100.123456432199 的浮点数表示。所有这些表示都是等效的,因为 ST_AsText(geom, 6) 使用任何这些输入都会返回相同的结果。由于我们可以将这些位设置为任何值,ST_QuantizeCoordinates 将 22 个无效位设置为零。对于较长的坐标序列,这会创建一个连续零块的模式,该模式可以被 PostgreSQL 更有效地压缩。

[Note]

只有几何的磁盘大小可能会受到 ST_QuantizeCoordinates 的影响。 ST_MemSize 报告几何的内存使用情况,无论几何使用多少磁盘空间,它都会返回相同的值。

示例

SELECT ST_AsText(ST_QuantizeCoordinates('POINT (100.123456 0)'::geometry, 4));
st_astext
-------------------------
POINT(100.123455047607 0)
			
WITH test AS (SELECT 'POINT (123.456789123456 123.456789123456)'::geometry AS geom)
SELECT
  digits,
  encode(ST_QuantizeCoordinates(geom, digits), 'hex'),
  ST_AsText(ST_QuantizeCoordinates(geom, digits))
FROM test, generate_series(15, -15, -1) AS digits;

digits  |                   encode                   |                st_astext
--------+--------------------------------------------+------------------------------------------
15      | 01010000005f9a72083cdd5e405f9a72083cdd5e40 | POINT(123.456789123456 123.456789123456)
14      | 01010000005f9a72083cdd5e405f9a72083cdd5e40 | POINT(123.456789123456 123.456789123456)
13      | 01010000005f9a72083cdd5e405f9a72083cdd5e40 | POINT(123.456789123456 123.456789123456)
12      | 01010000005c9a72083cdd5e405c9a72083cdd5e40 | POINT(123.456789123456 123.456789123456)
11      | 0101000000409a72083cdd5e40409a72083cdd5e40 | POINT(123.456789123456 123.456789123456)
10      | 0101000000009a72083cdd5e40009a72083cdd5e40 | POINT(123.456789123455 123.456789123455)
9       | 0101000000009072083cdd5e40009072083cdd5e40 | POINT(123.456789123418 123.456789123418)
8       | 0101000000008072083cdd5e40008072083cdd5e40 | POINT(123.45678912336 123.45678912336)
7       | 0101000000000070083cdd5e40000070083cdd5e40 | POINT(123.456789121032 123.456789121032)
6       | 0101000000000040083cdd5e40000040083cdd5e40 | POINT(123.456789076328 123.456789076328)
5       | 0101000000000000083cdd5e40000000083cdd5e40 | POINT(123.456789016724 123.456789016724)
4       | 0101000000000000003cdd5e40000000003cdd5e40 | POINT(123.456787109375 123.456787109375)
3       | 0101000000000000003cdd5e40000000003cdd5e40 | POINT(123.456787109375 123.456787109375)
2       | 01010000000000000038dd5e400000000038dd5e40 | POINT(123.45654296875 123.45654296875)
1       | 01010000000000000000dd5e400000000000dd5e40 | POINT(123.453125 123.453125)
0       | 01010000000000000000dc5e400000000000dc5e40 | POINT(123.4375 123.4375)
-1      | 01010000000000000000c05e400000000000c05e40 | POINT(123 123)
-2      | 01010000000000000000005e400000000000005e40 | POINT(120 120)
-3      | 010100000000000000000058400000000000005840 | POINT(96 96)
-4      | 010100000000000000000058400000000000005840 | POINT(96 96)
-5      | 010100000000000000000058400000000000005840 | POINT(96 96)
-6      | 010100000000000000000058400000000000005840 | POINT(96 96)
-7      | 010100000000000000000058400000000000005840 | POINT(96 96)
-8      | 010100000000000000000058400000000000005840 | POINT(96 96)
-9      | 010100000000000000000058400000000000005840 | POINT(96 96)
-10     | 010100000000000000000058400000000000005840 | POINT(96 96)
-11     | 010100000000000000000058400000000000005840 | POINT(96 96)
-12     | 010100000000000000000058400000000000005840 | POINT(96 96)
-13     | 010100000000000000000058400000000000005840 | POINT(96 96)
-14     | 010100000000000000000058400000000000005840 | POINT(96 96)
-15     | 010100000000000000000058400000000000005840 | POINT(96 96)

另请参阅

ST_SnapToGrid