名稱

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