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); 
 | 
    } 
 | 
} 
 |