# 取得桃園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
```