# 取得桃園UBike即時資訊 ###### tags: `java` `ubike` `topic` ## 簡介 要取得UBike資訊,需要透過「桃園開放資料」網站來取得,其網址如下: https://data.tycg.gov.tw/opendata/datalist/datasetMeta?oid=5ca2bfc7-9ace-4719-88ae-4034b9a5a55c 進入API(應用程式介面:Application Program Interface)網頁後,會看到其提供三種格式: - JSON:https://data.tycg.gov.tw/api/v1/rest/datastore/a1b4714b-3b75-4ff8-a8f2-cc377e4eaa0f?format=json&limit=1000 - CSV:https://data.tycg.gov.tw/api/v1/rest/datastore/a1b4714b-3b75-4ff8-a8f2-cc377e4eaa0f?format=csv&limit=1000 - XML:https://data.tycg.gov.tw/api/v1/rest/datastore/a1b4714b-3b75-4ff8-a8f2-cc377e4eaa0f?format=xml&limit=1000 > **備註:** > > 此範例會選用CSV格式。 #### 資料欄位說明 |索引|欄位名稱|說明| |-|-|-| |0|sareaen|行政區英文名| |1|sarea|行政區中文名| |2|lng|經度| |3|sna|中文站名| |4|snaen|英文站名| |5|bemp|空位數量| |6|ar|中文地址| |7|act|全站禁用狀態(0:禁用、1:啟用)| |8|sno|站編號| |9|aren|英文地址| |10|tot|場站總停車格| |11|_id|資料編號| |12|sbi|場站目前車輛數量| |13|mday|微笑單車各場站來源資料更新時間| |14|lat|緯度| > **資料來源:** > > https://data.gov.tw/dataset/137993 ## 程式架構 #### 流程 1. 使用網址來建立URL物件。 2. 使用HttpURLConnection物件來連線到目的網頁讀取資料。 3. 判斷連線使否成功(Status Code須為200)。 4. 讓使用者輸入搜尋關鍵字。 5. 遍歷所有找到的資料。 6. 在遍歷的資料中尋找站名使否存在。 7. 顯示結果。 ## 套件 ##### 使用到的Java第三方套件 OpenCSV: https://sourceforge.net/projects/opencsv/ Apache common-lang3: https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.12.0 > **備註** > > Apache common-lang為OpenCSV的依賴套件 > **提示** > > 將下載的jar檔複製到專案中的lib目錄下即可。 > **注意** > > 套件名稱不可以有符號,例如:「-」等等。 ## 程式 #### 完整程式碼 ```java= import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import com.opencsv.CSVReader; public class App { public static void main(String[] args) throws Exception { // 要下載的csv網址 final String ubikeUrlString = "https://data.tycg.gov.tw/api/v1/rest/datastore/a1b4714b-3b75-4ff8-a8f2-cc377e4eaa0f?format=csv&limit=1000"; // 建立URL物件 URL ubikeUrl = new URL(ubikeUrlString); // 透過HttpURLConnection開始連線 HttpURLConnection connection = (HttpURLConnection)ubikeUrl.openConnection(); // 判斷連線使否成功(HTTP回應碼為200) if (connection.getResponseCode() == 200) { // 取得連線的stream並建立stream reader InputStreamReader isr = new InputStreamReader(connection.getInputStream()); // 將stream reader傳給CSVReader CSVReader csvReader = new CSVReader(isr); csvReader.readNext(); // 讀出不需要的標題 // 暫存每一筆資料用 String[] row = null; // 存放全部資料筆數用 int count = 0; // 存放符合條件的資料筆數用 int findCount = 0; BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); System.out.println("桃園市UBike資訊搜尋系統"); System.out.println("------------------------"); System.out.print("請輸入要搜尋的UBike站名: "); // 讀取使用者輸入的搜尋條件 String userInput = bf.readLine(); // 遍歷CSV資料 while ((row = csvReader.readNext()) != null) { // 測試顯示每一筆資料用 // System.out.println(Arrays.toString(row) + line.length); count++; // 過濾資料 if(row[3].indexOf(userInput) != -1) { System.out.printf("站名: %s, 地址: %s\n", row[3], row[6]); System.out.printf(" - 可借: %s\n", row[12]); System.out.printf(" - 可還: %s\n", row[5]); System.out.printf(" - 總數: %s\n\n", row[10]); findCount++; } } // 關閉CSVReader,檔案相關操作,都需要做close動作 csvReader.close(); System.out.printf("桃園市UBike OpenData總共有%d筆資料, 共找到%d比符合條件資料.\n", count, findCount); } } } ``` #### 執行範例 ``` 請輸入要尋找的UBike廠站名稱:火車站 站名:中壢火車站(前站), 地址: 中和路109號空地 - 可借: 4 - 可還: 75 站名:中壢火車站(後站), 地址: 新興路68-94號對面人行道 - 可借: 12 - 可還: 31 站名:桃園火車站(後站), 地址: 延平路26號對面人行道 - 可借: 23 - 可還: 66 站名:桃園火車站(前站), 地址: 中正路1號面火車站右方人行道 - 可借: 42 - 可還: 57 ``` #### 延伸練習 1. 嘗試在查詢結果中加上顯示「該Ubike站腳踏車總量的資訊」 例如: ``` 請輸入要尋找的UBike廠站名稱:火車站 站名:中壢火車站(前站), 地址: 中和路109號空地 - 可借: 46 - 可還: 34 - 總數: 94 站名:中壢火車站(後站), 地址: 新興路68-94號對面人行道 - 可借: 10 - 可還: 95 - 總數: 106 站名:桃園火車站(後站), 地址: 延平路26號對面人行道 - 可借: 33 - 可還: 34 - 總數: 70 站名:桃園火車站(前站), 地址: 中正路1號面火車站右方人行道 - 可借: 0 - 可還: 64 - 總數: 66 ```