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 data,它作为地理坐标提供,小数点后有6位精度(因此只需要9位有效经度和8位有效纬度)。
当有15个有效数字可用时,有9个有效数字的数字有许多可能的表示法。双精度浮点数使用52个显式位来表示坐标的有效数(尾数)。只需要30位来表示具有9个有效位的尾数,剩下22个不重要的位;我们可以将它们的值设置为任何我们喜欢的值,最终仍然得到一个四舍五入为输入值的数字。例如,值100.123456可以由最接近100.123456000000、100.123456000001和100.123456432199的浮点数表示。所有这些都是同样有效的,因为
ST_AsText(geom, 6)
对于这些输入中的任何一个都将返回相同的结果。因为我们可以将这些位设置为任何值,
ST_QuantizeCoordinates
将22个无效位设置为零。对于较长的坐标序列,这将创建一种由连续零组成的块的模式,由PostgreSQL更有效地进行压缩。
![]() |
|
只有几何的磁盘大小可能受以下因素影响
|
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)