Java 批量獲取地址間距離工具(支持中轉(zhuǎn)站)
1獲取兩個地址間距離
獲取兩個地址間距離,實(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+"http://"+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 { // 聲明一個工作薄 HSSFWorkbook wb = new HSSFWorkbook(); // 聲明一個單子并命名 HSSFSheet sheet = wb.createSheet("sheet1"); // 凍結(jié)標(biāo)題(width * height) // sheet.createFreezePane(15, 1); // 給單子名稱一個長度 sheet.setDefaultColumnWidth((short) 15); // 生成一個樣式 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(); //獲取絕對路徑 //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(), "請先選擇文件","警告", 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","轉(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("地址獲取"); } }); } /* 打開對應(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 實(shí)現(xiàn)約瑟夫環(huán)的實(shí)例代碼
這一次是借鑒模仿別人寫的代碼,以前覺得不好將數(shù)據(jù)結(jié)構(gòu)的鏈結(jié)構(gòu)什么的遷移到j(luò)ava上來使用,但這一次確實(shí)讓我感受到了可以自己構(gòu)造數(shù)據(jù)結(jié)構(gòu),然后使用類似鏈的方式來解決約瑟夫環(huán),有所頓悟。不多說,繼續(xù)上代碼2013-10-10spring整合JMS實(shí)現(xiàn)同步收發(fā)消息(基于ActiveMQ的實(shí)現(xiàn))
本篇文章主要介紹了spring整合JMS實(shí)現(xiàn)同步收發(fā)消息(基于ActiveMQ的實(shí)現(xiàn)),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Java/Spring項(xiàng)目的包開頭為什么是com詳解
這篇文章主要介紹了Java/Spring項(xiàng)目的包開頭為什么是com的相關(guān)資料,在Java中包命名遵循域名反轉(zhuǎn)規(guī)則,即使用公司的域名反轉(zhuǎn)作為包的前綴,以確保其全球唯一性和避免命名沖突,這種規(guī)則有助于邏輯分層、代碼可讀性提升和標(biāo)識代碼來源,需要的朋友可以參考下2024-10-10Spring IOC簡單理解及創(chuàng)建對象的方式
這篇文章主要介紹了Spring IOC簡單理解及創(chuàng)建對象的方式,本文通過兩種方式給大家介紹創(chuàng)建對象的方法,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09Idea導(dǎo)入多個maven項(xiàng)目到同一目錄下的方法示例
這篇文章主要介紹了Idea導(dǎo)入多個maven項(xiàng)目到同一目錄下,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07