ST_QuantizeCoordinates — Setzt die niedrigwertigsten Bits der Koordinaten auf Null
geometry ST_QuantizeCoordinates (
geometry g , int prec_x , int prec_y , int prec_z , int prec_m )
;
ST_QuantizeCoordinates
ermittelt die Anzahl der Bits (N
), die erforderlich sind, um einen Koordinatenwert mit einer bestimmten Anzahl von Nachkommastellen darzustellen, und setzt dann alle Bits bis auf die N
höchstwertigen auf Null. Der resultierende Koordinatenwert wird immer noch auf den ursprünglichen Wert gerundet, hat aber eine verbesserte Kompressibilität. Dies kann zu einer erheblichen Verringerung der Festplattennutzung führen, vorausgesetzt, die Geometriespalte verwendet einen komprimierbaren Speichertyp. Die Funktion erlaubt die Angabe einer unterschiedlichen Anzahl von Nachkommastellen in jeder Dimension; bei nicht spezifizierten Dimensionen wird die Genauigkeit der x
Dimension angenommen. Negative Ziffern werden so interpretiert, dass sie sich auf Ziffern links vom Dezimalpunkt beziehen (d.h. prec_x=-2
erhält Koordinatenwerte auf die nächsten 100.
Die von ST_QuantizeCoordinates
erzeugten Koordinaten sind unabhängig von der Geometrie, die diese Koordinaten und die relative Position dieser Koordinaten in der Geometrie enthält. Daher sind vorhandene topologische Beziehungen zwischen Geometrien durch die Verwendung dieser Funktion nicht betroffen. Die Funktion erzeugt möglicherweise ungültige Geometrie, wenn sie mit einer Anzahl von Stellen aufgerufen wird, die Koordinaten innerhalb der Geometrie zusammenfallen lassen.
Verfügbarkeit: 2.5.0
PostGIS speichert alle Koordinatenwerte als Gleitkommazahlen mit doppelter Genauigkeit, die 15 signifikante Stellen zuverlässig darstellen können. PostGIS kann jedoch verwendet werden, um Daten zu verwalten, die weniger als 15 signifikante Ziffern enthalten. Ein Beispiel sind TIGER-Daten, die als geografische Koordinaten mit sechs Nachkommastellen zur Verfügung gestellt werden (so dass nur neun signifikante Ziffern des Längengrads und acht signifikante Breitengrade erforderlich sind).
Wenn 15 signifikante Ziffern verfügbar sind, gibt es viele mögliche Darstellungen einer Zahl mit 9 signifikanten Ziffern. Eine Gleitkommazahl mit doppelter Genauigkeit verwendet 52 explizite Bits, um den Mantisse der Koordinate darzustellen. Nur 30 Bits werden benötigt, um eine Mantisse mit 9 signifikanten Ziffern darzustellen, wobei 22 unbedeutende Bits übrig bleiben; Wir können ihren Wert auf alles setzen, was wir wollen, und erhalten trotzdem eine zum Eingabewert passende Zahl. Beispielsweise kann der Wert 100.123456 durch die nächstliegenden Zahlen 100.123456000000, 100.123456000001 und 100.123456432199 dargestellt werden. Alle sind gleichermaßen gültig, da ST_AsText (geom, 6)
bei allen dieser Eingaben das gleiche Ergebnis liefert. Da wir diese Bits auf einen beliebigen Wert setzen können, setzt ST_QuantizeCoordinates
die 22 nicht signifikanten Bits auf Null. Für eine lange Koordinatensequenz wird dadurch ein Muster aus Blöcken von aufeinanderfolgenden Nullen erzeugt, das von PostgreSQL effizienter komprimiert wird.
Von |
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)