名称

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 个显式位来表示坐标的有效数(尾数)。 只需要 30 位来表示具有 9 位有效数字的尾数,剩下 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