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 ListgetCarInfo(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 ListsearchDeviceLocation(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; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)