ElasticSearch Java API GEO操作(REST命令版)

news/2024/7/7 5:48:01 标签: elasticsearch, java

前言

ElasticSearch支持地理空间数据查询、搜索,提供geo_pointgeo_shape两种地理数据类型。

geo_point用于描述一个或多个地理坐标点,主要用于周边位置查询、边界内搜索点、聚合多个范围内的点等功能。

geo_shape用于描述点线面等多种地理数据,使用GeoJson标准格式描述,可以对这些地理数据做相交、不相交、包含等等地理关系的判断与计算。

新增索引

PUT /my_locations
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      }
    }
  }
}

PUT后边紧跟的就是需要创建的索引名:my_locationsmappings中设置了一个属性name,为text类型。

更新geo类型的mappings

新增两个字段,location字段类型为geo_pointpolygon字段类型为geo_shape

PUT后边紧跟索引名my_locations,加_mapping表示在操作mappings。

PUT /my_locations/_mapping
{
  "properties": {
    "name": {
      "type": "text"
    },
    "location": {
      "type": "geo_point"
    },
    "polygon": {
      "type": "geo_shape"
    }
  }
}

查询修改后的索引

GET my_locations/_mapping
{
  "my_locations":
    "mappings":
      "properties":
        "location":
          "type": "geo_point"  
        },  
        "name":
          "type": "text"  
        },  
        "polygon":
          "type": "geo_shape"  
        }  
      }  
    }  
  }  
}

注意不要在请求体里的body里填{},会报错。

新增geo数据

固有格式就是/索引名/_doc/id,表示添加数据。geo_point支持普通经纬度数组、WKTgeohash格式的地理数据。

三种类型的经纬度格式都是经度在前,纬度在后。

新增经纬度数组类型的地理坐标点数据:

POST /my_locations/_doc/1
{
  "name": "喜茶",
  "location": [
    113.947539,
    22.530122
  ]
}

新增WKT类型的地理坐标点数据:

POST my_locations/_doc/2
{
	"name": "喜茶2",
	"location": "POINT(113.947539 22.530122)"
}

新增geohash类型的地理坐标点数据:

POST my_locations/_doc/3
{
	"name": "喜茶geohash",
	"location": "ws100vqp6p"
}

新增另一个地点

POST my_locations/_doc/4

{
	"name": "平安银行",
	"location": [
		113.945805,
		22.530055
	]
}

距离查询

传入一个坐标原点和相应的距离范围,来搜索范围内是否存在坐标点:

GET my_locations/_search
{
    "query": {
        "bool": {
            "must": {
                "match_all": {}
            },
            "filter": {
                "geo_distance": {
                    "distance": "500m",
                    "location": [
                        113.948769,22.530063
                    ]
                }
            }
        }
    }
}

其中距离单位参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/api-conventions.html#distance-units
常见的公里为km,米为m,默认是米。

聚合查询

定义一个原点和一组距离范围桶,聚合评估每个文档值与原点的距离。

GET my_locations/_search?size=0&filter_path=aggregations
{
  "aggs": {
    "data_around_city": {
      "geo_distance": {
        "unit": "m",
        "field": "location",
        "origin": "113.94823,22.530143",
        "ranges": [
          {
            "to": 100
          },
          {
            "from": 100,
            "to": 300
          },
          {
            "from": 600,
            "to": 1000
          },
          {
            "from": 1000
          }
        ]
      }
    }
  }
}

地理多边形内的点

传入一个多边形来判断多边形范围内是否有坐标点,使用within方法表示内部。

GET my_locations/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_shape": {
          "location": {
            "shape": {
              "type": "polygon",
              "relation": "within",
              "coordinates": [
                [
                  [
                    113.942373,
                    22.531399
                  ],
                  [
                    113.955111,
                    22.531432
                  ],
                  [
                    113.953261,
                    22.524538
                  ],
                  [
                    113.940451,
                    22.525991
                  ]
                ]
              ]
            }
          }
        }
      }
    }
  }
}

新增面数据

es支持的另一种地理类型字段为geo_shape,包括点、线、多线、面、多面等常见地理类型数据。支持GeoJsonWKT两种标准的地理数据格式。

为第一个喜茶新增多边形的GeoJson数据:

POST my_locations/_doc/1
{
	"name": "喜茶",
	"location": [
		113.947539,
		22.530122
	],
	"polygon": {
		"type": "envelope",
		"coordinates": [
			[
				113.947248,
				22.530295
			],
			[
				113.94776,
				22.529753
			]
		]
	}
}

为第二个喜茶新增WKT数据

POST my_locations/_doc/2
{
	"name": "喜茶2",
	"location": "POINT(113.947539 22.530122)",
	"polygon": "POLYGON ((113.947305 22.530055, 113.947682 22.530047, 113.947718 22.529788, 113.947341 22.529842, 113.947305 22.530055)) "
}

通过点判断落面

判断传入的点落在是否被包含(contains)在相应的多边形内:

GET my_locations/_search
{
	"query": {
		"bool": {
			"must": {
				"match_all": {}
			},
			"filter": {
				"geo_shape": {
					"polygon": {
						"shape": {
							"type": "point",
							"coordinates": [
								113.947305,
								22.530055
							]
						},
						"relation": "contains"
					}
				}
			}
		}
	}
}

判断面相交

GET my_locations/_search
{
	"query": {
		"bool": {
			"must": {
				"match_all": {}
			},
			"filter": {
				"geo_shape": {
					"polygon": {
						"shape": {
							"type": "polygon",
							"relation": "intersects",
							"coordinates": [
								[
									[
										113.947522,
										22.530091
									],
									[
										113.948169,
										22.529966
									],
									[
										113.948187,
										22.529695
									],
									[
										113.94754,
										22.529707
									]
								]
							]
						}
					}
				}
			}
		}
	}
}

参考

  1. Elasticsearch:Geo Point 和 Geo Shape 查询解释
  2. Elasticsearch地理空间之geo_shape
  3. ES地理范围查询第一讲:Java操作地理位置信息(geo_point)
  4. Elasticsearch 之(53) Java API 基于geo_shape根据坐标查找 坐标落在店铺范围的店铺
  5. Geo queries
  6. 百度地图坐标拾取系统
  7. 在线经纬度转geohash
  8. # 百度地图 geohash 可视化工具

http://www.niftyadmin.cn/n/5101722.html

相关文章

保护隐私就是在保护自己!如何在Android上更改应用程序权限

如果你关心隐私,知道如何在Android上更改应用程序权限将成为一项非常重要的技能。即使是最好的安卓应用程序也可以对手机的功能和数据进行广泛的访问,因此准确控制它们的使用范围会有所帮助。 一旦你在手机上加载了应用程序,你可能会注意到它…

【网络安全】防火墙技术

防火墙是网络安全防御的重要组成部分,它的主要任务是阻止或限制不安全的网络通信。在这篇文章中,我们将详细介绍防火墙的工作原理,类型以及如何配置和使用防火墙。我们将尽可能使用简单的语言和实例,以便于初学者理解。 如果你对…

“滑动窗口”算法专项训练

目录 题目链接:长度最小的子数组 题目描述 思路分析:滑动窗口(利用单调性,使用"同向双指针来优化) 细节处理 画图解析 代码 题目链接:最大连续1的个数 III 题目描述 思路分析:滑动窗口(同向双指针) 细节…

【数组的使用续篇】

文章目录 以数组的形式打印数组打印方法:Arrays.toString(数组名) 数组排序大小排序方法是 Arrays.sort(数组名) 创建一个自己的打印数组的方法自己创建一个冒泡排序两数之间交换方法 逆置数组打印核心思路还是 i 和 j 交换 总结 以数组的形式打印数组 打印方法&am…

linux之tcpdump的用法

linux之tcpdump的用法 用法简介应用举例 用法简介 tcpdump是一个命令行网络抓包工具,其命令格式为: tcpdump[ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ] [ -i 网络接口 ] [ -r 文件名] [ -s snaplen ] [ -T 类型 ] [ -w 文件名 ] [表达式 ] 以下是…

CatBoost算法模型实现贷款违约预测

前言 此篇文章为整个Boost(提升方法)集成算法模型的终章,前几篇文章依次结合详细项目案例讲解了AdaBoost、GBDT、XGBoost、LighGBM共四个常用的集成算法模型,每一篇文章都包含实战项目以及可运行代码。仅通过看一遍文章不去实践是很难掌握集成算法模型的…

wordpress网站部署了ssl证书之后就排版混乱了

刚给自己的小网站部署了SSL证书,之后就发现https访问主页竟然乱套了。在手机上访问却是正常的。 直接上解决方案: 编辑网站根目录下的wp-config.php文件 在自定义文本处添加以下代码: if ($_SERVER[HTTP_X_FORWARDED_PROTO] https) $_SE…

关于opencv的contourArea计算方法

cv::contourArea计算的轮廓面积并不等于轮廓点计数,原因是cv::contourArea是基于Green公式计算 老外的讨论 github 举一个直观的例子,图中有7个像素,橙色为轮廓点连线,按照contourArea的定义,轮廓的面积为橙色所包围…