基于ES实现车辆经纬度的搜索

基于ES实现车辆经纬度的搜索,第1张

基于ES实现车辆纬度的搜索

1.地理位置不能动态映射自动检测,需要显式声明对应字段类型为geo-point

需要显示指定location的类型为geo_point
经纬度在ES中的保存的形式可以是字符串(前面的值是纬度,后面的值是经度)、对象(前面的值是纬度,后面的值是经度) 或者数组(前面的值是经度,后面的值是纬度)。

GPS的表结构

2.es使用
2.1 es地理位置实现
地理距离过滤器(geo_distance)以给定位置为圆心画一个圆,来找出那些地理坐标落在其中的文档。

“distince”:“1km”:找出所有与指定距离在1km内的location字段
中心点可以表示为字符串,数组或者对象
2.2代码实现
2.2.1 搜索一定距离内车辆列表

 public List getCarInfo(Double lat,Double lon,Integer distance){
        //按范围查询车辆
        List cartLocationList = esReposity.searchDeviceLocation(lat, lon, distance);
        //查询车辆详情
        List cartFullInfoVOList=new ArrayList<>();
        cartLocationList.forEach(cartLocation -> {
            CartFullInfoVO cartFullInfoVO=new CartFullInfoVO();
            cartFullInfoVO.setId(cartLocation.getId());
            cartFullInfoVO.setLocation(cartLocation.getLocation());//坐标
            //车辆垃圾类型 收运企业等其他信息
            CarVO carVO=esReposity.findById(cartLocation.getId());
            if(carVO==null){
                cartFullInfoVO.setOnline(false);
            }else{
                cartFullInfoVO.setOnline(carVO.getOnline());

            }
            cartFullInfoVOList.add(cartFullInfoVO);
        });
        return cartFullInfoVOList;
    }
 
   public List searchDeviceLocation(Double lat, Double lon, Integer distance){
       //构建查询
       SearchRequest searchRequest=new SearchRequest("cargps");
       SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
       //中心点及半径构建
       GeoDistanceQueryBuilder geoDistanceQueryBuilder=new GeoDistanceQueryBuilder("location");
       geoDistanceQueryBuilder.distance(distance, DistanceUnit.KILOMETERS);//公里
       geoDistanceQueryBuilder.point(lat,lon);
       searchSourceBuilder.query(geoDistanceQueryBuilder);
       //构建排序
       GeoDistanceSortBuilder distanceSortBuilder=new GeoDistanceSortBuilder("location",lat,lon);
       distanceSortBuilder.unit(DistanceUnit.KILOMETERS);//单位
       distanceSortBuilder.order(SortOrder.ASC);//SortOrder.ASC 升序(由近到远)
       distanceSortBuilder.geoDistance(GeoDistance.ARC);//指定排序的算法  GeoDistance.ARC 精准度高,计算较慢
       searchSourceBuilder.sort(distanceSortBuilder);
       //只查询前200条记录
       searchSourceBuilder.from(0);
       searchSourceBuilder.size(200);
       searchRequest.source(searchSourceBuilder);
       //封装结果
       SearchResponse searchResponse=restHightLevelClient.search(searchRequest,RequestOptions.DEFAULT);
       SearchHits hits = searchResponse.getHits();
       if(hits.getTotalHits()<=0){
           return new ArrayList<>();
       }
       List deviceLocationList=new ArrayList<>();
       Arrays.stream( hits.getHits()).forEach(h->{
           CartLocation deviceLocation=new CartLocation();
           deviceLocation.setId(h.getId());
           deviceLocation.setLocation(h.getSourceAsMap().get("location").toString());
           deviceLocationList.add(deviceLocation);
       });
       return deviceLocationList;
   }
					
										


					

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5688272.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存