> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-fbfa8bee.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# قواميس Polygon

> تهيئة قواميس Polygon لعمليات البحث point-in-polygon.

قاموس `polygon` (`POLYGON`) مُحسَّن لاستعلامات تحديد ما إذا كانت النقطة تقع داخل المضلع، أي لعمليات البحث الخاصة بـ "الترميز الجغرافي العكسي".
فعند إدخال إحداثيات (خط العرض/خط الطول)، يعثر بكفاءة على المضلع/المنطقة التي تحتوي تلك النقطة (من بين مجموعة كبيرة من المضلعات، مثل حدود الدول أو المناطق).
وهو مناسب جدًا لربط إحداثيات المواقع بالمنطقة التي تقع ضمنها.

<Frame>
  <iframe src="https://www.youtube.com/embed/FyRsriQp46E?si=Kf8CXoPKEpGQlC-Y" title="قواميس Polygon في ClickHouse" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen />
</Frame>

مثال على تهيئة قاموس polygon:

<Tip>
  إذا كنت تستخدم قاموسًا مع ClickHouse Cloud، فيُرجى استخدام خيار DDL query لإنشاء قواميسك، وإنشاء قاموسك كمستخدم `default`.
  تحقّق أيضًا من قائمة مصادر القواميس المدعومة في [دليل التوافق مع Cloud](/ar/products/cloud/guides/cloud-compatibility).
</Tip>

<Tabs>
  <Tab title="DDL">
    ```sql theme={null}
    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))
    ...
    ```
  </Tab>

  <Tab title="ملف التهيئة">
    ```xml theme={null}
    <dictionary>
        <structure>
            <key>
                <attribute>
                    <name>key</name>
                    <type>Array(Array(Array(Array(Float64))))</type>
                </attribute>
            </key>

            <attribute>
                <name>name</name>
                <type>String</type>
                <null_value></null_value>
            </attribute>

            <attribute>
                <name>value</name>
                <type>UInt64</type>
                <null_value>0</null_value>
            </attribute>
        </structure>

        <layout>
            <polygon>
                <store_polygon_key_column>1</store_polygon_key_column>
            </polygon>
        </layout>

        ...
    </dictionary>
    ```
  </Tab>
</Tabs>

<br />

عند تهيئة قاموس polygon، يجب أن يكون المفتاح من أحد النوعين التاليين:

* مضلع بسيط، وهو مصفوفة من النقاط.
* MultiPolygon، وهي مصفوفة من المضلعات. وكل مضلع فيها هو مصفوفة ثنائية الأبعاد من النقاط. ويكون العنصر الأول في هذه المصفوفة هو الحد الخارجي للمضلع، بينما تحدد العناصر التالية المناطق التي يجب استثناؤها منه.

يمكن تحديد النقاط على شكل مصفوفة أو tuple من إحداثياتها. وفي التنفيذ الحالي، لا يُدعَم إلا النقاط ثنائية الأبعاد.

يمكن للمستخدم تحميل بياناته الخاصة بأي من التنسيقات التي يدعمها ClickHouse.

تتوفر 3 أنواع من [التخزين داخل الذاكرة](/ar/reference/statements/create/dictionary/layouts/overview#storing-dictionaries-in-memory):

| Layout               | الوصف                                                                                                                                                                                                                                                                                                                |
| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `POLYGON_SIMPLE`     | تنفيذ مباشر. يُجرى مرور خطي عبر جميع المضلعات لكل استعلام، مع التحقق من الانتماء من دون أي فهارس إضافية.                                                                                                                                                                                                             |
| `POLYGON_INDEX_EACH` | يُنشأ فهرس منفصل لكل مضلع، مما يتيح التحقق السريع من الانتماء في معظم الحالات (وهو مُحسَّن للمناطق الجغرافية). وتُفرَض شبكة على المنطقة، مع تقسيم الخلايا تكراريًا إلى 16 جزءًا متساويًا. ويتوقف التقسيم عندما يصل عمق التكرار إلى `MAX_DEPTH` أو عندما لا تتقاطع الخلية مع أكثر من `MIN_INTERSECTIONS` من المضلعات. |
| `POLYGON_INDEX_CELL` | ينشئ أيضًا الشبكة الموصوفة أعلاه باستخدام الخيارات نفسها. ولكل خلية نهائية، يُنشأ فهرس على جميع أجزاء المضلعات التي تقع فيها، مما يتيح استجابات سريعة للاستعلامات.                                                                                                                                                   |
| `POLYGON`            | مرادف لـ `POLYGON_INDEX_CELL`.                                                                                                                                                                                                                                                                                       |

تُجرى استعلامات القاموس باستخدام [الدوال](/ar/reference/functions/regular-functions/ext-dict-functions) القياسية للعمل مع القواميس.
والفرق المهم هنا هو أن المفاتيح ستكون هي النقاط التي تريد العثور على المضلع الذي يحتويها.

**مثال**

مثال على العمل مع القاموس المُعرَّف أعلاه:

```sql theme={null}
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 المقابل.

```sql title="Query" theme={null}
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;
```

```text title="Response" theme={null}
┌─key─────────────────────────────┬─name──┐
│ [[[(3,1),(0,1),(0,-1),(3,-1)]]] │ Value │
└─────────────────────────────────┴───────┘
```
