Описание
FeatureCollection, который ClickHouse сопоставляет с тремя столбцами — id, geometry и properties — по одному набору для каждого Feature. Чтение документа даёт по одной строке на каждую возможность, а запись — по одной возможности на строку.
Чтение данных
FeatureCollection создаёт по одной строке для каждой возможности со следующей фиксированной схемой:
Каждая геометрия хранится в типе
Geometry ClickHouse (то есть Variant). Поддерживаются следующие геометрические типы GeoJSON: Point, LineString, MultiLineString, Polygon и MultiPolygon. Два других геометрических типа GeoJSON, GeometryCollection и MultiPoint, не могут быть представлены типом Geometry; чтение одного из них в столбец geometry по умолчанию вызывает исключение, но это поведение можно изменить так, чтобы вместо этого вставлялся NULL — см. Обработка неподдерживаемых геометрических типов ниже. По умолчанию столбец geometry имеет значение NULL только тогда, когда геометрия возможности является явным JSON null; при input_format_geojson_unsupported_geometry_handling = 'null' он также имеет значение NULL для неподдерживаемого геометрического типа.
Структура документа проверяется: type верхнего уровня должен быть FeatureCollection, а каждый элемент features должен иметь type Feature. По умолчанию координаты должны удовлетворять инвариантам геометрической формы в GeoJSON — LineString (и каждая линия в MultiLineString) должен содержать как минимум две точки, а кольцо Polygon (и каждое кольцо в MultiPolygon) должно быть замкнутым и содержать как минимум четыре точки (см. Проверка геометрии). Некорректные документы отклоняются, а не загружаются молча.
Порядок ключей может быть произвольным: type верхнего уровня может находиться до или после массива features, а внутри объекта геометрии coordinates может располагаться до или после type.
Вывод схемы возвращает приведённую выше фиксированную схему, поэтому DESCRIBE и SELECT ... FROM format(...) работают без определения таблицы.
Рассмотрим следующий GeoJSON‑файл london.geojson, содержащий различные геометрические типы:
Query
Response
.geojson определяется автоматически, поэтому аргумент format можно не указывать:
Query
variantType, чтобы определить базовый тип каждого объекта Geometry:
Query
Response
Query
Response
Geometry возвращается значение, если в строке хранится этот тип; в противном случае возвращается значение по умолчанию для этого типа — (0,0) для Point и [] для типов на основе массивов, — поэтому используйте variantType(geometry), чтобы определить, какой именно тип установлен.
Мы также можем загружать данные GeoJSON в таблицу:
Query
Query
Response
Query
Response
Обработка неподдерживаемых геометрических типов
GeometryCollection и MultiPoint — не могут быть представлены типом Geometry в ClickHouse. Управлять тем, что происходит, когда такую геометрию нужно сохранить в столбце geometry, можно с помощью настройки input_format_geojson_unsupported_geometry_handling. Возможные значения:
'throw'— сгенерировать исключение (по умолчанию)'null'— вставить значениеNULLв столбецgeometryи продолжить синтаксический разбор
geometry. Если geometry не входит в число запрошенных выходных столбцов (например, SELECT id FROM ...), неподдерживаемая геометрия всё равно проверяется на корректность формата, но эта обработка не срабатывает: исключение не генерируется и NULL не вставляется, поскольку значение геометрии не материализуется.
Ограничения
- Формируются только
id,geometryиproperties; остальная структура документа не выводится в виде столбцов. - Третья координата позиции (высота) и все последующие отбрасываются — позиции преобразуются в
[longitude, latitude]. bboxи посторонние элементы (например,nameилиcrsверхнего уровня либо дополнительные элементы внутриFeature) игнорируются.- Числовой
idсохраняется как текст, поэтому различие между строкой и числом теряется; отсутствующий илиnullidстановитсяNULL. GeometryCollectionиMultiPointне могут быть представлены — см. Обработка неподдерживаемых геометрических типов.
Запись данных
FeatureCollection: по одному Feature на каждую строку.
Столбцы результата сопоставляются с каждым Feature следующим образом:
Столбец геометрического типа может иметь тип
Geometry или конкретный геотип; каждому из них соответствует свой тип геометрии GeoJSON:
Ring не является типом геометрии GeoJSON — линейное кольцо является компонентом Polygon — поэтому значение Ring записывается как Polygon с одним кольцом.
Примеры
london, созданной выше, экспорт обычных столбцов атрибутов превращает каждый столбец, кроме id и geometry, в свойство:
Query
Response
object с именем properties записывается напрямую, при чтении GeoJSON‑файла и последующей записи обратно документ воспроизводится в исходном виде (для этого файла автоматически определяются столбцы id, geometry и properties):
Query
Response
id записывается как число в JSON (Nullable id со значением NULL опускается полностью):
Query
Response
Ring записывается как Polygon с одним кольцом:
Query
Response
Запись в файл
INTO OUTFILE, чтобы записать GeoJSON‑файл на стороне клиента:
Query
file (расширение .geojson автоматически определяет формат):
Query
Ограничения
Гео-типы ClickHouse не содержат сведений о системе координат, поэтому в выходных данных предполагается, что координаты уже заданы в WGS84 как долгота/широта в порядке
[longitude, latitude], как того требует RFC 7946. Ни перепроецирование, ни перестановка осей не выполняются, поэтому спроецированные координаты — или данные, сохранённые как (latitude, longitude) — дают структурно корректный, но не соответствующий стандарту GeoJSON.- Информация, отброшенная при чтении, — высота точки,
bbox, сторонние поля и различие между строковым и числовымid— не может быть восстановлена; см. Ограничения чтения. - Координаты записываются из значений
Float64с использованием их кратчайшего представления, допускающего обратимое преобразование. - Объект
properties, взятый напрямую из столбцаJSON, выводится в каноническом порядке ключей типаJSON, который может отличаться от исходного.
LineString с одной точкой или незамкнутое кольцо Polygon, отклоняется, чтобы записанный документ можно было затем прочитать обратно. Если вместо этого задать format_geojson_validate_geometry = 0, такие геометрии будут выводиться как есть, образуя структурно корректный, но не соответствующий стандарту GeoJSON. Инвариант правила правой руки (направление обхода) не проверяется ни в одном из режимов, а различие между null и пустым объектом properties сохраняется.
Проверка геометрии
format_geojson_validate_geometry определяет, проверяет ли формат соблюдение правил формы геометрии из RFC 7946 в обоих направлениях. По умолчанию он включен.
Если параметр включен, геометрия, нарушающая правила формы GeoJSON, отклоняется: LineString (или линия в MultiLineString) с менее чем двумя точками; кольцо Polygon или MultiPolygon с менее чем четырьмя точками либо с несовпадающими первой и последней точками (незамкнутое кольцо); а также пустой MultiLineString, Polygon или MultiPolygon. Те же правила действуют как при чтении такого документа, так и при записи такого значения ClickHouse, поэтому записанный документ всегда можно прочитать обратно.
Если параметр отключен, эти правила формы не проверяются ни в одном направлении: вырожденные геометрии читаются и записываются как есть. Это позволяет значениям геометрии ClickHouse, не являющимся корректными геометриями GeoJSON, проходить через формат без изменений, ценой создания документов, не являющихся корректным GeoJSON.
Проверка носит исключительно структурный характер: проверяются только количество точек и замкнутость колец. Геометрическая корректность формы не анализируется, поэтому структурно корректная, но геометрически вырожденная геометрия принимается в обоих направлениях — например, полигон нулевой площади, самопересекающееся кольцо или полигон, чьи дыры (внутренние кольца) лежат вне его внешнего кольца. Ориентация колец полигона по правилу правой руки (направление обхода) также никогда не проверяется.
Одна проверка не зависит от этого параметра: нечисловые координаты (NaN, Inf) всегда отклоняются, поскольку их нельзя представить в виде чисел JSON.