栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

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

基于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;
   }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/687758.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号