Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Агрегирование ›Метрические агрегации

Агрегация географических границ

Метрическая агрегация, которая вычисляет географическую прямоугольную область, содержащую все значения для поля Geopoint или Geoshape.

Пример:

resp = client.indices.create(
    index="museums",
    mappings={
        "properties": {
            "location": {
                "type": "geo_point"
            }
        }
    },
)
print(resp)

resp1 = client.bulk(
    index="museums",
    refresh=True,
    operations=[
        {
            "index": {
                "_id": 1
            }
        },
        {
            "location": "POINT (4.912350 52.374081)",
            "name": "NEMO Science Museum"
        },
        {
            "index": {
                "_id": 2
            }
        },
        {
            "location": "POINT (4.901618 52.369219)",
            "name": "Museum Het Rembrandthuis"
        },
        {
            "index": {
                "_id": 3
            }
        },
        {
            "location": "POINT (4.914722 52.371667)",
            "name": "Nederlands Scheepvaartmuseum"
        },
        {
            "index": {
                "_id": 4
            }
        },
        {
            "location": "POINT (4.405200 51.222900)",
            "name": "Letterenhuis"
        },
        {
            "index": {
                "_id": 5
            }
        },
        {
            "location": "POINT (2.336389 48.861111)",
            "name": "Musée du Louvre"
        },
        {
            "index": {
                "_id": 6
            }
        },
        {
            "location": "POINT (2.327000 48.860000)",
            "name": "Musée d'Orsay"
        }
    ],
)
print(resp1)

resp2 = client.search(
    index="museums",
    size="0",
    query={
        "match": {
            "name": "musée"
        }
    },
    aggs={
        "viewport": {
            "geo_bounds": {
                "field": "location",
                "wrap_longitude": True
            }
        }
    },
)
print(resp2)
response = client.indices.create(
  index: 'museums',
  body: {
    mappings: {
      properties: {
        location: {
          type: 'geo_point'
        }
      }
    }
  }
)
puts response

response = client.bulk(
  index: 'museums',
  refresh: true,
  body: [
    {
      index: {
        _id: 1
      }
    },
    {
      location: 'POINT (4.912350 52.374081)',
      name: 'NEMO Science Museum'
    },
    {
      index: {
        _id: 2
      }
    },
    {
      location: 'POINT (4.901618 52.369219)',
      name: 'Museum Het Rembrandthuis'
    },
    {
      index: {
        _id: 3
      }
    },
    {
      location: 'POINT (4.914722 52.371667)',
      name: 'Nederlands Scheepvaartmuseum'
    },
    {
      index: {
        _id: 4
      }
    },
    {
      location: 'POINT (4.405200 51.222900)',
      name: 'Letterenhuis'
    },
    {
      index: {
        _id: 5
      }
    },
    {
      location: 'POINT (2.336389 48.861111)',
      name: 'Musée du Louvre'
    },
    {
      index: {
        _id: 6
      }
    },
    {
      location: 'POINT (2.327000 48.860000)',
      name: "Musée d'Orsay"
    }
  ]
)
puts response

response = client.search(
  index: 'museums',
  size: 0,
  body: {
    query: {
      match: {
        name: 'musée'
      }
    },
    aggregations: {
      viewport: {
        geo_bounds: {
          field: 'location',
          wrap_longitude: true
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "museums",
  mappings: {
    properties: {
      location: {
        type: "geo_point",
      },
    },
  },
});
console.log(response);

const response1 = await client.bulk({
  index: "museums",
  refresh: "true",
  operations: [
    {
      index: {
        _id: 1,
      },
    },
    {
      location: "POINT (4.912350 52.374081)",
      name: "NEMO Science Museum",
    },
    {
      index: {
        _id: 2,
      },
    },
    {
      location: "POINT (4.901618 52.369219)",
      name: "Museum Het Rembrandthuis",
    },
    {
      index: {
        _id: 3,
      },
    },
    {
      location: "POINT (4.914722 52.371667)",
      name: "Nederlands Scheepvaartmuseum",
    },
    {
      index: {
        _id: 4,
      },
    },
    {
      location: "POINT (4.405200 51.222900)",
      name: "Letterenhuis",
    },
    {
      index: {
        _id: 5,
      },
    },
    {
      location: "POINT (2.336389 48.861111)",
      name: "Musée du Louvre",
    },
    {
      index: {
        _id: 6,
      },
    },
    {
      location: "POINT (2.327000 48.860000)",
      name: "Musée d'Orsay",
    },
  ],
});
console.log(response1);

const response2 = await client.search({
  index: "museums",
  size: 0,
  query: {
    match: {
      name: "musée",
    },
  },
  aggs: {
    viewport: {
      geo_bounds: {
        field: "location",
        wrap_longitude: true,
      },
    },
  },
});
console.log(response2);
PUT /museums
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_point"
      }
    }
  }
}

POST /museums/_bulk?refresh
{"index":{"_id":1}}
{"location": "POINT (4.912350 52.374081)", "name": "NEMO Science Museum"}
{"index":{"_id":2}}
{"location": "POINT (4.901618 52.369219)", "name": "Museum Het Rembrandthuis"}
{"index":{"_id":3}}
{"location": "POINT (4.914722 52.371667)", "name": "Nederlands Scheepvaartmuseum"}
{"index":{"_id":4}}
{"location": "POINT (4.405200 51.222900)", "name": "Letterenhuis"}
{"index":{"_id":5}}
{"location": "POINT (2.336389 48.861111)", "name": "Musée du Louvre"}
{"index":{"_id":6}}
{"location": "POINT (2.327000 48.860000)", "name": "Musée d'Orsay"}

POST /museums/_search?size=0
{
  "query": {
    "match": { "name": "musée" }
  },
  "aggs": {
    "viewport": {
      "geo_bounds": {
        "field": "location",    
        "wrap_longitude": true  
      }
    }
  }
}

Агрегация geo_bounds определяет поле, которое используется для получения границ, которое должно быть типа Geopoint или Geoshape.

wrap_longitude — это необязательный параметр, который определяет, разрешено ли перекрытие прямоугольной области с международной линией перемены дат. Значение по умолчанию — true.

Вышеприведённая агрегация демонстрирует, как вычислить прямоугольную область для поля местоположения для всех документов с именем «musée».

Ответ на вышеприведенную агрегацию:

{
  ...
  "aggregations": {
    "viewport": {
      "bounds": {
        "top_left": {
          "lat": 48.86111099738628,
          "lon": 2.3269999679178
        },
        "bottom_right": {
          "lat": 48.85999997612089,
          "lon": 2.3363889567553997
        }
      }
    }
  }
}

Агрегация географических границ для полей geo_shape

Агрегация географических границ также поддерживается для полей geo_shape.

Если wrap_longitude установлено в значение true (по умолчанию), прямоугольная область может перекрывать международную линию перемены дат и вернуть прямоугольную область, где top_left долгота больше, чем top_right долгота.

Например, долгота верхнего правого угла обычно больше долготы нижнего левого угла географической прямоугольной области. Однако, когда область пересекает меридиан 180°, значение нижней левой долготы будет больше значения верхней правой долготы. Дополнительную информацию см. на веб-сайте Консорциума по открытым геопространственным технологиям в разделе Географическая прямоугольная область.

Пример:

resp = client.indices.create(
    index="places",
    mappings={
        "properties": {
            "geometry": {
                "type": "geo_shape"
            }
        }
    },
)
print(resp)

resp1 = client.bulk(
    index="places",
    refresh=True,
    operations=[
        {
            "index": {
                "_id": 1
            }
        },
        {
            "name": "NEMO Science Museum",
            "geometry": "POINT(4.912350 52.374081)"
        },
        {
            "index": {
                "_id": 2
            }
        },
        {
            "name": "Sportpark De Weeren",
            "geometry": {
                "type": "Polygon",
                "coordinates": [
                    [
                        [
                            4.965305328369141,
                            52.39347642069457
                        ],
                        [
                            4.966979026794433,
                            52.391721758934835
                        ],
                        [
                            4.969425201416015,
                            52.39238958618537
                        ],
                        [
                            4.967944622039794,
                            52.39420969150824
                        ],
                        [
                            4.965305328369141,
                            52.39347642069457
                        ]
                    ]
                ]
            }
        }
    ],
)
print(resp1)

resp2 = client.search(
    index="places",
    size="0",
    aggs={
        "viewport": {
            "geo_bounds": {
                "field": "geometry"
            }
        }
    },
)
print(resp2)
response = client.indices.create(
  index: 'places',
  body: {
    mappings: {
      properties: {
        geometry: {
          type: 'geo_shape'
        }
      }
    }
  }
)
puts response

response = client.bulk(
  index: 'places',
  refresh: true,
  body: [
    {
      index: {
        _id: 1
      }
    },
    {
      name: 'NEMO Science Museum',
      geometry: 'POINT(4.912350 52.374081)'
    },
    {
      index: {
        _id: 2
      }
    },
    {
      name: 'Sportpark De Weeren',
      geometry: {
        type: 'Polygon',
        coordinates: [
          [
            [
              4.965305328369141,
              52.39347642069457
            ],
            [
              4.966979026794433,
              52.391721758934835
            ],
            [
              4.969425201416015,
              52.39238958618537
            ],
            [
              4.967944622039794,
              52.39420969150824
            ],
            [
              4.965305328369141,
              52.39347642069457
            ]
          ]
        ]
      }
    }
  ]
)
puts response

response = client.search(
  index: 'places',
  size: 0,
  body: {
    aggregations: {
      viewport: {
        geo_bounds: {
          field: 'geometry'
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "places",
  mappings: {
    properties: {
      geometry: {
        type: "geo_shape",
      },
    },
  },
});
console.log(response);

const response1 = await client.bulk({
  index: "places",
  refresh: "true",
  operations: [
    {
      index: {
        _id: 1,
      },
    },
    {
      name: "NEMO Science Museum",
      geometry: "POINT(4.912350 52.374081)",
    },
    {
      index: {
        _id: 2,
      },
    },
    {
      name: "Sportpark De Weeren",
      geometry: {
        type: "Polygon",
        coordinates: [
          [
            [4.965305328369141, 52.39347642069457],
            [4.966979026794433, 52.391721758934835],
            [4.969425201416015, 52.39238958618537],
            [4.967944622039794, 52.39420969150824],
            [4.965305328369141, 52.39347642069457],
          ],
        ],
      },
    },
  ],
});
console.log(response1);

const response2 = await client.search({
  index: "places",
  size: 0,
  aggs: {
    viewport: {
      geo_bounds: {
        field: "geometry",
      },
    },
  },
});
console.log(response2);
PUT /places
{
  "mappings": {
    "properties": {
      "geometry": {
        "type": "geo_shape"
      }
    }
  }
}

POST /places/_bulk?refresh
{"index":{"_id":1}}
{"name": "NEMO Science Museum", "geometry": "POINT(4.912350 52.374081)" }
{"index":{"_id":2}}
{"name": "Sportpark De Weeren", "geometry": { "type": "Polygon", "coordinates": [ [ [ 4.965305328369141, 52.39347642069457 ], [ 4.966979026794433, 52.391721758934835 ], [ 4.969425201416015, 52.39238958618537 ], [ 4.967944622039794, 52.39420969150824 ], [ 4.965305328369141, 52.39347642069457 ] ] ] } }

POST /places/_search?size=0
{
  "aggs": {
    "viewport": {
      "geo_bounds": {
        "field": "geometry"
      }
    }
  }
}
{
  ...
  "aggregations": {
    "viewport": {
      "bounds": {
        "top_left": {
          "lat": 52.39420966710895,
          "lon": 4.912349972873926
        },
        "bottom_right": {
          "lat": 52.374080987647176,
          "lon": 4.969425117596984
        }
      }
    }
  }
}

© 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/8.17/search-aggregations-metrics-geobounds-aggregation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API