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 数据,它以地理坐标的形式提供,小数点后精度为 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)