ElasticSearch GEO:地理形状(geo shape)

来自Wikioe
跳到导航 跳到搜索


关于

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


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

  1. 点(point)
  2. 圆形(circle)
  3. 矩形(envelope)
  4. 多边形 (polygon)


  • “点”作为一种特殊的形状,可以在 geo_shape 中存储。

定义geo_shape类型映射

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


示例:

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

存储一个“点”

示例:

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

存储一个“圆形”

示例:

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

存储一个“矩形”

示例:

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

存储一个“多边形”

示例:

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


  • 支持存储多个多边形数据
    如果保存多个多边形:则第一个多边形表示外轮廓,第二个多边形表示内轮廓,这样内外多边形轮廓就组成一个空洞的图形,相当于,在多边形中间挖了个坑。【表示内外轮廓之间的部分】

地理形状搜索

当索引的字段类型定义为 geo_shape 之后,我们就可以通过 geo_shape 实现图形搜索。


geo_shape 支持的图形搜索类型:

  1. intersects:查询的形状与索引的形状有重叠(默认), 即图形有交集则匹配。
  2. disjoint:查询的形状与索引的形状完全不重叠
  3. within:查询的形状包含索引的形状。


示例:使用一个矩形去搜索 location 字段值,返回包含在这个矩形范围内的所有文档。

GET /example/_search
{
    "query":{
        "bool": { // 布尔组合查询语句
            "must": {
                "match_all": {} // 这里设置其他查询条件,直接匹配全部文档
            },
            "filter": { // 地理信息搜索,通常不参与相关性计算,所以使用filter包裹起来
                "geo_shape": { // geo_shape搜索语句
                    "location": { // 图形数据存储在location字段
                        "shape": { // 设置我们想要通过什么形状去搜索location存储的图形数据
                            "type": "envelope", // 设置图形类型为envelope,表示矩形,各种图形格式参考下面提示
                            "coordinates" : [[13.0, 53.0], [14.0, 52.0]] // 设置矩形的坐标
                        },
                        "relation": "within" // 设置图形搜索类型,这里设置为包含关系
                    }
                }
            }
        }
    }
}