설명
FeatureCollection 문서로 교환되며, ClickHouse는 이를 id, geometry, properties의 3개 컬럼에 매핑합니다 — 각 Feature마다 한 세트씩입니다. 문서를 읽으면 feature당 1개의 행이 생성되고, 쓰면 행당 1개의 feature가 생성됩니다.
데이터 읽기
FeatureCollection을 읽으면 피처당 1개의 행이 생성되며, 다음과 같은 고정 스키마가 적용됩니다:
각 geometry는 ClickHouse의
Geometry 타입(Variant)에 저장됩니다. 지원되는 GeoJSON geometry 타입은 Point, LineString, MultiLineString, Polygon, MultiPolygon입니다. 나머지 두 GeoJSON geometry 타입인 GeometryCollection과 MultiPoint는 Geometry 타입으로 표현할 수 없으므로, 이를 geometry 컬럼으로 읽으면 기본적으로 예외가 발생합니다. 이 동작은 대신 NULL을 삽입하도록 변경할 수 있습니다. 자세한 내용은 아래의 지원되지 않는 geometry 타입 처리를 참조하십시오. 기본적으로 geometry 컬럼이 NULL이 되는 경우는 피처의 geometry가 명시적인 JSON null일 때뿐입니다. input_format_geojson_unsupported_geometry_handling = 'null'에서는 지원되지 않는 geometry 타입인 경우에도 NULL이 됩니다.
문서 구조는 검증됩니다. 최상위 type은 반드시 FeatureCollection이어야 하며, features의 모든 요소는 type이 Feature여야 합니다. 기본적으로 좌표는 GeoJSON shape 불변 조건을 만족해야 합니다. 즉, LineString(및 각 MultiLineString의 선)은 최소 2개의 Point를 가져야 하고, Polygon ring(및 각 MultiPolygon의 ring)은 닫혀 있어야 하며 최소 4개의 Point를 가져야 합니다(Geometry 검증 참조). 잘못된 형식의 문서는 조용히 적재되지 않고 거부됩니다.
키 순서는 유연합니다. 최상위 type은 features 배열보다 앞이나 뒤에 올 수 있으며, geometry 객체 내부에서도 coordinates는 type보다 앞이나 뒤에 올 수 있습니다.
스키마 추론은 위의 고정 스키마를 반환하므로, 테이블 정의 없이도 DESCRIBE와 SELECT ... FROM format(...)를 사용할 수 있습니다.
다음은 여러 Geometry 타입이 혼합된 GeoJSON 파일 london.geojson입니다:
Query
Response
.geojson은 자동으로 감지되므로 포맷 인수는 생략할 수 있습니다:
Query
variantType를 사용할 수 있습니다:
Query
Response
Query
Response
Geometry 하위 컬럼에 접근하면 해당 행에 그 타입의 값이 있으면 그 값을 반환하고, 그렇지 않으면 타입의 기본값을 반환합니다. Point는 (0,0)을, 배열 기반 타입은 []를 반환하므로 어떤 타입이 설정되어 있는지 확인하려면 variantType(geometry)를 사용하십시오.
GeoJSON 데이터도 테이블에 수집할 수 있습니다:
Query
Query
Response
Query
Response
지원되지 않는 Geometry 타입 처리
GeometryCollection 및 MultiPoint와 같은 일부 유효한 GeoJSON Geometry 타입은 ClickHouse의 Geometry 타입으로 표현할 수 없습니다. 이러한 geometry를 geometry 컬럼에 저장해야 할 때 어떤 방식으로 처리할지는 input_format_geojson_unsupported_geometry_handling 설정으로 제어할 수 있습니다. 가능한 값은 다음과 같습니다:
'throw'— 예외를 발생시킵니다(기본값)'null'—geometry컬럼에NULL값을 삽입하고 파싱을 계속합니다
geometry 컬럼을 읽을 때만 적용됩니다. geometry가 요청된 출력 컬럼이 아닌 경우(예: SELECT id FROM ...)에도 지원되지 않는 geometry의 형식 유효성은 검사되지만, 이 처리 방식이 적용되지는 않습니다. 즉, geometry 값이 구체화되지 않으므로 예외가 발생하지도 않고 NULL이 삽입되지도 않습니다.
제한 사항
id,geometry,properties만 생성되며, 그 외의 문서 구조는 컬럼으로 노출되지 않습니다.- 위치의 세 번째(고도) 좌표와 그 이후 좌표는 삭제되므로, 위치는
[longitude, latitude]만 남습니다. bbox와 외부 멤버(예: 최상위name또는crs, 또는Feature내부의 추가 멤버)는 무시됩니다.- 숫자형
id는 텍스트로 저장되므로 문자열과 숫자의 구분이 사라집니다.id가 없거나null이면NULL이 됩니다. GeometryCollection과MultiPoint는 표현할 수 없습니다. 지원되지 않는 Geometry 타입 처리를 참조하십시오.
데이터 쓰기
FeatureCollection 하나가 생성되며, 각 행은 Feature 하나로 기록됩니다.
결과의 컬럼은 각 Feature에 다음과 같이 매핑됩니다.
geometry 유형의 컬럼은
Geometry Variant이거나 특정 geo 유형일 수 있으며, 각각은 다음 GeoJSON geometry 유형에 매핑됩니다.
Ring은 GeoJSON geometry 유형이 아닙니다. linear ring은 Polygon의 구성 요소이므로 Ring 값은 단일 ring Polygon으로 기록됩니다.
예시
london 테이블에서 계속해서, 일반 속성 컬럼을 내보내면 id와 geometry를 제외한 모든 컬럼이 프로퍼티가 됩니다:
Query
Response
properties라는 이름의 객체 유형 컬럼이 하나만 있으면 해당 컬럼이 직접 출력되므로, GeoJSON 파일을 읽은 뒤 그대로 다시 쓰면 문서가 그대로 재현됩니다(이 파일에서 추론되는 컬럼은 id, geometry, properties입니다):
Query
Response
id 컬럼은 JSON 숫자 형식으로 기록되며(NULL인 널 허용 Nullable id는 완전히 생략됩니다):
Query
Response
Ring은 단일 링 Polygon으로 표기됩니다:
Query
Response
파일에 쓰기
INTO OUTFILE을 사용하십시오:
Query
file 테이블 함수를 사용해 파일에 직접 쓸 수 있습니다(.geojson 확장자가 포맷을 자동으로 선택합니다):
Query
제한 사항
ClickHouse의 geo 타입에는 좌표 참조 시스템이 없으므로, 출력에서는 좌표가 이미 RFC 7946에서 요구하는
[longitude, latitude] 순서의 WGS84 경도/위도라고 가정합니다. 재투영이나 축 스왑은 수행하지 않으므로, 투영 좌표나 (latitude, longitude)로 저장된 데이터는 구조적으로는 유효하지만 규격을 준수하지 않는 GeoJSON을 생성합니다.- 읽는 과정에서 손실되는 정보(위치의 고도,
bbox, 외부 멤버,id가 문자열인지 숫자인지에 대한 구분)는 복원할 수 없습니다. 자세한 내용은 읽기 제한 사항을 참조하십시오. - 좌표는
Float64값에서 왕복 가능한 가장 짧은 표현으로 기록됩니다. JSON컬럼에서 직접 가져온properties객체는JSON타입의 정규 키 순서로 출력되므로, 입력과 순서가 다를 수 있습니다.
LineString이나 닫히지 않은 Polygon ring처럼 유효한 GeoJSON 도형이 아닌 지오메트리는, 기록한 문서를 다시 읽을 수 있도록 거부됩니다. 대신 이러한 지오메트리를 있는 그대로 출력하려면 format_geojson_validate_geometry = 0으로 설정하십시오. 그러면 구조적으로는 유효하지만 규격을 준수하지 않는 GeoJSON이 생성됩니다. 오른손 법칙(감김 방향) 불변성은 어느 경우에도 강제되지 않으며, null과 비어 있는 properties 객체의 구분도 유지됩니다.
Geometry 유효성 검사
format_geojson_validate_geometry는 포맷이 RFC 7946의 지오메트리 형태 규칙을 양방향에서 모두 적용할지 제어합니다. 기본적으로 활성화되어 있습니다.
활성화되면 GeoJSON 형태 규칙을 위반하는 지오메트리는 거부됩니다. 예를 들어 점이 2개 미만인 LineString(또는 MultiLineString의 선), 점이 4개 미만이거나 첫 번째 점과 마지막 점이 달라 닫히지 않은 Polygon 또는 MultiPolygon의 ring, 또는 비어 있는 MultiLineString, Polygon, MultiPolygon이 여기에 해당합니다. 동일한 규칙이 이런 문서를 읽을 때와 이런 ClickHouse 값을 쓸 때 모두 적용되므로, 한 번 쓴 문서는 항상 다시 읽을 수 있습니다.
비활성화되면 이러한 형태 규칙은 양방향 모두에서 적용되지 않습니다. 즉, 퇴화된 지오메트리는 있는 그대로 읽고 있는 그대로 기록합니다. 따라서 유효한 GeoJSON 지오메트리가 아닌 ClickHouse 지오메트리 값도 이 포맷을 통해 그대로 왕복할 수 있지만, 그 대가로 유효한 GeoJSON이 아닌 문서가 생성될 수 있습니다.
이 유효성 검사는 구조만 검사합니다. 즉, 점 개수와 ring 폐합 여부만 확인합니다. 도형의 기하학적 정확성은 검사하지 않으므로, 구조적으로는 유효하지만 기하학적으로는 퇴화된 지오메트리도 양방향 모두에서 허용됩니다. 예를 들어 면적이 0인 polygon, 자기 자신과 교차하는 ring, 또는 holes(내부 ring)가 바깥쪽 ring 바깥에 있는 polygon이 여기에 해당합니다. polygon ring의 오른손 법칙(right-hand-rule, winding) 방향도 마찬가지로 적용하지 않습니다.
한 가지 검사는 이 설정과 무관합니다. 유한하지 않은 좌표(NaN, Inf)는 JSON 숫자로 표현할 수 없으므로 항상 거부됩니다.