Java 批量獲取地址間距離工具(支持中轉(zhuǎn)站)
獲取兩個(gè)地址間距離,實(shí)現(xiàn)方式比較多,例如基于百度地圖api,高德地圖api,下面基于高德地圖api實(shí)現(xiàn),代碼如下:
private static String getLonLat(String address)throws Exception{//返回輸入地址address的經(jīng)緯度信息, 格式是 經(jīng)度,緯度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起始點(diǎn)、中轉(zhuǎn)點(diǎn)、終點(diǎn)距離實(shí)現(xiàn)
距離支持中轉(zhuǎn)站,代碼如下:
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','起點(diǎn)不能為空'); return map;}if(end==null||''.equals(end.trim())){ map.put('distance','終點(diǎn)不能為空'); return map;}Long dis=0l;try { if(middle==null||''.equals(middle.trim())){//沒有中轉(zhuǎn)點(diǎn)String startLonLat = getLonLat(start);String endLonLat = getLonLat(end);dis = getDistance(startLonLat, endLonLat);map.put('middle','');map.put('distance',dis+''); }else{//有中轉(zhuǎn)點(diǎn)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導(dǎo)出Excel文件
導(dǎo)出Excel文件的默認(rèn)如下,共四列,包含起始點(diǎn),途徑點(diǎn),終點(diǎn)以及距離
起始點(diǎn) 途徑點(diǎn) 終點(diǎn) 起點(diǎn)到終點(diǎn)距離(米) 北京 石家莊 北京 天津 石家莊 浙江省杭州市西湖區(qū) 石家莊藁城市
直接上代碼
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 {// 聲明一個(gè)工作薄HSSFWorkbook wb = new HSSFWorkbook();// 聲明一個(gè)單子并命名HSSFSheet sheet = wb.createSheet('sheet1');// 凍結(jié)標(biāo)題(width * height)// sheet.createFreezePane(15, 1);// 給單子名稱一個(gè)長(zhǎng)度sheet.setDefaultColumnWidth((short) 15);// 生成一個(gè)樣式HSSFCellStyle style = wb.createCellStyle();// 設(shè)置表頭顏色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);// 設(shè)置邊框style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下邊框style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左邊框style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上邊框style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右邊框// 創(chuàng)建第一行(也可以稱為表頭)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;} /** * * 功能描述:創(chuàng)建工單title. * */private void createExcelTitle(HSSFRow row, HSSFCellStyle style) {String[] titles = { '起始點(diǎn)','途徑點(diǎn)','終點(diǎn)','起點(diǎn)到終點(diǎn)距離(米)' };for (int i = 0; i < titles.length; i++) {String title = titles[i];// 給表頭第一行一次創(chuàng)建單元格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; //內(nèi)容面板 private JTextField textField; //文本框 JButton okBtn ;//地址獲取按鈕 public AreaUI() {setTitle('批量獲取地址間距離工具'); //設(shè)置窗體的標(biāo)題setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //設(shè)置窗體退出時(shí)操作setBounds(100, 100, 800, 400); //設(shè)置窗體位置和大小 contentPane = new JPanel(); //創(chuàng)建內(nèi)容面板contentPane.setBorder(new EmptyBorder(100, 5, 5, 5)); //設(shè)置面板的邊框contentPane.setLayout(new BorderLayout(0, 0)); //設(shè)置內(nèi)容面板為邊界布局setContentPane(contentPane); //應(yīng)用內(nèi)容面板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) {//按鈕點(diǎn)擊事件JFileChooser chooser = new JFileChooser(); //設(shè)置選擇器chooser.setMultiSelectionEnabled(true); //設(shè)為多選int returnVal = chooser.showOpenDialog(btn);//是否打開文件選擇框if (returnVal == JFileChooser.APPROVE_OPTION) { //如果符合文件類型 String filepath = chooser.getSelectedFile().getAbsolutePath(); //獲取絕對(duì)路徑 //System.out.println(filepath); textField.setText(filepath);} }}); /* 確定點(diǎn)擊 */okBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String filepath = textField.getText();if (''.equals(filepath) || filepath == null) { JOptionPane.showMessageDialog(getContentPane(), '請(qǐng)先選擇文件','警告', JOptionPane.WARNING_MESSAGE); return;} String suffix = filepath.substring(filepath.lastIndexOf('.') + 1);if (!(suffix.equals('xlsx') || (suffix.equals('xls')))) { JOptionPane.showMessageDialog(getContentPane(), '請(qǐng)選擇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+'個(gè)'); 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+'個(gè)');} } System.out.println('地址已全部獲取完成……'); ExportData2Excel exportData2Excel=new ExportData2Excel(); String exportPath=''; if (suffix.equals('xlsx')){exportPath=filepath.replaceAll('.xlsx','轉(zhuǎn)化后.xls'); }else if(suffix.equals('xls')){exportPath=filepath.replaceAll('.xls','轉(zhuǎn)化后.xls'); } exportData2Excel.exportExcel(pageDataList,exportPath); JOptionPane.showMessageDialog(getContentPane(), '獲取后文件保存地址:'+exportPath,'提示', JOptionPane.INFORMATION_MESSAGE);} catch (Exception e1) { e1.printStackTrace();}okBtn.setText('地址獲取'); } }); } /* 打開對(duì)應(yīng)的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');//設(shè)置日期格式 return df.format(new Date()); } public static void main(String[] args) {AreaUI ui= new AreaUI(); }
到此這篇關(guān)于Java 批量獲取地址間距離工具(支持中轉(zhuǎn)站)的文章就介紹到這了,更多相關(guān)Java 批量獲取地址間距離 內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. .Net Core和RabbitMQ限制循環(huán)消費(fèi)的方法2. jsp網(wǎng)頁實(shí)現(xiàn)貪吃蛇小游戲3. asp(vbs)Rs.Open和Conn.Execute的詳解和區(qū)別及&H0001的說明4. ASP.NET MVC遍歷驗(yàn)證ModelState的錯(cuò)誤信息5. 用css截取字符的幾種方法詳解(css排版隱藏溢出文本)6. ASP 信息提示函數(shù)并作返回或者轉(zhuǎn)向7. asp中response.write("中文")或者js中文亂碼問題8. PHP設(shè)計(jì)模式中工廠模式深入詳解9. CSS hack用法案例詳解10. 將properties文件的配置設(shè)置為整個(gè)Web應(yīng)用的全局變量實(shí)現(xiàn)方法
