Тип поля Shape
Тип данных shape облегчает индексирование и поиск с произвольными x, y декартовыми фигурами, такими как прямоугольники и многоугольники. Он может использоваться для индексирования и запросов геометрий, координаты которых находятся в двумерной плоской системе координат.
Вы можете запросить документы, используя этот тип, с помощью запроса формы.
Параметры сопоставления
Как и тип поля geo_shape, сопоставление поля shape преобразует объекты геометрии GeoJSON или Well-Known Text (WKT) в тип формы. Для его активации пользователи должны явно сопоставить поля с типом формы.
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
| Необязательно укажите, как интерпретировать порядок вершин для многоугольников/множественных многоугольников. Этот параметр определяет одно из двух правил системы координат (правостороннее или левостороннее), каждое из которых может быть указано тремя различными способами. 1. Правило правой руки: |
|
| Если значение истинно, неправильно сформированные геометрии GeoJSON или WKT игнорируются. Если ложно (по умолчанию), неправильно сформированные геометрии GeoJSON и WKT вызывают исключение и отклоняют весь документ. |
|
| Если значение |
|
| Если |
|
Подход к индексированию
Как и geo_shape, тип поля shape индексируется путём разбиения геометрий на треугольную сетку и индексирования каждого треугольника как точки с 7 измерениями в дереве BKD. Координаты, предоставляемые индексатору, — это значения с плавающей запятой одинарной точности, поэтому поле гарантирует ту же точность, что и виртуальная машина Java (обычно 1E-38). Для многоугольников/множественных многоугольников производительность триангулятора в первую очередь зависит от количества вершин, определяющих геометрию.
ВАЖНЫЕ ПРИМЕЧАНИЯ
CONTAINS запрос отношений - shape запросы с relation, определённые как contains, поддерживаются для индексов, созданных с ElasticSearch 7.5.0 или более поздней версии.
Пример
PUT /example
{
"mappings": {
"properties": {
"geometry": {
"type": "shape"
}
}
}
} Это определение сопоставления сопоставляет поле геометрии с типом формы. Индексатор использует числа с плавающей запятой одинарной точности для значений вершин, поэтому точность гарантируется до той же точности, что и значения float, предоставляемые виртуальной машиной Java (обычно 1E-38).
Структура входных данных
Фигуры могут быть представлены в формате GeoJSON или Well-Known Text (WKT). В следующей таблице представлено сопоставление GeoJSON и WKT с типами Elasticsearch:
| Тип GeoJSON | Тип WKT | Тип Elasticsearch | Описание |
|---|---|---|---|
|
|
| Одна координата |
|
|
| Произвольная линия, заданная двумя или более точками. |
|
|
| Закрытый многоугольник, у которого первая и последняя точки должны совпадать, что требует |
|
|
| Массив несвязанных, но, вероятно, связанных точек. |
|
|
| Массив отдельных линий. |
|
|
| Массив отдельных многоугольников. |
|
|
| Коллекция фигур, похожая на фигуры |
|
|
| Прямоугольник ограничительной рамки (или огибающая), задаваемый только указанием верхней левой и нижней правой точек. |
Для всех типов требуются как внутреннее поле type, так и поле coordinates.
В GeoJSON, WKT и, следовательно, Elasticsearch правильный порядок координат — (X, Y) в массивах координат. Это отличается от многих геопространственных API (например, geo_shape), которые обычно используют порядок широта, долгота (Y, X).
Точка — это одна координата в декартовой x, y системе координат. Она может представлять местоположение объекта интереса в виртуальном мире или спроецированном пространстве. Ниже приведен пример точки в формате GeoJSON.
POST /example/_doc
{
"location" : {
"type" : "point",
"coordinates" : [-377.03653, 389.897676]
}
} Ниже приведён пример точки в формате WKT:
POST /example/_doc
{
"location" : "POINT (-377.03653 389.897676)"
} linestring, определённая массивом из двух или более положений. Указав только две точки, linestring будет представлять прямую линию. Указание более двух точек создаёт произвольную траекторию. Ниже приведён пример LineString в формате GeoJSON.
POST /example/_doc
{
"location" : {
"type" : "linestring",
"coordinates" : [[-377.03653, 389.897676], [-377.009051, 389.889939]]
}
} Ниже приведён пример LineString в формате WKT:
POST /example/_doc
{
"location" : "LINESTRING (-377.03653 389.897676, -377.009051 389.889939)"
} Многоугольник определяется списком списков точек. Первая и последняя точки в каждом (внешнем) списке должны совпадать (многоугольник должен быть замкнутым). Ниже приведён пример многоугольника в формате GeoJSON.
POST /example/_doc
{
"location" : {
"type" : "polygon",
"coordinates" : [
[ [1000.0, -1001.0], [1001.0, -1001.0], [1001.0, -1000.0], [1000.0, -1000.0], [1000.0, -1001.0] ]
]
}
} Ниже приведён пример многоугольника в формате WKT:
POST /example/_doc
{
"location" : "POLYGON ((1000.0 -1001.0, 1001.0 -1001.0, 1001.0 -1000.0, 1000.0 -1000.0, 1000.0 -1001.0))"
} Первый массив представляет внешнюю границу многоугольника, другие массивы представляют внутренние фигуры ("дырки"). Следующий пример GeoJSON — многоугольника с дыркой:
POST /example/_doc
{
"location" : {
"type" : "polygon",
"coordinates" : [
[ [1000.0, -1001.0], [1001.0, -1001.0], [1001.0, -1000.0], [1000.0, -1000.0], [1000.0, -1001.0] ],
[ [1000.2, -1001.2], [1000.8, -1001.2], [1000.8, -1001.8], [1000.2, -1001.8], [1000.2, -1001.2] ]
]
}
} Следующий пример — многоугольника с дыркой в формате WKT:
POST /example/_doc
{
"location" : "POLYGON ((1000.0 1000.0, 1001.0 1000.0, 1001.0 1001.0, 1000.0 1001.0, 1000.0 1000.0), (1000.2 1000.2, 1000.8 1000.2, 1000.8 1000.8, 1000.2 1000.8, 1000.2 1000.2))"
} ВАЖНОЕ ПРИМЕЧАНИЕ: WKT не навязывает определённый порядок вершин. GeoJSON предписывает, что внешний многоугольник должен быть против часовой стрелки, а внутренние фигуры — по часовой стрелке, что согласуется со спецификацией порядка вершин Simple Feature Access Открытого геопространственного консорциума (OGC).
По умолчанию Elasticsearch ожидает вершины в порядке против часовой стрелки (правило правой руки). Если данные предоставлены в порядке по часовой стрелке (правило левой руки), пользователь может изменить параметр orientation либо в сопоставлении поля, либо в качестве параметра, предоставленного с документом.
Следующий пример переопределения параметров orientation в документе:
POST /example/_doc
{
"location" : {
"type" : "polygon",
"orientation" : "clockwise",
"coordinates" : [
[ [1000.0, 1000.0], [1000.0, 1001.0], [1001.0, 1001.0], [1001.0, 1000.0], [1000.0, 1000.0] ]
]
}
} Следующий пример представляет собой список точек GeoJSON:
POST /example/_doc
{
"location" : {
"type" : "multipoint",
"coordinates" : [
[1002.0, 1002.0], [1003.0, 2000.0]
]
}
} Следующий пример представляет собой список точек WKT:
POST /example/_doc
{
"location" : "MULTIPOINT (1002.0 2000.0, 1003.0 2000.0)"
} Следующий пример представляет собой список линий GeoJSON:
POST /example/_doc
{
"location" : {
"type" : "multilinestring",
"coordinates" : [
[ [1002.0, 200.0], [1003.0, 200.0], [1003.0, 300.0], [1002.0, 300.0] ],
[ [1000.0, 100.0], [1001.0, 100.0], [1001.0, 100.0], [1000.0, 100.0] ],
[ [1000.2, 100.2], [1000.8, 100.2], [1000.8, 100.8], [1000.2, 100.8] ]
]
}
} Следующий пример представляет собой список линий WKT:
POST /example/_doc
{
"location" : "MULTILINESTRING ((1002.0 200.0, 1003.0 200.0, 1003.0 300.0, 1002.0 300.0), (1000.0 100.0, 1001.0 100.0, 1001.0 100.0, 1000.0 100.0), (1000.2 0.2, 1000.8 100.2, 1000.8 100.8, 1000.2 100.8))"
} Следующий пример представляет собой список многоугольников GeoJSON (второй многоугольник содержит дыру):
POST /example/_doc
{
"location" : {
"type" : "multipolygon",
"coordinates" : [
[ [[1002.0, 200.0], [1003.0, 200.0], [1003.0, 300.0], [1002.0, 300.0], [1002.0, 200.0]] ],
[ [[1000.0, 200.0], [1001.0, 100.0], [1001.0, 100.0], [1000.0, 100.0], [1000.0, 100.0]],
[[1000.2, 200.2], [1000.8, 100.2], [1000.8, 100.8], [1000.2, 100.8], [1000.2, 100.2]] ]
]
}
} Следующий пример представляет собой список многоугольников WKT (второй многоугольник содержит дыру):
POST /example/_doc
{
"location" : "MULTIPOLYGON (((1002.0 200.0, 1003.0 200.0, 1003.0 300.0, 1002.0 300.0, 102.0 200.0)), ((1000.0 100.0, 1001.0 100.0, 1001.0 100.0, 1000.0 100.0, 1000.0 100.0), (1000.2 100.2, 1000.8 100.2, 1000.8 100.8, 1000.2 100.8, 1000.2 100.2)))"
} Следующий пример представляет собой коллекцию геометрических объектов GeoJSON:
POST /example/_doc
{
"location" : {
"type": "geometrycollection",
"geometries": [
{
"type": "point",
"coordinates": [1000.0, 100.0]
},
{
"type": "linestring",
"coordinates": [ [1001.0, 100.0], [1002.0, 100.0] ]
}
]
}
} Следующий пример представляет собой коллекцию геометрических объектов WKT:
POST /example/_doc
{
"location" : "GEOMETRYCOLLECTION (POINT (1000.0 100.0), LINESTRING (1001.0 100.0, 1002.0 100.0))"
} Огибающая
Elasticsearch поддерживает тип envelope, который состоит из координат верхней левой и нижней правой точек фигуры для представления прямоугольника охвата в формате [[minX, maxY], [maxX, minY]]:
POST /example/_doc
{
"location" : {
"type" : "envelope",
"coordinates" : [ [1000.0, 100.0], [1001.0, 100.0] ]
}
} Следующий пример представляет собой огибающую, использующую формат WKT BBOX:
ПРИМЕЧАНИЕ: Спецификация WKT ожидает следующий порядок: minLon, maxLon, maxLat, minLat.
POST /example/_doc
{
"location" : "BBOX (1000.0, 1002.0, 2000.0, 1000.0)"
} Сортировка и извлечение фигур индекса
Из-за сложной структуры ввода и представления индекса фигур в настоящее время невозможно сортировать фигуры или извлекать их поля напрямую. Значение 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/shape.html