地理边界聚合

geo_bounds 聚合是一种多值聚合,用于计算包含一组 geo_pointgeo_shape 对象的地理边界框。边界框以矩形的左上角和右下角顶点形式返回,表示为十进制度经纬度对。

参数

geo_bounds 聚合接受以下参数。

参数 必需/可选 数据类型 描述
field 必需 字符串 包含要计算地理边界的地理点或地理形状的字段名称。
wrap_longitude 可选 布尔值 是否允许边界框跨越国际日期变更线。默认值为 true

示例

以下示例返回电子商务示例数据中每个订单的 geoip.location 的地理边界(每个 geoip.location 是一个地理点):

GET opensearch_dashboards_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "geo": {
      "geo_bounds": {
        "field": "geoip.location"
      }
    }
  }
}

示例响应

如以下示例响应所示,聚合返回包含 geoip.location 字段中所有地理点的地理边界:

{
  "took": 16,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 4675,
      "relation": "eq"
    },
    "max_score": null,
    "hits": []
  },
  "aggregations": {
    "geo": {
      "bounds": {
        "top_left": {
          "lat": 52.49999997206032,
          "lon": -118.20000001229346
        },
        "bottom_right": {
          "lat": 4.599999985657632,
          "lon": 55.299999956041574
        }
      }
    }
  }
}

对地理形状进行聚合

您可以对地理形状运行 geo_bounds 聚合。

通过插入包含地理形状字段的索引来准备示例:

PUT national_parks
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_shape"
      }
    }
  }
}

将文档导入索引。GeoJSON 输入首先指定经度:

POST _bulk
{ "create": { "_index": "national_parks", "_id": "1" } }
{"name": "Yellowstone National Park", "location": {"type": "envelope","coordinates": [ [-111.15, 45.12], [-109.83, 44.12] ]}}
{ "create": { "_index": "national_parks", "_id": "2" } }
{ "name": "Yosemite National Park", "location": {"type": "envelope","coordinates": [ [-120.23, 38.16], [-119.05, 37.45] ]} }
{ "create": { "_index": "national_parks", "_id": "3" } }
{ "name": "Death Valley National Park", "location": {"type": "envelope","coordinates": [ [-117.34, 37.01], [-116.38, 36.25] ]} }
{ "create": { "_index": "national_parks", "_id": "4" } }
{ "name": "War In The Pacific National Historic Park Guam", "location": {"type": "point","coordinates": [144.72, 13.47]} }

location 字段运行 geo_bounds 聚合:

GET national_parks/_search
{
  "size": 0,
  "aggregations": {
    "grouped": {
      "geo_bounds": {
        "field": "location",
        "wrap_longitude": true
      }
    }
  }
}

响应包含包围 location 字段中所有形状的最小地理边界框:

{
  "took": 8,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 4,
      "relation": "eq"
    },
    "max_score": null,
    "hits": []
  },
  "aggregations": {
    "grouped": {
      "bounds": {
        "top_left": {
          "lat": 45.11999997776002,
          "lon": 144.71999991685152
        },
        "bottom_right": {
          "lat": 13.469999986700714,
          "lon": -109.83000006526709
        }
      }
    }
  }
}

经度环绕

如果可选的 wrap_longitude 参数设置为 true,则边界框可以跨越国际日期变更线(180° 经线),并返回一个左上角经度大于右下角经度的 bounds 对象。wrap_longitude 的默认值为 true

wrap_longitude 设置为 false 的情况下,对国家公园地理形状重新运行 geo_bounds 聚合:

GET national_parks/_search
{
  "size": 0,
  "aggregations": {
    "grouped": {
      "geo_bounds": {
        "field": "location",
        "wrap_longitude": false
      }
    }
  }
}

请注意,新生成的边界框覆盖了更大的区域以避免跨越日界线:

{
...
  "aggregations": {
    "grouped": {
      "bounds": {
        "top_left": {
          "lat": 45.11999997776002,
          "lon": -120.23000006563962
        },
        "bottom_right": {
          "lat": 13.469999986700714,
          "lon": 144.71999991685152
        }
      }
    }
  }
}

UDB-SX 通过 API 支持地理形状聚合,但在 UDB-SX Dashboards 可视化中不支持。