Java 批量获取地址间距离工具(支持中转站)

目录
  • 1获取两个地址间距离
  • 2起始点、中转点、终点距离实现
  • 3导出Excel文件
  • 4封装成客户端工具

1获取两个地址间距离

获取两个地址间距离,实现方式比较多,例如基于百度地图api,高德地图api,下面基于高德地图api实现,代码如下:

    private static String getLonLat(String address)throws Exception{
//返回输入地址address的经纬度信息, 格式是 经度,纬度
        String address2 = URLEncoder.encode(address,"UTF-8");
        String queryUrl = "http://restapi.amap.com/v3/geocode/geo?key=aba6ce2149823adf738cdbe6fbb&address="+address2;

        String queryResult = getResponse(queryUrl); //高德接品返回的是JSON格式的字符串
       // System.out.println(address+"//"+queryResult);
        JSONObject jo = new JSONObject().fromObject(queryResult);

        JSONArray ja = jo.getJSONArray("geocodes");

        return new JSONObject().fromObject(ja.getString(0)).get("location").toString();

    }

    private static Long getDistance(String startLonLat, String endLonLat){
//返回起始地startAddr与目的地endAddr之间的距离,单位:米

        Long result = new Long(0);

        String queryUrl = "http://restapi.amap.com/v3/distance?key=aba6ce2149823adf738cdbe6fbb&origins="+startLonLat+"&destination="+endLonLat;

        String queryResult = getResponse(queryUrl);

        JSONObject jo = new JSONObject().fromObject(queryResult);

        JSONArray ja = jo.getJSONArray("results");

        result = Long.parseLong(new JSONObject().fromObject(ja.getString(0)).get("distance").toString());

        return result;

    }

    private static String getResponse(String serverUrl){

        StringBuffer result = new StringBuffer();

        try {
            URL url = new URL(serverUrl);

            URLConnection conn = url.openConnection();

            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            String line;

            while((line = in.readLine()) != null){
                result.append(line);

            }

            in.close();

        } catch (MalformedURLException e) {
            e.printStackTrace();

        } catch (IOException e) {
            e.printStackTrace();

        }

        return result.toString();

    }

2起始点、中转点、终点距离实现

距离支持中转站,代码如下:

    public static Map<String,String> getDis(String start, String middle, String end){
        Map<String,String> map=new Hashtable<String,String>();
        map.put("start",start);
        if(middle!=null){
            map.put("middle",middle);
        }
        map.put("end",end);
        if(start==null||"".equals(start.trim())){
            map.put("distance","起点不能为空");
            return map;
        }
        if(end==null||"".equals(end.trim())){
            map.put("distance","终点不能为空");
            return map;
        }
        Long dis=0l;
        try {
            if(middle==null||"".equals(middle.trim())){//没有中转点
                String startLonLat = getLonLat(start);
                String endLonLat = getLonLat(end);
                dis = getDistance(startLonLat, endLonLat);
                map.put("middle","");
                map.put("distance",dis+"");
            }else{//有中转点
                String startLonLat = getLonLat(start);
                String middleLonLat = getLonLat(middle);
                String endLonLat = getLonLat(end);
                dis = getDistance(startLonLat, middleLonLat);
                dis =dis+ getDistance(middleLonLat, endLonLat);
                map.put("distance",dis+"");
            }

        }catch (Exception e){
            //e.printStackTrace();
            map.put("distance","获取失败");
        }
        //System.out.println(dis);
        return map;
    }

3导出Excel文件

导出Excel文件的默认如下,共四列,包含起始点,途径点,终点以及距离

起始点 途径点 终点 起点到终点距离(米)
北京   石家庄  
北京 天津 石家庄  
浙江省杭州市西湖区   石家庄藁城市  

直接上代码

	public void exportExcel(List<Map<String,String>> resultlist,String exportPath)throws Exception{
		ExportData2Excel excel=new ExportData2Excel();
		HSSFWorkbook workbook = excel.generateWorkbook(resultlist);
		File xlsFile = new File(exportPath);
		if(!xlsFile.exists()){
			xlsFile.createNewFile();
		}
		FileOutputStream xlsStream = new FileOutputStream(xlsFile);
		workbook.write(xlsStream);

		xlsStream.close();
		xlsStream.flush();
	}
	public HSSFWorkbook generateWorkbook(List<Map<String,String>> orderList)
			throws Exception {
		// 声明一个工作薄
		HSSFWorkbook wb = new HSSFWorkbook();
		// 声明一个单子并命名
		HSSFSheet sheet = wb.createSheet("sheet1");
		// 冻结标题(width * height)
		// sheet.createFreezePane(15, 1);
		// 给单子名称一个长度
		sheet.setDefaultColumnWidth((short) 15);
		// 生成一个样式
		HSSFCellStyle style = wb.createCellStyle();
		// 设置表头颜色
		HSSFFont font = wb.createFont();
		font.setColor(HSSFColor.BLUE.index);
		style.setFont(font);
		// 水平布局 居中
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		// 上下居中
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		// 不锁定
		style.setLocked(false);
		// 设置边框
		style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框
		style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
		style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
		style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
		// 创建第一行(也可以称为表头)
		HSSFRow row = sheet.createRow(0);
		// 样式字体居中
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		this.createExcelTitle(row, style);
		int k = 0;
		int orderSize = orderList == null ? 0 : orderList.size();
		for (int i = 0; i < orderSize; i++) {
			k++;
			row = sheet.createRow(k);
			this.addExcelContent(row, orderList.get(i));
			// row.createCell((short) 1).setCellValue(new
			// HSSFRichTextString(StringUtil.isNullObject(orderList.get(i).get("orderId")+"")));
			// System.out.println(orderList.get(i));
		}
		return wb;
	}

	/**
	 *
	 * 功能描述:创建工单title.
	 *
	 */
	private void createExcelTitle(HSSFRow row, HSSFCellStyle style) {
		String[] titles = { "起始点","途径点","终点","起点到终点距离(米)" };
		for (int i = 0; i < titles.length; i++) {
			String title = titles[i];
			// 给表头第一行一次创建单元格
			HSSFCell cell = row.createCell((short) i);
			cell.setCellValue(title);
			cell.setCellStyle(style);
		}
	}

	private void addExcelContent(HSSFRow row, Map<String,String> pageData) {
		String[] fields = { "start","middle", "end" ,"distance"};
		for (int i = 0; i < fields.length; i++) {
			String field = fields[i];
			row.createCell((short) i).setCellValue(
					new HSSFRichTextString(pageData
							.get(field) + ""));
		}
	}

4封装成客户端工具

下面就用JFrame封装,封装后的界面如下:

代码如下

public class AreaUI extends JFrame {
    private JButton btn;
    private JPanel contentPane;    //内容面板
    private JTextField textField;    //文本框
    JButton okBtn ;//地址获取按钮
    public AreaUI() {
        setTitle("批量获取地址间距离工具");    //设置窗体的标题
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    //设置窗体退出时操作
        setBounds(100, 100, 800, 400);    //设置窗体位置和大小

        contentPane = new JPanel();    //创建内容面板
        contentPane.setBorder(new EmptyBorder(100, 5, 5, 5));    //设置面板的边框
        contentPane.setLayout(new BorderLayout(0, 0));    //设置内容面板为边界布局
        setContentPane(contentPane);    //应用内容面板
        JPanel panel1 = new JPanel();    //新建面板用于保存文本框
        panel1.setBounds(5, 100, 800, 100);
        contentPane.add(panel1, BorderLayout.NORTH);    //将面板放置在边界布局的北部
        textField = new JTextField();    //新建文本框
        panel1.add(textField);    //将文本框增加到面板中
        textField.setPreferredSize(new Dimension(400, 40));
        final JButton btn = new JButton("选择文件");
        btn.setPreferredSize(new Dimension(100, 40));
        panel1.add(btn);
        JPanel panel2 = new JPanel();    //新建面板用于保存按钮
        contentPane.add(panel2, BorderLayout.CENTER);    //将面板放置在边界布局的中央
        okBtn = new JButton("批量获取");

        okBtn.setPreferredSize(new Dimension(100, 40));
        panel2.add(okBtn);
        setVisible(true);
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //按钮点击事件
                JFileChooser chooser = new JFileChooser();             //设置选择器
                chooser.setMultiSelectionEnabled(true);             //设为多选
                int returnVal = chooser.showOpenDialog(btn);        //是否打开文件选择框
                if (returnVal == JFileChooser.APPROVE_OPTION) {          //如果符合文件类型
                    String filepath = chooser.getSelectedFile().getAbsolutePath();      //获取绝对路径
                    //System.out.println(filepath);
                    textField.setText(filepath);
                }
            }
        });

        /* 确定点击 */
        okBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                String filepath = textField.getText();
                if ("".equals(filepath) || filepath == null) {
                    JOptionPane.showMessageDialog(getContentPane(), "请先选择文件","警告", JOptionPane.WARNING_MESSAGE);
                    return;
                }

                String suffix = filepath.substring(filepath.lastIndexOf(".") + 1);
                if (!(suffix.equals("xlsx") || (suffix.equals("xls")))) {
                    JOptionPane.showMessageDialog(getContentPane(), "请选择Excel文件","警告", JOptionPane.WARNING_MESSAGE);
                    return;
                }
                File exitFile=new File(filepath);
                if(!exitFile.exists()){
                    JOptionPane.showMessageDialog(getContentPane(), "文件地址不存在","警告", JOptionPane.WARNING_MESSAGE);
                    return;
                }
                try {
                    List<DistanceVO> list =openFile(filepath); /* 打开文件 */
                    if(list==null||list.isEmpty()){
                        JOptionPane.showMessageDialog(getContentPane(), "解析Excel失败","警告", JOptionPane.WARNING_MESSAGE);
                        return;
                    }

                    List<Map<String,String>> pageDataList=new ArrayList<Map<String,String>>();
                    int listSize=list.size();
                    int listIndexNum=0;
                    System.out.println("共需要获取"+listSize+"个");
                    for(DistanceVO distanceVO:list){
                        listIndexNum++;
                        Map<String,String> map=DistanceUtil.getDis(distanceVO.getStart(),distanceVO.getMiddle(),distanceVO.getEnd());
                        pageDataList.add(map);
                        if(listIndexNum%100==0){
                            System.out.println(getCurTime()+"使劲获取中,共"+listSize+"已获取"+listIndexNum+"个");
                        }
                    }
                    System.out.println("地址已全部获取完成……");
                    ExportData2Excel exportData2Excel=new ExportData2Excel();
                    String exportPath="";
                    if (suffix.equals("xlsx")){
                        exportPath=filepath.replaceAll(".xlsx","转化后.xls");
                    }else if(suffix.equals("xls")){
                        exportPath=filepath.replaceAll(".xls","转化后.xls");
                    }
                    exportData2Excel.exportExcel(pageDataList,exportPath);

                    JOptionPane.showMessageDialog(getContentPane(), "获取后文件保存地址:"+exportPath,"提示", JOptionPane.INFORMATION_MESSAGE);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
                okBtn.setText("地址获取");
            }

        });
    }

    /* 打开对应的Excel文件 */
    public List<DistanceVO> openFile(String filepath) throws IOException {
        FileInputStream fileInputStream = new FileInputStream(new File(filepath));
        XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);
        List<DistanceVO> list= queryRows(workbook);
        if(fileInputStream!=null){
            fileInputStream.close();
        }
        return list;
    }

    /* 检索需要信息 */
    public List<DistanceVO> queryRows(XSSFWorkbook workbook) {
        List<DistanceVO> list = new ArrayList<>();
        XSSFSheet sheet = workbook.getSheetAt(0);
        for (int i = 1; i <= sheet.getLastRowNum(); i++) {
            //System.out.println(sheet.getRow(i).getCell(0).getStringCellValue());
            DistanceVO vo=new DistanceVO();
            vo.setStart(sheet.getRow(i).getCell(0).getStringCellValue());
            try {
                vo.setMiddle(sheet.getRow(i).getCell(1).getStringCellValue());
            }catch (Exception e){}
            vo.setEnd(sheet.getRow(i).getCell(2).getStringCellValue());
            list.add(vo);
        }
        return list;
    }

    private String getCurTime(){
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
       return df.format(new Date());
    }
    public static void main(String[] args) {
        AreaUI ui= new AreaUI();
    }

到此这篇关于Java 批量获取地址间距离工具(支持中转站)的文章就介绍到这了,更多相关Java 批量获取地址间距离 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java实现的计算最大下标距离算法示例

    本文实例讲述了Java实现的计算最大下标距离算法.分享给大家供大家参考,具体如下: 题目描述 给定一个整形数组,找出最大下标距离j−i, 当且A[i] < A[j] 和 i < j 解法 复杂度:三次扫描,每次的复杂度O(N) 算法:{5,3,4,0,1,4,1} 找出从第一个元素开始的下降序列{5,3,0} i=3,j=6, j从尾部扫描 初始化,i=3, j=6, A[i]=0 实现代码 public static int maxindexdistance(int A[]) { boole

  • Java实现控制台输出两点间距离

    计算两点之间的距离然后在控制台输出,这个题目还是挺简单的.下面我们来看看具体代码. package com.swift; import java.util.Scanner; public class PToP { public static void main(String[] args) { Scanner scan=new Scanner(System.in); System.out.println("请输入第一个点的坐标值x1"); Double x1=Double.parseD

  • java实现计算地理坐标之间的距离

    java实现计算两经纬度点之间的距离,直接上代码,具体解释请参考注释 复制代码 代码如下: package com.jttx.poi.utils; import com.jttx.poi.entity.Point; /**  * Created by louis on 2014/9/2.  */ public class GeoUtils {     /**      * 计算两经纬度点之间的距离(单位:米)      * @param lng1  经度      * @param lat1 

  • Java滚动数组计算编辑距离操作示例

    本文实例讲述了Java滚动数组计算编辑距离操作.分享给大家供大家参考,具体如下: 编辑距离(Edit Distance),也称Levenshtein距离,是指由一个字符串转换为另一个字符串所需的最少编辑次数. 下面的代码摘自org.apache.commons.lang.StringUtils 用法示例: StringUtils.getLevenshteinDistance(null, *) = IllegalArgumentException StringUtils.getLevenshtei

  • Java通过经纬度坐标获取两个点之间的直线距离的示例

    前言 现在很多App都需要附带着附近人列表功能,所以我在这里实现2个点之间的距离计算 经纬度的获取需要第三方来支持,高德地图.百度地图.... 附近人功能具体的实现逻辑: 1.获取每个人的经纬度坐标,存库记录 2.通过SQL获取指定距离范围内的用户列表(文章的 "二.MySQL中通过经纬度,获取范围内的用户") 3.通过获取到的用户列表,计算自己与用户之间度距离(文章的 "一.JAVA代码实现计算AB两点的直线距离") 一.JAVA代码实现计算AB两点的直线距离 我

  • java计算两点间的距离方法总结

    使用java自带的Point类 import java.awt.Point;//引用awt包下的Point类,此类的功能是表示 (x,y) 坐标空间中的位置的点 public class Distance { public static void main(String[] args) { Point p1 = new Point(5, 6);// 定义第一个点的坐标(5,6) Point p2 = new Point(7,8);// 定义第二个点的坐标(7,8) //定位坐标 System.o

  • Java 批量获取地址间距离工具(支持中转站)

    目录 1获取两个地址间距离 2起始点.中转点.终点距离实现 3导出Excel文件 4封装成客户端工具 1获取两个地址间距离 获取两个地址间距离,实现方式比较多,例如基于百度地图api,高德地图api,下面基于高德地图api实现,代码如下: private static String getLonLat(String address)throws Exception{ //返回输入地址address的经纬度信息, 格式是 经度,纬度 String address2 = URLEncoder.enc

  • Java编程获取经纬度之间距离的方法

    本文实例讲述了Java编程获取经纬度之间距离的方法.分享给大家供大家参考,具体如下: public class GeoUtil { /** * 根据经纬度和距离返回一个矩形范围 * * @param lng * 经度 * @param lat * 纬度 * @param distance * 距离(单位为米) * @return [lng1,lat1, lng2,lat2] 矩形的左下角(lng1,lat1)和右上角(lng2,lat2) */ public static double[] ge

  • 详细Java批量获取微信公众号方法

    最近需要爬取微信公众号的文章信息.在网上找了找发现微信公众号爬取的难点在于公众号文章链接在pc端是打不开的,要用微信的自带浏览器(拿到微信客户端补充的参数,才可以在其它平台打开),这就给爬虫程序造成很大困扰.后来在知乎上看到了一位大牛用php写的微信公众号爬取程序,就直接按大佬的思路整了整搞成java的了.改造途中遇到蛮多细节问题,拿出来分享一下. 系统的基本思路是在安卓模拟器上运行微信,模拟器设置代理,通过代理服务器拦截微信数据,将得到的数据发送给自己的程序进行处理. 需要准备的环境:node

  • java 根据经纬度获取地址实现代码

     java 根据经纬度获取地址实现代码 实现代码: public class GetLocation { public static void main(String[] args) { // lat 39.97646 //log 116.3039 String add = getAdd("116.3039", "39.97646"); JSONObject jsonObject = JSONObject.fromObject(add); JSONArray jso

  • JAVA如何获取客户端IP地址和MAC地址

    本文介绍了JAVA如何获取客户端IP地址和MAC地址 ,分享给大家,具体如下: 1.获取客户端IP地址 public String getIp(HttpServletRequest request) throws Exception { String ip = request.getHeader("X-Forwarded-For"); if (ip != null) { if (!ip.isEmpty() && !"unKnown".equalsIg

  • java如何获取本机IP地址

    本文实例为大家分享了java实现获取本机IP地址的具体代码,供大家参考,具体内容如下 原因:同一台机子上开着两个web工程,现在有需求需要保证两个项目之间交互的安全问题.因为有个旧的项目,所以尽量不做改动.只能在新项目中做改动. 处理办法:获取本地的IP地址,有请求进来时查看请求的来源,只有来源是本地IP的才予以通过. 代码如下: /** * 任务调度调用拦截器 */ public class TaskControlInterceptor implements Interceptor { //存

  • Java 汉字获取拼音或首字母工具类代码分析

    本文主要介绍Java中,将字符串中的中文转化为拼音,获取汉字串拼音首字母,获取汉字串拼音的工具类,以及相关的示例代码. 1.Maven依赖配置(pom.xml) <dependency> <groupId>com.belerweb</groupId> <artifactId>pinyin4j</artifactId> <version>2.5.1</version> </dependency> 2.工具类代码

  • 基于Java解决华为机试实现整数与IP地址间的转换 

    目录 1.简述 示例1 2.代码实现 1.简述 描述: 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成 一个长整数. 举例:一个ip地址为10.0.3.193 每段数字                相对应的二进制数 10                          00001010 0                            00000000 3                            0000

  • Java根据ip地址获取归属地实例详解

    目录 引言 Java 中是如何获取 IP 属地的 首先需要写一个 IP 获取的工具类 内置的三种查询算法 使用方法 项目用到的全部依赖 引言 最近,各大平台都新增了评论区显示发言者ip归属地的功能,例如哔哩哔哩,微博,知乎等等. Java 中是如何获取 IP 属地的 主要分为以下几步 通过 HttpServletRequest 对象,获取用户的 IP 地址 通过 IP 地址,获取对应的省份.城市 首先需要写一个 IP 获取的工具类 因为每一次用户的 Request 请求,都会携带上请求的 IP 

  • JAVA+Struts2获取服务器地址的方法

    本文实例讲述了JAVA+Struts2获取服务器地址的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: HttpServletRequest request=ServletActionContext.getRequest();  String path=request.getRequestURI();  String actionPath=".."+path.substring(9);  //访问服务器所带有的参数信息  String queryInfo=reque

随机推荐