设为首页 加入收藏

TOP

elasticsearch GIS空间查询问题解决
2015-11-21 01:36:42 来源: 作者: 【 】 浏览:0
Tags:elasticsearch GIS 空间 查询 问题 解决
在GIS行业的应用越来越广泛,GIS最常用根据区域进行空间数据查询
?
我定义了两个方法,一起来看一下:
    /**

* 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;

    }

?

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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇ocp-393 下一篇ocp-516

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: