Skip to content

Latest commit

 

History

History
128 lines (92 loc) · 6.48 KB

V24_PointMap.md

File metadata and controls

128 lines (92 loc) · 6.48 KB

Mapping Youbike Location

這個練習的目標是讀取台北市Youbike2.0的站台資料,並繪製點位圖來標記站台滿車或缺車的情形。

以下這段程式碼是用於從台北市政府提供的YouBike實時數據API取得資料,並將其轉換為R語言中的資料框架(data frame)格式,最後選擇資料框架的前六個變數來展示。步驟如下:

  1. 載入httrjsonlite套件:這兩個套件在R中常用於處理HTTP請求和JSON資料。httr套件用於發送網路請求,而jsonlite套件則用於解析JSON格式的資料。

  2. 設定URL:將url變數設為指向台北市政府提供的YouBike實時數據API的網址。

  3. 使用GET函數發送請求:透過httr套件的GET函數向設定的URL發送HTTP GET請求,以取得YouBike的實時數據。

  4. 解析JSON資料:使用jsonlite套件的fromJSON函數,將從API獲取到的JSON格式資料解析成R的資料框架。content函數用於獲取HTTP回傳的內容,並指定內容格式為"text",編碼方式為"utf-8",以確保中文等非ASCII字符能正確顯示。

  5. 要注意的欄位名稱包含sna(站台名稱)、tot(總車格數)、sbi(現有車數)與lat-lng的經緯度資料。

library(httr)
library(jsonlite)
url <- "https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json"
ubike.df <- fromJSON(content(GET(url),"text", encoding = "utf-8"))
head(ubike.df) %>% select(1:6)
##         sno                            sna tot sbi  sarea                mday
## 1 500101001      YouBike2.0_捷運科技大樓站  28   1 大安區 2024-03-31 23:09:14
## 2 500101002 YouBike2.0_復興南路二段273號前  21   1 大安區 2024-03-31 23:02:18
## 3 500101003  YouBike2.0_國北教大實小東側門  16  14 大安區 2024-03-31 22:26:18
## 4 500101004        YouBike2.0_和平公園東側  11  11 大安區 2024-03-31 23:01:14
## 5 500101005  YouBike2.0_辛亥復興路口西北側  16  11 大安區 2024-03-31 22:50:25
## 6 500101006 YouBike2.0_復興南路二段280號前  11   8 大安區 2024-03-31 22:46:18

Creating a new variable

  • 為每個站產生一個sbi除以tot的新變數,來作為ubike站滿不滿的計量單位。
  • 這段程式碼是在前一步的基礎上進一步創建新的 Fullness 欄位。該欄位的值根據 ratio 欄位的數值判斷,若 ratio 大於等於 0.9,則將 Fullness 設置為 "Full";若 ratio 小於 0.3,則設置為 "Empty";否則設置為 "Available"。

if_else 函數的用法如下:

if_else(condition, true_value, false_value)
  • condition:一個邏輯向量,用於指定條件判斷。
  • true_value:當 condition 為真時,返回的值。
  • false_value:當 condition 為假時,返回的值。

if_else 函數與 R 原生的 ifelse 函數相似,但有一些重要區別。if_else 函數在處理缺失值時更加嚴格,要求 true_valuefalse_value 具有相同的長度和類型,這有助於避免一些潛在的錯誤。

# ratio <- sbi/tot
ubike.df <- ubike.df %>%
  mutate(ratio = sbi/tot) %>%
  mutate(Fullness = if_else(ratio >= 0.9, "Full", if_else(ratio < 0.3, "Empty", "Available")))

Mapping with sf

library(ggplot2)
library(sf)

sf_tpe <-
  st_read(dsn = "data/111年9月行政區人口統計_鄉鎮市區_臺北市_SHP/", 
          layer = "111年9月行政區人口統計_鄉鎮市區", quiet = T) %>%
  mutate(across(where(is.character), ~iconv(., from = "BIG5", to = "UTF8"))) %>%
  mutate(across(where(is.double), ~if_else(is.na(.),as.double(0),.))) %>%
  st_set_crs(3826) %>% st_transform(4326) %>%
  filter(COUNTY == "臺北市")

sf_tpe %>% head()
## Simple feature collection with 6 features and 9 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 121.5041 ymin: 25.00776 xmax: 121.592 ymax: 25.09241
## Geodetic CRS:  WGS 84
##    TOWN_ID   TOWN COUNTY_ID COUNTY  H_CNT  P_CNT  M_CNT  F_CNT INFO_TIME
## 1 63000010 松山區     63000 臺北市  78977 187552  87625  99927   111Y09M
## 2 63000020 信義區     63000 臺北市  87407 201951  95884 106067   111Y09M
## 3 63000030 大安區     63000 臺北市 117243 280332 130596 149736   111Y09M
## 4 63000040 中山區     63000 臺北市  98825 210156  97114 113042   111Y09M
## 5 63000050 中正區     63000 臺北市  64491 146628  69663  76965   111Y09M
## 6 63000060 大同區     63000 臺北市  51988 118065  57003  61062   111Y09M
##                         geometry
## 1 MULTIPOLYGON (((121.572 25....
## 2 MULTIPOLYGON (((121.5727 25...
## 3 MULTIPOLYGON (((121.541 25....
## 4 MULTIPOLYGON (((121.5522 25...
## 5 MULTIPOLYGON (((121.5174 25...
## 6 MULTIPOLYGON (((121.5176 25...
library(sf)
library(ggplot2)
library(dplyr)

# 你已經有ubike.sf,這是一個sf物件
ubike.sf <- st_as_sf(ubike.df, coords = c("lng", "lat"), crs = 4326)

# 使用ggplot繪製地圖和位置點,並根據fullness的值上色
ggplot() + 
  geom_sf(data = sf_tpe) +  # 繪製sf_tpe區域
  geom_sf(data = ubike.sf, aes(color = Fullness, size=tot), alpha=0.3) +
  scale_color_manual(values = c("Full" = "black", "Empty" = "red", "Available" = "blue")) + 
  theme_void()

Using ggmap (Deprecated)

  • 首先要設定google map的參數,先打開google map,縮放到你等一下希望看到的地圖底圖範圍後,複製新的網址列如https://www.google.com.tw/maps/@25.0353215,121.4916909,12.62z。這個網址後面的參數包含著經緯度(25.0353215,121.4916909)和地圖的縮放程度(12.62z)。因此你可以把他貼到get_googlemap()的函式中。除此之外,尚可以指定地圖種類,自行查詢help(maptype can be terrain, roadmap, satellite, hybrid, or toner-lite)。

  • 接下來要用geom_point()這個ggplot2的函式繪製點圖,一共包含四個參數,用data指定資料集、用aes()指定x、y軸、用colour指定顏色、用size指定圓圈的大小。這邊我用圓圈的大小來表示總車格數,所以是ubike.df$tot,但如果是原始的tot數值可能畫起來會太大,這時後就必須要自行反覆嘗試,看看要取log()或者取sqrt()或者除以某個數值,好讓畫出來的點為適合觀看的大小。最後我多加了一個參數alpha讓圈圈半透明。