الاسم
ST_QuantizeCoordinates — تعيّن البتات الأقل أهمية في الإحداثيات إلى صفر
المختصر
geometry ST_QuantizeCoordinates ( geometry g , int prec_x , int prec_y , int prec_z , int prec_m );
الوصف
تحدد ST_QuantizeCoordinates عدد البتات (N) اللازمة لتمثيل قيمة إحداثي بعدد محدد من الأرقام بعد الفاصلة العشرية، ثم تعيّن جميع البتات إلى صفر ما عدا البتات الـ N الأكثر أهمية. ستظل قيمة الإحداثي الناتجة تُقرَّب إلى القيمة الأصلية، لكنها ستكون أكثر قابلية للضغط. ويمكن أن يؤدي ذلك إلى خفض كبير في استخدام القرص بشرط أن يستخدم عمود geometry نوع تخزين قابلًا للضغط. تتيح الدالة تحديد عدد مختلف من الأرقام بعد الفاصلة العشرية لكل بعد؛ ويُفترض أن الأبعاد غير المحددة لها دقة البعد x. تُفسَّر الأرقام السالبة على أنها تشير إلى الأرقام على يسار الفاصلة العشرية، (أي أن prec_x=-2 ستحفظ قيم الإحداثيات إلى أقرب 100.
الإحداثيات التي تُنتجها ST_QuantizeCoordinates مستقلة عن الشكل الهندسي الذي يحتويها وعن موقعها النسبي داخله. ونتيجة لذلك، لا تتأثر العلاقات الطوبولوجية القائمة بين الأشكال الهندسية باستخدام هذه الدالة. وقد تُنتج الدالة شكلًا غير صالح عند استدعائها بعدد أرقام أقل من الدقة الجوهرية للشكل الهندسي.
متاحة منذ: 2.5.0
خلفية تقنية
يخزّن PostGIS جميع قيم الإحداثيات أعدادًا عشرية بفاصلة عائمة مزدوجة الدقة، يمكنها تمثيل 15 رقمًا معنويًا بموثوقية. لكن قد يُستخدم PostGIS لإدارة بيانات لها جوهريًا أقل من 15 رقمًا معنويًا. ومن الأمثلة بيانات TIGER، التي تُقدَّم إحداثيات جغرافية بدقة ستة أرقام بعد الفاصلة العشرية (فلا تتطلب إلا تسعة أرقام معنوية لخط الطول وثمانية أرقام معنوية لخط العرض).
عندما تتوفر 15 رقمًا معنويًا، توجد تمثيلات ممكنة كثيرة لعدد ذي 9 أرقام معنوية. يستخدم العدد العشري ذو الفاصلة العائمة مزدوج الدقة 52 بتًا صريحًا لتمثيل الجزء المعنوي (mantissa) من الإحداثي. ولا يلزم إلا 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)