Skip to main content

GeoHash网格聚合 geohash_grid

GeoHash grid Aggregation

一种多桶聚合,用于geo_point字段,并将点分组到表示网格中单元格的桶中。生成的网格可以是稀疏的,并且只包含具有匹配数据的单元格。每个单元格都使用具有用户可定义精度的geohash进行标记。

  • 高精度geohash具有很长的字符串长度,表示只覆盖很小区域的单元格。
  • 低精度geohash的字符串长度很短,表示每个单元格覆盖的区域很大。

此聚合中使用的Geohash可以在1到12之间选择精度。

info

长度为12的最高精度geohash产生的单元覆盖面积不到一平方米,因此高精度请求在内存和结果size方面可能非常昂贵。请参阅下面的示例,了解如何在请求高级别的详细信息之前先将聚合过滤到较小的地理区域。

指定的字段必须是geo_point类型,并且它还可以包含一个geo_point字段数组,在这种情况下,聚合期间将考虑所有点。

Low-precision 低精度请求

PUT /museums
{
"mappings": {
"_doc": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}

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

POST /museums/_search?size=0
{
"aggregations" : {
"large-grid" : {
"geohash_grid" : {
"field" : "location",
"precision" : 3
}
}
}
}

返回

{
...
"aggregations": {
"large-grid": {
"buckets": [
{
"key": "u17",
"doc_count": 3
},
{
"key": "u09",
"doc_count": 2
},
{
"key": "u15",
"doc_count": 1
}
]
}
}
}

High-precision 高精度请求

当请求详细的存储桶(通常用于显示“放大”地图)时,应该应用geo_bounding_box这样的过滤器来缩小主区域,否则可能会创建并返回数百万个桶。

POST /museums/_search?size=0
{
"aggregations" : {
"zoomed-in" : {
"filter" : {
"geo_bounding_box" : {
"location" : {
"top_left" : "52.4, 4.9",
"bottom_right" : "52.3, 5.0"
}
}
},
"aggregations":{
"zoom1":{
"geohash_grid" : {
"field": "location",
"precision": 8
}
}
}
}
}
}

geohash_grid聚合返回的作为bucket keys的geohash也可以用于“放大”,方法是使用一个可用的geohash库将它们转换为bounding boxes。例如,对于javascript,可以使用节点geohash库:

var geohash = require('ngeohash');

// bbox will contain [ 52.03125, 4.21875, 53.4375, 5.625 ]
// [ minlat, minlon, maxlat, maxlon]
var bbox = geohash.decode_bbox('u17');

赤道处的单元尺寸

下表显示了geohash的不同字符串长度覆盖的单元格的度量维度。单元尺寸随纬度而变化,因此该表适用于赤道的worst-case。

GeoHash 长度面积 宽 x 高
15,009.4km x 4,992.6km
21,252.3km x 624.1kmm
3156.5km x 156km
439.1km x 19.5km
54.9km x 4.9km
61.2km x 609.4m
7152.9m x 152.4m
838.2m x 19m
94.8m x 4.8m
101.2m x 59.5cm
1114.9cm x 14.9cm
123.7cm x 1.9cm
参数说明
field(必选)GeoPoints索引的字段
precision(可选)用于在结果中定义 cells/buckets的geohash的字符串长度。默认值为5。精度可以根据上述整数精度级别定义。[1,12]以外的值将被拒绝。或者,精度等级可以通过“1km”、“10m”等距离度量来近似。计算精度级别时,单元格不会超过所需精度的指定大小(对角线)。当这将导致精度级别高于支持的12个级别时(例如,距离<5.6cm),该值将被拒绝
size(可选)要返回的最大geohash桶数(默认为10000)。当对结果进行调整时,桶将根据其包含的文档量进行优先级排序。
shard_size(可选)为了更准确地计算最终结果中返回的 top cells,聚合默认为从每个shard返回最大max(10,(size x number-of-shards))个桶。如果不希望使用这种启发式方法,则可以使用此参数覆盖每个shard中考虑的数量。