一架梯子,一头程序猿,仰望星空!

Elasticsearch geo_shape地理形状


通常情况,我们使用一个经纬度坐标表示一个店铺的位置、一个用户的位置,经纬度在地图上仅仅表示一个点,有时候需要表示一个区域,例如:停车场、商场、学校等等,这些区域拥有各种各样的形状,包括:圆形、多边形等等。

ES中存储地理形状的数据类型为: geo_shape

geo_shape支持存储的常用形状数据如下:

  • 点(point)
  • 圆形(circle)
  • 矩形(envelope)
  • 多边形 (polygon)

提示: 在geo_shape中,点作为一种特殊的形状,geo_shape可以存储一个点。

1.定义geo_shape类型映射

只要将字段类型定义为geo_shape即可。

PUT /example
{
    "mappings": {
        "properties": {
            "location": {
                "type": "geo_shape" // 定义location字段类型为geo_shape
            }
        }
    }
}

2.存储一个点

例子:

POST /example/_doc
{
    "location" : {
        "type" : "point", // 存储的图形类型为:point,表示存储一个坐标点
        "coordinates" : [-77.03653, 38.897676] // 坐标点格式: [经度, 纬度]
    }
}

3.存储一个圆形

POST /example/_doc
{
    "location" : {
        "type" : "circle", // 存储的图形类型为: circle, 表示一个圆形
        "coordinates" : [101.0, 1.0], // 圆心坐标,格式: [经度, 纬度]
        "radius" : "100m" // 圆的半径,常用单位: m (米), km (千米)
    }
}

4.存储一个矩形

POST /example/_doc
{
    "location" : {
        "type" : "envelope", // 存储的图形类型为: envelope, 表示一个矩形
        "coordinates" : [ 
             [100.0, 1.0], // 矩形左上角坐标, 坐标格式: [经度, 纬度]
             [101.0, 0.0]  // 矩形右下角坐标
        ]
    }
}

5.存储一个多边形

POST /example/_doc
{
  "location": {
    "type": "polygon", // 存储的图形类型为: polygon,表示一个多边形
    "coordinates": [ // 支持多个多边形
      [ // 第一个多边形,多边形由下面的坐标数组组成。
        [100, 0], // 第一个坐标点,坐标格式: [经度, 纬度]
        [101, 0],
        [101, 1],
        [100, 1],
        [100, 0] // 最后一个坐标点,要跟第一个坐标点相同,这样多边形才能形成闭合
      ]
    ]
  }
}

例子中提到,支持存储多个多边形数据,如果保存多个多边形,则第一个多边形表示外轮廓,第二个多边形表示内轮廓,这样内外多边形轮廓就组成一个空洞的图形,相当于,在多边形中间挖了个坑。