zoukankan      html  css  js  c++  java
  • elasticsearch GIS空间查询问题解决

         在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<Map<String, Object>> 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数据的支持还是蛮强大的。
      
        
  • 相关阅读:
    github新手使用指南
    Nacos(五):多环境下如何“读取”Nacos中相应的配置
    Nacos(四):SpringCloud项目中接入Nacos作为配置中心
    Nacos:Nacos与OpenFeign的对接使用
    解决IDEA的maven项目 添加依赖后Reimport无反应
    SpringCloud项目中接入Nacos作为注册中心
    Nacos 使用
    SpringCloud教程 | 第十三篇: 断路器聚合监控(Hystrix Turbine)
    C# Task总结(Action,Func,委托)
    C# Task总结(异步操作+并行)
  • 原文地址:https://www.cnblogs.com/ttsofts/p/4866800.html
Copyright © 2011-2022 走看看