package com.xiaopeng.map.utils;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.xiaopeng.api.dto.operation.LonLatDto;
|
import com.xiaopeng.api.vo.operation.RouteVo;
|
import com.xiaopeng.common.core.utils.HttpUtils;
|
import com.xiaopeng.map.mangodb.service.XpGeoFencingPolygonService;
|
import com.xiaopeng.map.utils.mangoUtils.MongoGeoFenceUtil;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.context.annotation.Lazy;
|
import org.springframework.stereotype.Component;
|
import org.springframework.web.client.RestTemplate;
|
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* 高德地图的地理编码工具类
|
*/
|
@Component
|
@Lazy
|
public class GDMapGeocodingUtil {
|
|
private String key = "66ae577f63898dae3016d599fda57221";
|
|
@Autowired
|
private RestTemplate restTemplate;
|
|
@Autowired
|
private XpGeoFencingPolygonService xpGeoFencingPolygonService;
|
|
|
/**
|
* 根据起始点获取驾车距离 和 时间 以及避让区域
|
*
|
* @param start 起点
|
* @param end 终点
|
* @param avoidRoads 避让点
|
* @param fenceId mango id
|
* @param routePlanRule 线路规划规则
|
*
|
* @return
|
* @throws Exception
|
*/
|
public RouteVo getDistanceAndTime(LonLatDto start, LonLatDto end,String avoidRoads,String fenceId,Integer routePlanRule) {
|
RouteVo routeVo = new RouteVo();
|
|
String url = "https://tsapi.amap.com/v1/route/price?key=" + key + "&extensions=all&start=" + start.getLongitude() + "," + start.getLatitude();
|
HashMap<String, Object> params = new HashMap<>();
|
params.put("extensions", "all");
|
params.put("start", start.getLongitude() + "," + start.getLatitude());
|
params.put("end", end.getLongitude() + "," + end.getLatitude());
|
params.put("routeUserType",2);
|
if(avoidRoads!=null && !avoidRoads.isEmpty()){
|
params.put("voidPolygons", avoidRoads);
|
}
|
if(routePlanRule!=null){
|
params.put("strategy", routePlanRule);
|
}
|
|
String post = HttpUtils.post(url, JSON.toJSONString(params));
|
System.out.println("高德地图返回结果:"+ post);
|
// String forObject = restTemplate.getForObject(url, String.class, params);
|
JSONObject jsonObject = JSON.parseObject(post);
|
String data = jsonObject.getString("data");
|
|
JSONObject jsonObject1 = JSON.parseObject(data);
|
String routeID = jsonObject1.getString("routeID");
|
JSONArray path = jsonObject1.getJSONArray("paths");
|
for (Object o : path) {
|
JSONObject jsonObject2 = (JSONObject) o;
|
|
String points = jsonObject2.getString("points");
|
String[] split = points.split(";");
|
int temp=0;
|
// 取5分之一的点位
|
for (int i = 0; i < split.length; i++) {
|
if (i % 5 == 0) {
|
String[] split1 = split[i].split(",");
|
LonLatDto lonLatDto = new LonLatDto(Double.parseDouble(split1[0]), Double.parseDouble(split1[1]));
|
if (!xpGeoFencingPolygonService.isInFence(lonLatDto.getLongitude(), lonLatDto.getLatitude(), fenceId, "operating_area")) {
|
temp++;
|
break;
|
}
|
}
|
}
|
if(temp==0){
|
Integer costTime = jsonObject2.getInteger("costTime");
|
Integer distance = jsonObject2.getInteger("distance");
|
routeVo.setDistance(distance);
|
routeVo.setDuration(costTime);
|
ArrayList<LonLatDto> lonLatDtos = new ArrayList<>(split.length);
|
for (String s : split) {
|
String[] split1 = s.split(",");
|
LonLatDto lonLatDto = new LonLatDto(Double.parseDouble(split1[0]), Double.parseDouble(split1[1]));
|
lonLatDtos.add(lonLatDto);
|
}
|
routeVo.setPolyline(lonLatDtos);
|
routeVo.setRouteID(routeID);
|
return routeVo;
|
}
|
}
|
|
return null;
|
|
}
|
|
|
/**
|
* 线路还原接口
|
* 车端使用的数据
|
* @param routeID
|
* @return
|
*/
|
public String routed(String routeID){
|
String url = "https://tsapi.amap.com/v1/route/query/routeid?key=" + key;
|
HashMap<String, Object> params = new HashMap<>();
|
params.put("routeID", routeID);
|
params.put("sdkVersion", "");
|
params.put("encoderVersion", "5.1");
|
String post = HttpUtils.post(url, JSON.toJSONString(params));
|
System.out.println("高德地图返回结果:"+ post);
|
JSONObject jsonObject = JSON.parseObject(post);
|
return jsonObject.getString("data");
|
}
|
|
}
|