package com.doumee.core.tsp;
|
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.doumee.core.utils.Constants;
|
import com.doumee.core.utils.HttpsUtil;
|
import com.doumee.dao.business.model.JkCustomer;
|
import com.doumee.dao.business.model.JkSketchCustomer;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
|
import java.math.BigDecimal;
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.Date;
|
|
@Slf4j
|
public class DistanceCalculator {
|
private static final double EARTH_RADIUS = 6371.0; // 地球半径(单位:公里)
|
|
public static void main(String[] args) {
|
//118.363428,31.326485
|
//118.363312,31.326638
|
System.out.println(calculateDistance(39.326638d,116.363312d,31.326606,118.363272));
|
}
|
|
public static DistanceModel calculateDistanceGaode(String urlStr, JkSketchCustomer c1, JkSketchCustomer c2) {
|
DistanceModel r =new DistanceModel();
|
r.setStart(c1);
|
r.setEnd(c2);
|
r.setDistance(0);
|
r.setLocations( new ArrayList<>());
|
try {
|
String url =urlStr.replace("${lat1}", Constants.formatBigdecimalScale(c1.getLatitude(),6)+"")
|
.replace("${lat2}",Constants.formatBigdecimalScale(c2.getLatitude(),6)+"")
|
.replace("${long1}",Constants.formatBigdecimalScale(c1.getLongitude(),6)+"")
|
.replace("${long2}",Constants.formatBigdecimalScale(c2.getLongitude(),6)+"");
|
String result = HttpsUtil.get(url ,true);
|
JSONObject json = JSONObject.parseObject(result);
|
if(json!=null
|
&& json.getInteger("status")!=null
|
&& json.getInteger("status") ==1
|
&& json.getJSONObject("route")!=null
|
&& json.getJSONObject("route").getJSONArray("paths") !=null
|
&& json.getJSONObject("route").getJSONArray("paths") .size()>0 ){
|
JSONArray array = json.getJSONObject("route").getJSONArray("paths");
|
JSONObject model = array.getJSONObject(0);//取第一个
|
Long distance = Long.parseLong(model.getString("distance"));
|
r.setDistance(distance*1000);
|
JSONArray steps = model.getJSONArray("steps");
|
String tl = "";
|
if(steps!=null && steps.size()>0){
|
for (int i = 0; i < steps.size(); i++) {
|
if(StringUtils.isBlank(steps.getJSONObject(i).getString("polyline" ))){
|
continue;
|
}
|
if(!tl.equals("") &&!tl.endsWith(";")){
|
tl += ";";
|
}
|
tl+= steps.getJSONObject(i).getString("polyline" );
|
}
|
}
|
r.setLocations(Arrays.asList(tl.split(";")));
|
}else{
|
log.error("获取交通规划线路信息成功==============");
|
}
|
}catch (Exception e){
|
log.error("获取交通规划线路信息成功=====失败==========");
|
}
|
|
return r ;
|
}
|
|
private BigDecimal getDecimalByVal(String val) {
|
try {
|
return new BigDecimal(val);
|
}catch (Exception e){
|
|
}
|
return null;
|
}
|
public static long calculateDistance (double lat1, double lon1, double lat2, double lon2) {
|
double dLat = Math.toRadians(lat2 - lat1);
|
double dLon = Math.toRadians(lon2 - lon1);
|
|
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
|
Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
|
Math.sin(dLon / 2) * Math.sin(dLon / 2);
|
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
return (long) (EARTH_RADIUS * c * 1000);
|
}
|
}
|