| 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 DistanceCustomerModel calculateDistanceGaode(String urlStr, JkCustomer c1, JkCustomer c2) { | 
|         DistanceCustomerModel r =new DistanceCustomerModel(); | 
|         r.setStart(c1); | 
|         r.setEnd(c2); | 
|         r.setDistance(0); | 
|         r.setCode(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); | 
|                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.setPolyline(tl); | 
|                r.setLocations(Arrays.asList(tl.split(";"))); | 
|                r.setCode(1); | 
|                log.error("获取交通规划线路信息成功=============="); | 
|             }else{ | 
|                 log.error("获取交通规划线路信息成功=====失败!!========="); | 
|             } | 
|         }catch (Exception e){ | 
|             log.error("获取交通规划线路信息成功=====失败=========="); | 
|         } | 
|   | 
|         return r ; | 
|     } | 
|     public static DistanceModel calculateDistanceGaode(String urlStr, JkSketchCustomer c1, JkSketchCustomer c2) { | 
|         DistanceModel r =new DistanceModel(); | 
|         r.setStart(c1); | 
|         r.setEnd(c2); | 
|         r.setDistance(0); | 
|         r.setCode(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); | 
|                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.setPolyline(tl); | 
|                r.setLocations(Arrays.asList(tl.split(";"))); | 
|                r.setCode(1); | 
|                log.error("获取交通规划线路信息成功=============="); | 
|             }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); | 
|     } | 
| } |