Тип поля geoshape
Тип данных geo_shape облегчает индексирование и поиск с произвольными геофигурами, такими как прямоугольники и многоугольники. Он должен использоваться, когда индексируемые данные или выполняемые запросы содержат фигуры, отличные от точек.
Вы можете выполнять запросы к документам с помощью этого типа с помощью запроса geo_shape.
Elasticsearch кодирует значения geo_shape в виде деревьев BKD по умолчанию. Чтобы использовать кодирование BKD, не указывайте следующие параметры отображения:
-
distance_error_pct -
points_only -
precision -
strategy -
tree_levels -
tree
Если вы укажете один или несколько из этих параметров, поле будет использовать кодирование префиксного дерева вместо этого. Кодирование префиксного дерева устарело.
Параметры отображения
Отображение geo_shape отображает объекты геометрии GeoJSON в типе geo_shape. Для его активации пользователи должны явно отобразить поля в тип geo_shape.
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
| [6.6] Устарело в 6.6. PrefixTrees больше не используется Имя реализации PrefixTree, которое будет использоваться: |
|
| [6.6] Устарело в 6.6. PrefixTrees больше не используется Этот параметр может быть использован вместо |
|
| [6.6] Устарело в 6.6. PrefixTrees больше не используется Максимальное количество слоев, которое будет использоваться PrefixTree. Это можно использовать для управления точностью представления фигур и, следовательно, тем, сколько терминов индексируется. По умолчанию соответствует значению по умолчанию выбранной реализации PrefixTree. Поскольку этот параметр требует определенного уровня понимания базовой реализации, пользователи могут использовать параметр | различные |
| [6.6] Устарело в 6.6. PrefixTrees больше не используется Параметр strategy определяет подход к представлению фигур во время индексирования и поиска. Он также влияет на доступные возможности, поэтому рекомендуется позволить Elasticsearch автоматически устанавливать этот параметр. Доступны две стратегии: |
|
| [6.6] Устарело в 6.6. PrefixTrees больше не используется Используется как подсказка для PrefixTree о том, насколько точным он должен быть. По умолчанию 0,025 (2,5%) с 0,5 в качестве максимального поддерживаемого значения. ПРИМЕЧАНИЕ ПО ПРОИЗВОДИТЕЛЬНОСТИ: Это значение будет по умолчанию 0, если явное определение |
|
| Необязательно. По умолчанию ориентация для WKT-многоугольников поля. Этот параметр устанавливает и возвращает только значение Для установки
Для установки
|
|
| [6.6] Устарело в 6.6. PrefixTrees больше не используется Установка этого параметра в значение |
|
| Если значение true, некорректные геофигуры GeoJSON или WKT игнорируются. Если false (по умолчанию), некорректные геофигуры GeoJSON и WKT вызывают исключение и отклоняют весь документ. |
|
| Если |
|
| Если |
|
Подход к индексированию
Типы геофигур индексируются путем разбиения фигуры на треугольную сетку и индексирования каждого треугольника как точки в 7-мерном пространстве в дереве BKD. Это обеспечивает почти идеальную пространственную разрешающую способность (до 1e-7 десятичной степени точности), так как все пространственные отношения вычисляются с использованием закодированного векторного представления исходной фигуры вместо представления растровой сетки, используемого подходом индексирования префиксных деревьев. Производительность растеризатора в первую очередь зависит от количества вершин, определяющих многоугольник/многоугольник. Хотя это и основной метод индексирования, префиксные деревья по-прежнему могут использоваться, установив параметры tree или strategy в соответствии с соответствующими параметрами отображения. Обратите внимание, что эти параметры теперь устарели и будут удалены в будущей версии.
ВАЖНЫЕ ПРИМЕЧАНИЯ
CONTAINS запрос на поиск по отношению — при использовании новой стратегии индексирования векторов по умолчанию, geo_shape запросы с relation, определённым как contains, поддерживаются для индексов, созданных с ElasticSearch 7.5.0 или более поздней версии.
Деревья префиксов
[6.6] Устаревшее в 6.6. Деревья префиксов больше не используются Для эффективного представления фигур в инвертированном индексе, фигуры преобразуются в ряд хешей, представляющих квадратные ячейки сетки (обычно называемые «растром»), используя реализации PrefixTree. Понятие дерева происходит от того, что PrefixTree использует несколько слоёв сетки, каждый из которых имеет возрастающую точность для представления Земли. Это можно представить как увеличение уровня детализации карты или изображения при увеличении масштаба. Поскольку этот подход вызывает проблемы с точностью индексируемых фигур, он был устаревший в пользу подхода индексирования векторов, который индексирует фигуры как треугольную сетку (см. Подход индексирования).
Предоставляются несколько реализаций PrefixTree:
- GeohashPrefixTree — использует геохэши для квадратных ячеек сетки. Геохэши — это закодированные в base32 строки битов широты и долготы, переплетённых. Чем длиннее хеш, тем он точнее. Каждый добавленный символ в геохэш представляет другой уровень дерева и добавляет 5 бит точности в геохэш. Геохэш представляет прямоугольную область и имеет 32 подпрямоугольника. Максимальное количество уровней в Elasticsearch составляет 24; значение по умолчанию — 9.
- QuadPrefixTree — использует квадродерево для квадратных ячеек сетки. Аналогично геохэшу, квадродеревья переплетают биты широты и долготы, в результате хеш представляет собой набор битов. Уровень дерева в квадродереве представляет 2 бита в этом наборе битов, по одному для каждой координаты. Максимальное количество уровней для квадродеревьев в Elasticsearch — 29; значение по умолчанию — 21.
Пространственные стратегии
[6.6] Устаревшее в 6.6. Деревья префиксов больше не используются Выбранная реализация индексирования полагается на SpatialStrategy для выбора способа декомпозиции фигур (либо в виде квадратных ячеек, либо в виде разбитой треугольной сетки). Каждая стратегия отвечает на следующие вопросы:
- Какие типы фигур можно индексировать?
- Какие типы операций запроса и фигур можно использовать?
- Поддерживает ли она более одной фигуры на поле?
Предоставляются следующие реализации стратегии (с соответствующими возможностями):
| Стратегия | Поддерживаемые фигуры | Поддерживаемые запросы | Несколько фигур |
|---|---|---|---|
|
| Да | |
|
| Да |
Точность
Recursive и Term стратегии не обеспечивают 100% точности, и в зависимости от их конфигурации могут возвращать некоторые ложные срабатывания для INTERSECTS, WITHIN и CONTAINS запросов, а также некоторые ложные пропуски для запросов DISJOINT. Для уменьшения этого, важно выбрать соответствующее значение параметра tree_levels и скорректировать ожидания соответственно. Например, точка может находиться рядом с границей определённой ячейки сетки, и поэтому может не совпадать с запросом, который соответствует только соседней ячейке — даже если фигура очень близка к точке.
Пример
PUT /example
{
"mappings": {
"properties": {
"location": {
"type": "geo_shape"
}
}
}
} Это определение отображения сопоставляет поле location с типом geo_shape, используя реализацию вектора по умолчанию. Оно обеспечивает приблизительно 1e-7 точность в десятичных градусах.
Учёт производительности с деревьями префиксов
[6.6] Устаревшее в 6.6. Деревья префиксов больше не используются С деревьями префиксов Elasticsearch использует пути в дереве как термины в инвертированном индексе и в запросах. Чем выше уровень (а, следовательно, и точность), тем больше терминов генерируется. Конечно, вычисление терминов, сохранение их в памяти и сохранение их на диске имеют свою цену. Особенно на высоких уровнях дерева, индексы могут стать чрезвычайно большими даже с небольшим количеством данных. Кроме того, размер функций также имеет значение. Большие, сложные многоугольники могут занимать много места на высоких уровнях дерева. Какой параметр является правильным, зависит от конкретного случая использования. В целом, точность обменивается на размер индекса и производительность запросов.
Значения по умолчанию в Elasticsearch для обеих реализаций представляют собой компромисс между размером индекса и разумным уровнем точности в 50 м на экваторе. Это позволяет индексировать десятки миллионов фигур без чрезмерного увеличения размера результирующего индекса по сравнению с исходным размером.
Запросы geo-shape на гео-фигуры, реализованные с использованием PrefixTrees, не будут выполняться, если search.allow_expensive_queries установлено в false.
Структура входных данных
Фигуры могут быть представлены в формате GeoJSON или Well-Known Text (WKT). В следующей таблице показано отображение GeoJSON и WKT в типы Elasticsearch:
| Тип GeoJSON | Тип WKT | Тип Elasticsearch | Описание |
|---|---|---|---|
|
|
| Одна географическая координата. Примечание: Elasticsearch использует только координаты WGS-84. |
|
|
| Произвольная линия, заданная двумя или более точками. |
|
|
| Закрытый многоугольник, первая и последняя точки которого должны совпадать, что требует |
|
|
| Массив несвязанных, но, вероятно, связанных точек. |
|
|
| Массив отдельных линий. |
|
|
| Массив отдельных многоугольников. |
|
|
| Фигура GeoJSON, аналогичная |
|
|
| Прямоугольник ограничительной рамки, или огибающая, определённая только верхними левыми и нижними правыми точками. |
|
|
| Круг, определённый центральной точкой и радиусом с единицами, которые по умолчанию равны |
Для всех типов оба внутренние поля type и coordinates являются обязательными.
В GeoJSON и WKT, и, следовательно, в Elasticsearch, правильный порядок координат — долгота, широта (X, Y) в массивах координат. Это отличается от многих геопространственных API (например, Google Maps), которые обычно используют разговорный порядок широта, долгота (Y, X).
Точка — это одна географическая координата, например, местоположение здания или текущее положение, предоставленное API геолокации смартфона. Ниже приведён пример точки в GeoJSON.
POST /example/_doc
{
"location" : {
"type" : "Point",
"coordinates" : [-77.03653, 38.897676]
}
} Ниже приведён пример точки в WKT:
POST /example/_doc
{
"location" : "POINT (-77.03653 38.897676)"
} Линейный отрезок определяется массивом из двух или более позиций. Указав только две точки, линейный отрезок будет представлять прямую линию. Указание более двух точек создает произвольную траекторию. Ниже приведен пример линейного отрезка в GeoJSON.
POST /example/_doc
{
"location" : {
"type" : "LineString",
"coordinates" : [[-77.03653, 38.897676], [-77.009051, 38.889939]]
}
} Ниже приведен пример линейного отрезка в WKT:
POST /example/_doc
{
"location" : "LINESTRING (-77.03653 38.897676, -77.009051 38.889939)"
} Вышеприведенный линейный отрезок начертит прямую линию, начинающуюся у Белого дома и заканчивающуюся у Капитолия США.
Многоугольник определяется списком списков точек. Первая и последняя точки в каждом (внешнем) списке должны быть одинаковыми (многоугольник должен быть замкнутым). Ниже приведен пример многоугольника в GeoJSON.
POST /example/_doc
{
"location" : {
"type" : "Polygon",
"coordinates" : [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
]
}
} Ниже приведен пример многоугольника в WKT:
POST /example/_doc
{
"location" : "POLYGON ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0))"
} Первый массив представляет внешнюю границу многоугольника, другие массивы представляют внутренние фигуры («дыры»). Ниже приведен пример GeoJSON-многоугольника с дырой:
POST /example/_doc
{
"location" : {
"type" : "Polygon",
"coordinates" : [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ],
[ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]
]
}
} Ниже приведен пример многоугольника с дырой в WKT:
POST /example/_doc
{
"location" : "POLYGON ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8, 100.2 0.2))"
} Ориентация многоугольника
Ориентация многоугольника указывает порядок его вершин: RIGHT (против часовой стрелки) или LEFT (по часовой стрелке). Elasticsearch использует ориентацию многоугольника для определения пересечения международной линии перемены дат (+/-180° долготы).
Вы можете установить значение по умолчанию для ориентации WKT-многоугольников, используя параметр сопоставления orientation. Это связано с тем, что спецификация WKT не определяет или не накладывает ограничение на значение по умолчанию для ориентации.
GeoJSON-многоугольники используют ориентацию по умолчанию RIGHT, независимо от значения параметра сопоставления orientation. Это связано с тем, что спецификация GeoJSON предписывает использование ориентации против часовой стрелки для внешнего многоугольника и по часовой стрелке для внутренних фигур.
Вы можете переопределить ориентацию по умолчанию для GeoJSON-многоугольников, используя параметр orientation на уровне документа. Например, следующий запрос индексирования указывает значение orientation на уровне документа как LEFT.
POST /example/_doc
{
"location" : {
"type" : "Polygon",
"orientation" : "LEFT",
"coordinates" : [
[ [-177.0, 10.0], [176.0, 15.0], [172.0, 0.0], [176.0, -15.0], [-177.0, -10.0], [-177.0, 10.0] ]
]
}
} Elasticsearch использует ориентацию многоугольника только для определения пересечения международной линии перемены дат. Если разница между минимальной и максимальной долготой многоугольника меньше 180°, многоугольник не пересекает эту линию, и ориентация не имеет эффекта.
Если разница между минимальной и максимальной долготой многоугольника составляет 180° или более, Elasticsearch проверяет, отличается ли значение orientation многоугольника от значения по умолчанию. Если ориентация отличается, Elasticsearch считает, что многоугольник пересекает международную линию перемены дат, и разбивает многоугольник на этой линии.
Ниже приведен пример списка GeoJSON-точек:
POST /example/_doc
{
"location" : {
"type" : "MultiPoint",
"coordinates" : [
[102.0, 2.0], [103.0, 2.0]
]
}
} Ниже приведен пример списка WKT-точек:
POST /example/_doc
{
"location" : "MULTIPOINT (102.0 2.0, 103.0 2.0)"
} Ниже приведен пример списка GeoJSON-линейных отрезков:
POST /example/_doc
{
"location" : {
"type" : "MultiLineString",
"coordinates" : [
[ [102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0] ],
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0] ],
[ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8] ]
]
}
} Ниже приведен пример списка WKT-линейных отрезков:
POST /example/_doc
{
"location" : "MULTILINESTRING ((102.0 2.0, 103.0 2.0, 103.0 3.0, 102.0 3.0), (100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8))"
} Ниже приведен пример списка GeoJSON-многоугольников (второй многоугольник содержит дыру):
POST /example/_doc
{
"location" : {
"type" : "MultiPolygon",
"coordinates" : [
[ [[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]] ],
[ [[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
[[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]] ]
]
}
} Ниже приведен пример списка WKT-многоугольников (второй многоугольник содержит дыру):
POST /example/_doc
{
"location" : "MULTIPOLYGON (((102.0 2.0, 103.0 2.0, 103.0 3.0, 102.0 3.0, 102.0 2.0)), ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8, 100.2 0.2)))"
} Ниже приведен пример коллекции GeoJSON-геометрических объектов:
POST /example/_doc
{
"location" : {
"type": "GeometryCollection",
"geometries": [
{
"type": "Point",
"coordinates": [100.0, 0.0]
},
{
"type": "LineString",
"coordinates": [ [101.0, 0.0], [102.0, 1.0] ]
}
]
}
} Ниже приведен пример коллекции WKT-геометрических объектов:
POST /example/_doc
{
"location" : "GEOMETRYCOLLECTION (POINT (100.0 0.0), LINESTRING (101.0 0.0, 102.0 1.0))"
} Прямоугольник
Elasticsearch поддерживает тип envelope, который состоит из координат верхней левой и нижней правой точек фигуры, представляющих прямоугольник в формате [[minLon, maxLat], [maxLon, minLat]]:
POST /example/_doc
{
"location" : {
"type" : "envelope",
"coordinates" : [ [100.0, 1.0], [101.0, 0.0] ]
}
} Ниже приведен пример прямоугольника, использующего формат WKT BBOX:
ПРИМЕЧАНИЕ: Спецификация WKT ожидает следующего порядка: minLon, maxLon, maxLat, minLat.
POST /example/_doc
{
"location" : "BBOX (100.0, 102.0, 2.0, 0.0)"
} Окружность
Elasticsearch поддерживает тип circle, который состоит из центральной точки и радиуса.
Вы не можете индексировать тип circle с использованием стандартного подхода индексирования BKD-дерева. Вместо этого используйте процессор обработки окружностей для приближения окружности к polygon.
Тип circle требует сопоставления поля geo_shape с устаревшим стратегией префиксного дерева recursive.
PUT /circle-example
{
"mappings": {
"properties": {
"location": {
"type": "geo_shape",
"strategy": "recursive"
}
}
}
} Следующий запрос индексирует circle геометрическую фигуру.
POST /circle-example/_doc
{
"location" : {
"type" : "circle",
"coordinates" : [101.0, 1.0],
"radius" : "100m"
}
} Примечание: Внутреннее поле radius является обязательным. Если оно не указано, единицы radius по умолчанию установлены в METERS.
ПРИМЕЧАНИЕ: Ни GeoJSON, ни WKT не поддерживают тип окружности «точка-радиус».
Сортировка и извлечение форм индекса
Из-за сложной структуры входных данных и представления фигур в индексе в настоящее время невозможно сортировать фигуры или извлекать их поля напрямую. Значение geo_shape может быть получено только через поле _source.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/geo-shape.html