博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
elasticsearch GIS空间查询问题解决
阅读量:5935 次
发布时间:2019-06-19

本文共 2462 字,大约阅读时间需要 8 分钟。

     在GIS行业的应用越来越广泛,GIS最常用根据区域进行空间数据查询

    我定义了两个方法,一起来看一下:
  1. /**     * geodistance filter     * 一个过滤器来过滤基于一个特定的距离从一个特定的地理位置/点。     * @author chenjie     * @param x     * @param y     * @param distance     * @return     */    protected static FilterBuilder geoDistanceFilter(Double x,Double y,Double distance) {        return FilterBuilders.geoDistanceFilter("the_geom")                .point(x, y)                .distance(distance, DistanceUnit.METERS)                .optimizeBbox("memory")                   // Can be also "indexed" or "none"                .geoDistance(GeoDistance.ARC);            // Or GeoDistance.PLANE    }    /**     * geo bounding box filter     * 定义一个过滤器来过滤基于边界框左上角和右下角的位置/分     * @author chenjie     * @return FilterBuilder     */    protected static FilterBuilder geoBoundingBoxFilter(Double topleft_x,Double topleft_y,Double bottomRight_x,Double bottomRight_y) {        return FilterBuilders.geoBoundingBoxFilter("the_geom")                .topLeft(topleft_x, topleft_y)                .bottomRight(bottomRight_x, bottomRight_y);    }

     

  我们可以看的到这两个方法分是做距离查询(可以用于周边查询,注意方法中
DistanceUnit
.
METERS指的是计算单位
)和距形查询
  我们再看看elasticsearch是如何查询数据的,我封装了一个方法
   
public List
> searchByQuery(String indexName, String docType, QueryBuilder queryBuilder, FilterBuilder filterBuilder, int from, int size, SortBuilder... sort) throws Exception { ArrayList list = new ArrayList(); SearchRequestBuilder request = this.elasticSearchClient.prepareSearch(new String[]{indexName}).setTypes(new String[]{docType}).setQuery(queryBuilder); if(sort != null) { SortBuilder[] sr = sort; int shs = sort.length; for(int arr$ = 0; arr$ < shs; ++arr$) { SortBuilder len$ = sr[arr$]; request.addSort(len$); } } SearchResponse var17 = (SearchResponse)request.setPostFilter(filterBuilder).setFrom(from).setSize(size).execute().actionGet(); SearchHit[] var18 = var17.getHits().hits(); SearchHit[] var19 = var18; int var20 = var18.length; for(int i$ = 0; i$ < var20; ++i$) { SearchHit sh = var19[i$]; Map map = sh.getSource(); map.put("_index_id", sh.getId()); list.add(map); } return list; }

 

  1.  

各位一定要注意,所查询字段必须是geo_point类型,否则是无法进行空间查询的,本人开始也犯了这个错误。
如图:我查询的是the_geom 字段,我们可以看到是geo_point 。elasticsearch对GIS数据的支持还是蛮强大的。
  
    

 

转载于:https://www.cnblogs.com/ttsofts/p/4866800.html

你可能感兴趣的文章
校验表单如何摆脱 if else ?
查看>>
Good Bye 2013 A
查看>>
JS敏感信息泄露:不容忽视的WEB漏洞
查看>>
让我们荡起双桨,Android 小船波浪动画
查看>>
ApacheCN 翻译活动进度公告 2019.2.18
查看>>
分布式memcached服务器代理magent安装配置(CentOS6.6)
查看>>
Create Volume 操作(Part III) - 每天5分钟玩转 OpenStack(52)
查看>>
KSImageNamed-Xcode-master
查看>>
tomcat 8.0虚拟机配置文档
查看>>
轻松实现基于Heartbeat的高可用web服务集群
查看>>
pxc群集搭建
查看>>
JS中加载cssText延时
查看>>
常用的脚本编程知识点
查看>>
XILINX_zynq_详解(6)
查看>>
计算机网络术语总结4
查看>>
新手小白 python之路 Day3 (string 常用方法)
查看>>
soapUI的简单使用(webservice接口功能测试)
查看>>
框架 Hibernate
查看>>
python-while循环
查看>>
手机端上传图片及java后台接收和ajaxForm提交
查看>>