Name

ST_QuantizeCoordinates — Sätter koordinaternas minst signifikanta bitar till noll

Synopsis

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

Beskrivning

ST_QuantizeCoordinates bestämmer antalet bitar(N) som krävs för att representera ett koordinatvärde med ett angivet antal siffror efter decimalpunkten, och sätter sedan alla utom de N mest signifikanta bitarna till noll. Det resulterande koordinatvärdet kommer fortfarande att avrundas till det ursprungliga värdet, men har förbättrad komprimerbarhet. Detta kan resultera i en betydande minskning av diskanvändningen, förutsatt att geometrikolumnen använder en komprimerbar lagringstyp. Funktionen tillåter specifikation av olika antal siffror efter decimaltecknet i varje dimension; ospecificerade dimensioner antas ha samma precision som x-dimensionen. Negativa siffror tolkas som siffror till vänster om decimaltecknet (t.ex. prec_x=-2 bevarar koordinatvärden till närmaste 100-tal).

De koordinater som produceras av ST_QuantizeCoordinates är oberoende av den geometri som innehåller dessa koordinater och av koordinaternas relativa position inom geometrin. Detta innebär att befintliga topologiska relationer mellan geometrier inte påverkas av användningen av denna funktion. Funktionen kan ge upphov till ogiltig geometri när den anropas med ett antal siffror som är lägre än geometrins egen precision.

Tillgänglighet: 2.5.0

Teknisk bakgrund

PostGIS lagrar alla koordinatvärden som flyttalsintegraler med dubbel precision, som på ett tillförlitligt sätt kan representera 15 signifikanta siffror. PostGIS kan dock användas för att hantera data som i sig har färre än 15 signifikanta siffror. Ett exempel är TIGER-data, som tillhandahålls som geografiska koordinater med sex precisionssiffror efter decimaltecknet (vilket innebär att det endast krävs nio signifikanta siffror för longitud och åtta signifikanta siffror för latitud)

När 15 signifikanta siffror är tillgängliga finns det många möjliga representationer av ett tal med 9 signifikanta siffror. Ett flyttal med dubbel precision använder 52 explicita bitar för att representera koordinatens signifikand (mantissa). Endast 30 bitar behövs för att representera en mantissa med 9 signifikanta siffror, vilket ger 22 obetydliga bitar; vi kan ställa in deras värde till vad vi vill och ändå sluta med ett tal som avrundas till vårt inmatningsvärde. Till exempel kan värdet 100,123456 representeras av de flyttal som ligger närmast 100,123456000000, 100,123456000001 och 100,123456432199. Alla är lika giltiga, eftersom ST_AsText(geom, 6) kommer att returnera samma resultat med någon av dessa indata. Eftersom vi kan sätta dessa bitar till vilket värde som helst, sätter ST_QuantizeCoordinates de 22 obetydliga bitarna till noll. För en lång koordinatsekvens skapar detta ett mönster av block med på varandra följande nollor som komprimeras av PostgreSQL mer effektivt.

[Note]

Endast geometrins storlek på disken påverkas potentiellt av ST_QuantizeCoordinates. ST_MemSize, som rapporterar geometrins användning i minnet, kommer att returnera samma värde oavsett hur mycket diskutrymme som används av en geometri.

Exempel

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)

Se även

ST_SnapToGrid