---
# System prepended metadata

title: 取得桃園UBike即時資訊
tags: [topic, java, ubike]

---

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

   