Elasticsearch 地理坐标
-
- 何为坐标
- 一.elasticsearch 的地理坐标坐标分两种
- 二.geo_point的搜索
- 三.geo_shape 数据类型介绍
-
-
- 3.1 geo_shape mapping
- 3.2 往location 插入点(point)
- 3.3 往location 插入多个点(multipoint)
- 3.4 往location 插入线(linestring)
- 3.4 往location 插入多条线(multilinestring)
- 3.5 往location 插入多边形(polygon)
- 3.6 往location 插入多个多边形(multipolygon)
- 3.6 往location 插入点/线/面 集合
- 3.7 往location插入envelope类型
- 3.8 往location中插入圆circle
- 3.9附上官网对各种图形的类型定义
-
- 四:geo_shape query
何为坐标
我们的日常生活中时时刻刻都在应用坐标技术,比如酒店预订,可以搜索展示附近的酒店,再比如搜索附近的餐厅. 衣食住行,所有的一切都离不开坐标,es提供了基于地理坐标的搜索,并和我们的生活喜喜相关.

经度是平面上的位置,从本初子午线作为零点,左右分别是[0,-180]和[0,+180],纬度是上半球[0,90] 和下半球[0,-90], 所以一个经纬度点(x,y)在地球上位移确定了一个位置. x可想象成球面坐标从0点的偏移量,y表示上下位置的便宜量,见上图.
一.elasticsearch 的地理坐标坐标分两种
Elasticsearch支持两种类型的地理数据:
- geo_point:是一个(lon,lat) 经度/纬度 点
- geo_shape: 是对geo_point不足之处的拓展.支持点、线、圆、多边形、多多边形.
很多初次接触的童鞋,不理解geo_shape. 想象一下,一个学校在地理坐标中怎么表示? geo_point只是一个点位,无法表示一片区域, 所以这个时候就需要可以表示区域的数据结构,这就是geo_shape,这里先说到这里,后面还有详解.
二.geo_point的搜索
先不说怎么搜索,先来聊聊这个point,点顾名思义就是一个经纬度点. 也就是我们的es中存储的每条数据有一个字段存储的是一个经纬度的点. 对于数据中的经纬度点,我们能想到的就是查询的时候提供一个范围,然后判断目标索引中数据的经纬度是否在我提供的范围内, 或者我提供一个点,然后查找目标索引中距离我提供的点在一定距离内. 事实上es确实也是这么做的, 下面是es提供的集中搜索方式:
2.1 geo_bounding_box (矩形查询)
查询经纬度落在指定矩形内的数据,在坐标数据中,一个矩形可以由两个点表示. 两个点做平行线即可,在市级地理坐标中,则表示的在地球上围成的矩形范围. 平面几何图如下:

下面摘自官网的例子:
//构造mappings
PUT /my_locations
{
"mappings": {
"properties": {
"pin": {
"properties": {
"location": {
"type": "geo_point" //指定location字段类型是经纬度点坐标.
}
}
}
}
}
}
//放入一条数据
PUT /my_locations/_doc/1
{
"pin": {
"location": {
"lat": 40.12,
"lon": -71.34
}
}
}
//查询: 意思是找出索引my_locations 中经纬度点在指定的矩形范围内的数据
GET my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {
}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": {
"lat": 40.73,
"lon": -74.1
},
"bottom_right": {
"lat": 40.01,
"lon": -71.12
}
}
}
}
}
}
}
2.2 geo_distance (距离查询)
顾名思义,距离查询的意思是用户指定一个经纬度,然后指定一个距离.表示查询出目标索引中 距离我指定的点 在我指定的范围内的所有数据.
实际上就是以我指定的点为中心,其他的点距离中心点不超过我指定的距离,几何图如下(实际上就是以指定的点为圆心,距离为半径画出的圆,所有在圆内的点都是符合条件的数据):

官方案例如下:
//建立mapping映射
PUT /my_locations
{
"mappings": {
"properties": {
"pin": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}
}
//插入一条数据
PUT /my_locations/_doc/1
{
"pin": {
"location": {
"lat": 40.12,
"lon": -71.34
}
}
}
//查询指定半径
GET /my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {
}
},
"filter": {
"geo_distance": {
"distance": "200km",//我指定的距离半径
"pin.location": {
//我指定的圆心坐标点
"lat": 40,
"lon": -70
}
}
}
}
}
}
2.3 geo_polygon(范围查询)
顾名思义就是我们是顶一个范围,去查询目标索引中落在指定范围内的点,将符合查询条件的数据查出来,这个范围是由多个点组成的,几何意义上是一个任意的不规则的范围.

官网案例: 三种写法
//第一种写法
GET /_search
{
"query": {
"bool": {
"must": {
"match_all": {
}
},
"filter": {
"geo_polygon": {
"person.location": {
"points": [
{
"lat":

最低0.47元/天 解锁文章
5395

被折叠的 条评论
为什么被折叠?



