الانتقال إلى المحتوى الرئيسي
قاموس polygon (POLYGON) مُحسَّن لاستعلامات تحديد ما إذا كانت النقطة تقع داخل المضلع، أي لعمليات البحث الخاصة بـ “الترميز الجغرافي العكسي”. فعند إدخال إحداثيات (خط العرض/خط الطول)، يعثر بكفاءة على المضلع/المنطقة التي تحتوي تلك النقطة (من بين مجموعة كبيرة من المضلعات، مثل حدود الدول أو المناطق). وهو مناسب جدًا لربط إحداثيات المواقع بالمنطقة التي تقع ضمنها.
مثال على تهيئة قاموس polygon:
إذا كنت تستخدم قاموسًا مع ClickHouse Cloud، فيُرجى استخدام خيار DDL query لإنشاء قواميسك، وإنشاء قاموسك كمستخدم default. تحقّق أيضًا من قائمة مصادر القواميس المدعومة في دليل التوافق مع Cloud.
CREATE DICTIONARY polygon_dict_name (
    key Array(Array(Array(Array(Float64)))),
    name String,
    value UInt64
)
PRIMARY KEY key
LAYOUT(POLYGON(STORE_POLYGON_KEY_COLUMN 1))
...

عند تهيئة قاموس polygon، يجب أن يكون المفتاح من أحد النوعين التاليين:
  • مضلع بسيط، وهو مصفوفة من النقاط.
  • MultiPolygon، وهي مصفوفة من المضلعات. وكل مضلع فيها هو مصفوفة ثنائية الأبعاد من النقاط. ويكون العنصر الأول في هذه المصفوفة هو الحد الخارجي للمضلع، بينما تحدد العناصر التالية المناطق التي يجب استثناؤها منه.
يمكن تحديد النقاط على شكل مصفوفة أو tuple من إحداثياتها. وفي التنفيذ الحالي، لا يُدعَم إلا النقاط ثنائية الأبعاد. يمكن للمستخدم تحميل بياناته الخاصة بأي من التنسيقات التي يدعمها ClickHouse. تتوفر 3 أنواع من التخزين داخل الذاكرة:
Layoutالوصف
POLYGON_SIMPLEتنفيذ مباشر. يُجرى مرور خطي عبر جميع المضلعات لكل استعلام، مع التحقق من الانتماء من دون أي فهارس إضافية.
POLYGON_INDEX_EACHيُنشأ فهرس منفصل لكل مضلع، مما يتيح التحقق السريع من الانتماء في معظم الحالات (وهو مُحسَّن للمناطق الجغرافية). وتُفرَض شبكة على المنطقة، مع تقسيم الخلايا تكراريًا إلى 16 جزءًا متساويًا. ويتوقف التقسيم عندما يصل عمق التكرار إلى MAX_DEPTH أو عندما لا تتقاطع الخلية مع أكثر من MIN_INTERSECTIONS من المضلعات.
POLYGON_INDEX_CELLينشئ أيضًا الشبكة الموصوفة أعلاه باستخدام الخيارات نفسها. ولكل خلية نهائية، يُنشأ فهرس على جميع أجزاء المضلعات التي تقع فيها، مما يتيح استجابات سريعة للاستعلامات.
POLYGONمرادف لـ POLYGON_INDEX_CELL.
تُجرى استعلامات القاموس باستخدام الدوال القياسية للعمل مع القواميس. والفرق المهم هنا هو أن المفاتيح ستكون هي النقاط التي تريد العثور على المضلع الذي يحتويها. مثال مثال على العمل مع القاموس المُعرَّف أعلاه:
CREATE TABLE points (
    x Float64,
    y Float64
)
...
SELECT tuple(x, y) AS key, dictGet(dict_name, 'name', key), dictGet(dict_name, 'value', key) FROM points ORDER BY x, y;
نتيجةً لتنفيذ الأمر الأخير لكل نقطة في جدول ‘points’، سيُعثر على مضلع هو الأصغر مساحةً ويحتوي على هذه النقطة، وستُعرَض السمات المطلوبة. مثال يمكنك قراءة الأعمدة من قواميس المضلعات عبر استعلام SELECT؛ ما عليك سوى تفعيل store_polygon_key_column = 1 في إعدادات القاموس أو في استعلام DDL المقابل.
Query
CREATE TABLE polygons_test_table
(
    key Array(Array(Array(Tuple(Float64, Float64)))),
    name String
) ENGINE = MergeTree
ORDER BY tuple();

INSERT INTO polygons_test_table VALUES ([[[(3, 1), (0, 1), (0, -1), (3, -1)]]], 'Value');

CREATE DICTIONARY polygons_test_dictionary
(
    key Array(Array(Array(Tuple(Float64, Float64)))),
    name String
)
PRIMARY KEY key
SOURCE(CLICKHOUSE(TABLE 'polygons_test_table'))
LAYOUT(POLYGON(STORE_POLYGON_KEY_COLUMN 1))
LIFETIME(0);

SELECT * FROM polygons_test_dictionary;
Response
┌─key─────────────────────────────┬─name──┐
│ [[[(3,1),(0,1),(0,-1),(3,-1)]]] │ Value │
└─────────────────────────────────┴───────┘
آخر تعديل في ٢٩ يونيو ٢٠٢٦