Elasticsearch 关于GeoShape应用小结

ES GEO地理空间查询java版 ES GEO地理空间查询java版 一、半径范围查询 1、设置mapping,类型为geo_point PUT /my_locations { "mappings": { "properties": { "location": { "type": "geo_point" } } } } 2、中心点查询半径内匹配点 GET /my_locations/_search { "query": { "bool": { "mus 阅读详情

Elasticsearch 关于GeoShape应用小结

特别注意:ES只有一种坐标系WGS84
ES GeoShape 一共提供了4中关系

  • INTERSECTS 相交的
  • DISJOINT 不相交的
  • WITHIN 在。。内
  • CONTAINS 包含
    几种关系比较好理解

分类

· 点
· 线
· 圈
· 多边形

点

对于点类型的储存和查询相对简单不多赘述,可以使用范围查覆盖的点,也可以用点查在某个线、圈或多边形上
上代码:
Rest API

GET businessAreaShape/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "geo_shape": {
            "s_location_circle": {
              "shape": {
                "type": "point",
                "coordinates": [
                  116.311434,
                  39.909228
                ]
              },
              "relation": "contains"
            },
            "ignore_unmapped": false,
            "boost": 1
          }
        },
        {
          "geo_shape": {
            "s_location_polygon": {
              "shape": {
                "type": "point",
                "coordinates": [
                  116.311434,
                  39.909228
                ]
              },
              "relation": "contains"
            },
            "ignore_unmapped": false,
            "boost": 1
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "sort": [
    {
      "create_time": {
        "order": "asc"
      }
    }
  ]
}

JAVA Hight Level API

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            PointBuilder pointBuilder = new PointBuilder(lng, lat);
            GeoShapeQueryBuilder shapeQueryCirleBuilder = QueryBuilders.geoShapeQuery(ShopAnalyzeAnchorMapping.SHOP_POINT_FIELD_S_LOCATION_CIRCLE, pointBuilder).relation(ShapeRelation.CONTAINS);
            boolQueryBuilder.should(shapeQueryCirleBuilder);
            GeoShapeQueryBuilder shapeQueryPolygonBuilder = QueryBuilders.geoShapeQuery(ShopAnalyzeAnchorMapping.SHOP_POINT_FIELD_S_LOCATION_POLYGON, pointBuilder).relation(ShapeRelation.CONTAINS);
            boolQueryBuilder.should(shapeQueryPolygonBuilder);

            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.query(boolQueryBuilder);
            sourceBuilder.sort(ShopAnalyzeAnchorMapping.SHOP_POINT_FIELD_CREATE_TIME, SortOrder.ASC);
            //只获取ID就足够了后续所有详细信息从数据库获取
            sourceBuilder.fetchSource("k_anchor_id","");
            SearchRequest searchRequest = new SearchRequest(ANCHOR_SHAPE);
            searchRequest.source(sourceBuilder);
            SearchResponse search = getRestHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

线

暂未涉及 值得注意的是计算距离需要指定方式,ES只有两种方式一是平面二是球型。

圈(CIRCLE)

圈主要有一个中心坐标和半径组成,可以根据半径排序,可根据关系查询。
上代码:

  • mapping
"s_location_circle" : {
    "type" : "geo_shape",
    "strategy" : "recursive"
}

我是用的是ES 5.x版本高版本"strategy" : "recursive"将被弃用

  • 插入
    直接上JAVA,重点就是这个JSON
"s_location_circle":{
"coordinates":[116.55251722897378,39.98890616238562],
"type":"circle",
"radius":"600m"
}
  • 查询
    Rest API
GET businessAreaShape/_search
{
  "query": {
    "geo_shape": {
      "s_location_circle": {
        "shape": {
          "type": "circle",
          "radius": "600.0m",
          "coordinates": [
            116.55251722897378,
            39.98890616238562
          ]
        },
        "relation": "contains"
      },
      "ignore_unmapped": false,
      "boost": 1
    }
  }
}

JAVA Hight Level API

CircleBuilder circleBuilder = new CircleBuilder();
            circleBuilder.center(lng, lat);
            DistanceUnit.Distance distance = new DistanceUnit.Distance(range, DistanceUnit.METERS);
            circleBuilder.radius(distance);

            GeoShapeQueryBuilder shapeQueryBuilder = QueryBuilders.geoShapeQuery(ShopAnalyzeAnchorMapping.SHOP_POINT_FIELD_S_LOCATION_CIRCLE, circleBuilder).relation(ShapeRelation.CONTAINS);

多边形(POLYGON)

  • 插入
"s_location_polygon":{"coordinates":[[[116.47311930720184,39.97367261625567],[116.46083817432645,39.97588286009428],[116.45497672470651,39.971177091927984],[116.46400149615897,39.96704145151183],[116.4741427350599,39.96811103788185],[116.47311930720184,39.97367261625567]]],"type":"polygon"}
  • 查询
    Rest API
GET businessAreaShape/_search
{
  "query": {
    "geo_shape": {
      "s_location_polygon": {
        "shape": {
          "type": "polygon",
          "orientation": "right",
          "coordinates": [
            [
              [
                116.47311930720184,
                39.97367261625567
              ],
              [
                116.46083817432645,
                39.97588286009428
              ],
              [
                116.45497672470651,
                39.971177091927984
              ],
              [
                116.46400149615897,
                39.96704145151183
              ],
              [
                116.4741427350599,
                39.96811103788185
              ],
              [
                116.47311930720184,
                39.97367261625567
              ]
            ]
          ]
        },
        "relation": "contains"
      },
      "ignore_unmapped": false,
      "boost": 1
    }
  }
}

JAVA Hight Level API

 //多边形
 	CoordinatesBuilder coordinatesBuilder = new CoordinatesBuilder();
    List<Location> boundaryPoints = locationForm.getBoundaryPoints();
    for (Location location : boundaryPoints) {
        coordinatesBuilder.coordinate(location.getLng().doubleValue(), location.getLat().doubleValue());
    }
    PolygonBuilder polygonBuilder = new PolygonBuilder(coordinatesBuilder);
    GeoShapeQueryBuilder shapeQueryBuilder = QueryBuilders.geoShapeQuery(ShopAnalyzeAnchorMapping.SHOP_POINT_FIELD_S_LOCATION_POLYGON, polygonBuilder).relation(ShapeRelation.CONTAINS);

目前实现的功能,

  1. 根据地图上画出的范围获取范围内的点位搜索;
  2. 根据点搜索在地图上画过并保存过的范围;
  3. 在地图上画范围保存是验证是否被某个范围完全包含,前提是相通的图形,不同图形不支持,也就是说圈只能判断是否有圈包含它,多边形只能判断是有多边形包含它。

目前使用经验分享于此,由于ES版本较低使用较新版本的同学可根据该版本API玩。

Elasticsearch地理空间之geo_shape 参考文章: Elasticsearch地理形状 Elasticsearch geo_shape地理形状 ES地理范围查询第二讲:地理位置信息之geo_shape ES GEO地理空间查询java版 一、概述 通常情况,我们使用一个经纬度坐标表示一个店铺的位置、一个用户的位置,经纬度在地图上仅仅表示一个点,有时候需要表示一个区域,例如:停车场、商场、学校等等,这些区域拥有各种各样的形状,包括:圆形、多边形等等。 ES中存储地理形状的数据类型为: geo_shape geo_shape支持存储的常用形状数据如 阅读详情

相关推荐

Elasticsearch学习(十二)地理形状geo_shape

目录前言一、建立索引二、检索三、自定义矩形 前言 Geo-Shape和Geo-point都属于地理数据类型,Geo-point表示经纬度的坐标点,Geo-shape用以表示复杂图形,比如多边形、矩形等。geo_shape 支持 intersects(相交)、disjoint(相离)、within(内含)、contains(包含)。 本文针对intersects(相交)做示例。 一、建立索引 1、实体类 shape字段用注解@GeoShapeField标识 @Data @Accessors(ch..

码易的博客 3533

python polygon_python – Polygon.contains和Polygon.within有什么区别?

它们是反比关系:A包含B,B在A内.>>> A.contains(B)True>>> B.within(A)True+----------------------------------+| || +----------+ || | ...

weixin_39628247的博客 855

ROS——无人机ROS仿真包 rotors_simulator 编译教程

文章目录 安装wstool sudo apt install python3-wstool 创建ROS工程 $ mkdir -p ~/UAV/src $ cd ~/UAV/src $ catkin_init_workspace # initialize your catkin workspace $ wstool init 下载源码 git clone git@github.com:ethz-asl/rotors_simulator.git 源码链接: https://github.com/eth

漫长IT路 5863

Elasticsearch ES实现GEO位置搜索

ES中实现GEO位置搜索

Lyndon的专栏 2752

Obsidian和Typora图片路径同步终极指南:告别混乱的assets文件夹

本文详细解析了Obsidian与Typora图片路径同步的终极解决方案,通过Custom Attachment Location插件实现动态路径管理,解决了两款工具间图片兼容性问题。文章提供了从基础配置到高级应用的完整指南,帮助用户告别混乱的assets文件夹,提升工作效率。

g9h0i1的博客 821

TAS5805MPWPR实战:数字音频功放从选型到量产全流程指南

数字音频功放将I2S数字信号直接转为PWM驱动扬声器,省去传统DAC与模拟运放链路,在高保真、低BOM与紧凑PCB之间找到平衡。其核心在于内置可编程DSP,支持多段PEQ、DRC等数字处理,通过I2C配置即可完成调音,而不占用主控算力。这类方案广泛应用于蓝牙音箱、Soundbar、智能音频模组等产品,但实际落地时常遇到I2C通信不稳定、EQ未生效、底噪超标、DC检测误触发等工程问题。从电源布局、LC滤波参数到PurePath Console工具链的使用,再到量产固件加载与故障排查,都需要系统化方法论支撑。本

weixin_29164843的博客 219

JanusGraph 实战:基于 Cassandra CQL 存储后端与 Elasticsearch 索引后端的示例应用

本文以 [example-cql](https://link.gitcode.com/i/32981070b37aa5a5cc735f537a93fd51) 示例为线索,完整讲解如何在 JanusGraph 中组合使用 **Cassandra(CQL 存储后端)** 与 **Elasticsearch(混合索引后端)**:从 `jgex-cql.properties` 配置文件逐项解析、Maven

gitblog_00096的博客 306

JLink 添加国产芯片手把手教程(雅特力 + 华大)

拷贝厂商算法文件夹 + 配置 JLinkDevices.xml。雅特力直接复制官方配置,华大按需添加芯片节点,操作一次,永久生效,以后调试 AT32、HC32 再也不用愁找不到型号。这套方法适配全版本 JLink,也是国产 MCU 替代项目的必备技能,看完照着做,新手也能轻松搞定。百度网盘资料分享:通过网盘分享的文件:jink驱动(包括新增芯片型号)链接: https://pan.baidu.com/s/14SLgrPfyof1lglD6VQguAw?pwd=cfuq 提取码: cfuq。

weixin_48867130的博客 710

ipatool:免费下载任意版本 IPA 的开源命令行工具

ipatool 是一个开源命令行 IPA 下载工具,通过 App Store 官方接口完成 iOS、macOS 等应用包的搜索、授权与下载,无需越狱设备,一台普通开发机就能拿到 .ipa 或 .pkg 安装包。它把登录 Apple 账户、查询版本、下载安装包这几件事收敛成几条命令,在 macOS、Linux、Windows 上行为一致。 ## 背景:手动拿 IPA 为什么难 从 App Sto

gitblog_00683的博客 177

CentOS7下Node.js v20+安装与常见依赖库问题解决指南

本文详细介绍了在CentOS7系统下安装Node.js v20+的完整流程及常见依赖库问题的解决方案。通过升级glibc到2.28+、配置环境变量以及处理libstdc++版本问题,帮助开发者顺利在老旧系统上部署最新版Node.js,提升开发效率。

weixin_30689307的博客 156

TensorRT-LLM环境配置避坑指南:从安装到实战

本文是一份详尽的TensorRT-LLM环境配置避坑指南。文章重点解析了从Python、CUDA、PyTorch版本选择,到解决mpi4py安装这一核心难题的完整流程,并提供了经过验证的稳定版本组合与实战排错方案,帮助开发者高效部署大语言模型推理优化环境。

a0b1c2d3的专栏 983

PhotoCraft zh-hans 完整机制串讲:文案住在哪,为什么 zh-CN 命中简体

PhotoCraft 的简体中文支持没有运行时插件:全部界面文案来自 [crates/ui-egui/src/i18n/](https://link.gitcode.com/i/0110ee0fbecd052d74ff6a38f2e9927c) 下一份 3091 行的 TSV 翻译表,编译期打进二进制,再由测试门禁保证翻译不悄悄腐化。PhotoCraft 怎么切换中文界面、为什么 zh-CN 一定

gitblog_00379的博客 215

【DaVinci Developer专题】-36-创建一个“既读又写”的Sender Receiver Port(SR PR-Port)

有时会遇到SWC需要对一个Port进行“既可以读,也可以写”的操作。以下图为例,Test_A_SWC中Test_A_Port是P-Port;Test_B_SWC中Test_A_Port是R-Port。Test_C_SWC需要对Test_A_Port同时进行“读”和“写”。 该篇将详细介绍PR-Port的创建方法。 目录 1 创建一个S/R Port Interface 2 将一个PR-Port端口添加至Application Component 3 PR-Port端口初始化 4 Run.

「汽车电子助手」的博客 3013

JanusGraph 嵌入式存储实战:基于 BerkeleyJE 与 Lucene 构建本地持久化图应用(example-berkeleyje 全解析)

JanusGraph 官方示例 `example-berkeleyje` 演示了如何用**完全嵌入式**的存储与索引方案搭建图应用:Oracle Berkeley DB Java Edition(BerkeleyJE)作为存储后端、Apache Lucene 作为索引后端,二者都在应用进程内运行,数据直接落盘到文件系统目录,无需启动任何外部服务。本文以该示例为主体,从配置、依赖、运行、清理到源码实

gitblog_00176的博客 334

解决Todesk连接卡在100%问题:remote display server is not supported (e.g. Wayland)

摘要:解决Ubuntu 22.04远程桌面连接问题(AnyDesk报错"remote display server not supported"及向日葵/Todesk无法显示)。方法:1)安装lightdm显示管理器;2)启用lightdm并禁用gdm;3)编辑/etc/gdm3/custom.conf文件,添加WaylandEnable=false;4)重启系统。注:后续可通过命令切换回gdm显示管理器。该方法适用于解决Wayland显示协议导致的远程桌面连接兼容性问题。

猿小白的博客 1573

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JTS 空间索引实战:基于STRtree的高效范围查询与最近邻搜索

本文介绍了如何在工程实践中结合数据库与JTS STRtree实现高效空间查询的三层架构方案。主要内容包括: 问题定位:指出数据库空间索引的局限性,提出"数据库粗筛+STRtree精算"的解决方案; 技术原理:简要介绍STRtree的空间分组索引结构及其查询优势; 实战实现:提供完整Java代码示例,模拟从数据库查询到内存索引构建的完整流程

114514的博客 343

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Sphinx 搜索索引与特殊字符分词:从 C++ 测试 Fixture 看 cpp 域名对象如何被索引与检索

在 Sphinx 文档项目中,`tests/js/roots/cpp/index.rst` 是一个看似只有寥寥数行、实则承载关键验证任务的测试夹具(fixture):它用一段含 `.. cpp:class::` 指令的极简文档,配合配套的 `conf.py` 与生成的 `searchindex.js`,专门用来验证搜索索引能否正确处理"带加号、易被分词器丢弃"的术语(如 `C++`),并保证前端搜

gitblog_00804的博客 306

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

JanusGraph Server 实战指南:启动配置、WebSocket/HTTP 端点与认证

JanusGraph 本身是一个分布式图数据库内核,而对外提供远程 Gremlin 查询服务的组件是 **JanusGraph Server**。它基于 Apache TinkerPop 的 Gremlin Server 引擎构建,并在此基础上扩展了图管理、认证、虚拟线程池等面向 JanusGraph 的便利特性。本篇指南以仓库中的 [docs/operations/server.md](http

gitblog_00708的博客 555

Octop 自托管 AI 助手:一条命令跑起来,三步搭出你的多智能体专家团队

把 AI 助手装进某个网页,意味着对话、文件和凭据都躺在别人的服务器上。开源项目 **Octop** 把这套东西搬回了你手里:一个**自托管 AI 助手平台**,多用户、多智能体,Web 控制台、CLI、飞书/钉钉/QQ 等 IM 通道和定时任务全部由同一个进程提供——一条命令启动,数据永远留在本机。 [![Octop 自托管AI助手聊天主界面,多智能体专家切换与快捷任务入口](https://

gitblog_00896的博客 465

elasticsearch之地理位置查询geo_shape

geo_shape

Just Do IT 2094

Elasticsearch:Geo Point 和 Geo Shape 查询解释

在本文中,我们将了解 Elasticsearch 的地理查询、如何设置映射和索引,并提供一些示例来说明如何查询数据。​Elasticsearch 允许你以两种方式表示 GeoData:geo_shape 和 geo_point。 ​

Elastic 中国社区官方博客 3017

ES地理范围查询第二讲:地理位置信息之geo_shape

1.前言 在前面我简单的介绍了es对地理位置点的相关操作,包括获取多边形内(凸多边形)的点及计算两点之间的距离,或者按照距离的远近排序的简要查询方法,但是假如我们的想要查询落在一个凹多边形内的点,使用geo_point类型的就满足不了我们的需求了,这时候es引入了geo_shape类型。 2. Geo_shape geo_shape支持GeoJson和WKT(Well-Known Text,6.X...

u013272779的博客 4399

Elasticsearch(022):es常见的字段映射类型之地理形状类型(geo_shape、多边的复杂的地址形状)

概念 在上个小节,我们学习了geo_point的数据类型。 这一小节我们来学习geo_shape数据类型,它有助于索引和搜索 任意地理形状,例如矩形和多边形。当正在索引的数据或正在执行的查询包含除点以外的其他形状时,应使用它。 通过上面的概念描述,我们可以得出geo_point和geo_shape的最大区别是: geo_point表示一个点;geo_shape则表示有多个点连成线组成的形状。 学过...

瘦子没有夏天 5023

ElasticSearch 地理范围查询 距离 坐标集合

最近有两个需求是通过地图选择坐标,查询指定距离内的信息,和通过坐标集合组成不规则形状查询出不规则形状范围内的数据,在最起初我看到这个需求的时候第一个想法就是太复杂了,抵触。但是没有办法既然需求下来了只能硬着头皮上了,在调研之后最终还是决定了使用elasticsearch,下面就开始介绍如何使用elasticsearch来进行相关操作 设置数据格式 地理坐标点(geo-point) 是指地球表面可以...

weixin_30878361的博客 1909

Elasticsearch:Geoshape query

与 geo_point 类型类似,geo_shape 查询使用GeoJSON来表示形状。有关如何制作 GeoJSON,请参考我的另外一篇文章 “Elasticsearch:如何制作 GeoJSON 文件并进行地理位置搜索13.0,52.0],14.0,52.0],14.0,53.0],13.0,53.0],13.0,52.0refresh"query": {"bool": {"must": {},"shape": {},

Elastic 中国社区官方博客 1725

elasticsearch当中怎么实现GEO位置搜索

现在大部分APP都有基于位置搜索的功能,比如:我们点外卖,可以按照离我们的距离进行排序,这样可以节省我们的配送费和送餐的时间;还有找工作时,也可以按照离自己家的距离进行排序,谁都想找个离家近的工作,对吧。这些功能都是基于GEO搜索实现的,目前支持GEO搜索功能的中间件有很多,像MySQL、Redis、ES等。我们看看在ES当中怎么实现GEO位置搜索。一、创建语句PUTgeo { "map...

lxw1844912514的博客 1043
上一篇: MYSQL日期用法
下一篇: 连表查询,索引失效
人生重构
博客等级 码龄18年 105粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值