CREATE DICTIONARY ... LAYOUT Polygon

CREATE DICTIONARY ... LAYOUT Polygon

polygon(POLYGON) 딕셔너리는 point-in-polygon 쿼리, 본질적으로 "역방향 지오코딩" 조회에 최적화되어 있어요. 좌표(위도/경도)가 주어지면, 그 점을 포함하는 폴리곤/지역(국가 또는 지역 경계 같은 많은 폴리곤 집합 중에서)을 효율적으로 찾아냅니다. 위치 좌표를 포함하는 지역에 매핑하는 데 잘 어울려요.

출처: 문서

본문

polygon(POLYGON) 딕셔너리는 point-in-polygon 쿼리, 본질적으로 "역방향 지오코딩" 조회에 최적화되어 있어요. 좌표(위도/경도)가 주어지면, 그 점을 포함하는 폴리곤/지역(많은 폴리곤 집합(예: 국가 또는 지역 경계) 중에서)을 효율적으로 찾아냅니다. 위치 좌표를 포함하는 지역에 매핑하는 데 잘 어울려요.

폴리곤 딕셔너리 구성 예시:

ClickHouse Cloud에서 딕셔너리를 사용한다면 DDL 쿼리 방식으로 딕셔너리를 만들고, default 사용자로 딕셔너리를 생성하세요. 또한 지원되는 딕셔너리 소스 목록은 Cloud Compatibility guide에서 확인하세요.

  • DDL
  • Configuration file
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))
...
<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>

폴리곤 딕셔너리를 구성할 때 키는 두 가지 타입 중 하나여야 해요.

  • 단순 폴리곤(simple polygon). 점의 배열이에요.
  • MultiPolygon. 폴리곤의 배열이에요. 각 폴리곤은 점의 2차원 배열입니다. 이 배열의 첫 요소는 폴리곤의 외부 경계이고, 이후 요소는 그에서 제외할 영역을 지정해요.

점은 좌표의 배열 또는 튜플로 지정할 수 있어요. 현재 구현에서는 2차원 점만 지원됩니다.

사용자는 ClickHouse가 지원하는 모든 형식으로 자신의 데이터를 업로드할 수 있어요.

3가지 종류의 인메모리 저장이 있습니다.

Layout Description
POLYGON_SIMPLE 순진한 구현이에요. 각 쿼리에 대해 모든 폴리곤을 선형으로 통과하며, 추가 인덱스 없이 소속 여부를 확인해요.
POLYGON_INDEX_EACH 각 폴리곤에 대해 별도의 인덱스를 구축하여 대부분의 경우 빠른 소속 확인을 가능하게 해요(지리적 지역에 최적화). 영역에 그리드를 겹쳐 놓고, 셀을 16개의 동일한 부분으로 재귀적으로 나눠요. 재귀 깊이가 MAX_DEPTH에 도달하거나 셀이 MIN_INTERSECTIONS보다 많지 않은 폴리곤을 교차하면 나누기가 멈춰요.
POLYGON_INDEX_CELL 위에서 설명한 그리드를 같은 옵션으로 만듭니다. 각 리프 셀에 대해 그 안에 들어오는 모든 폴리곤 조각에 인덱스를 구축하여 빠른 쿼리 응답이 가능해요.
POLYGON POLYGON_INDEX_CELL의 동의어예요.

딕셔너리 쿼리는 딕셔너리 작업용 표준 functions으로 수행돼요. 중요한 차이점은 여기서 키가 그 점을 포함하는 폴리곤을 찾고 싶은 점이 된다는 거예요.

Example

위에서 정의한 딕셔너리 작업 예시:

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' 테이블의 각 점에 대해 그 점을 포함하는 최소 면적의 폴리곤이 발견되고, 요청된 속성이 출력됩니다.

Example

딕셔너리 구성 또는 해당 DDL 쿼리에서 store_polygon_key_column = 1을 켜면 SELECT 쿼리로 폴리곤 딕셔너리의 컬럼을 읽을 수 있어요.

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;
┌─key─────────────────────────────┬─name──┐
│ [[[(3,1),(0,1),(0,-1),(3,-1)]]] │ Value │
└─────────────────────────────────┴───────┘

더 알아보기 (Learn more)