rm(list = ls())
library(readxl)
library(dplyr)
library(sf)
library(ggplot2)
library(tidyverse)
library(tmap)
library(pals)
library(cartography)
library(RColorBrewer)
library(reshape2)
library(grid)
library(units)
library(tidyr)
library(aspace)
library(spatstat)
library(spdep)
library(readr)
school_sf=st_read("C:/Users/User/Desktop/邱冠瑋/台大/大二下/空間分析/期末/SCHOOL/SCHOOL.shp",options="ENCODING=BIG5",quiet=T)
tpe_sf=st_read("C:/Users/User/Desktop/邱冠瑋/台大/大二下/空間分析/期末/Taipei_vill/Taipei_Vill.shp",options="ENCODING=BIG5",quiet=T)
# 讀檔:指定中文 BIG5 編碼 + 完整路徑
accident <- read.csv("C:/Users/User/Desktop/邱冠瑋/台大/大二下/空間分析/期末/113年臺北市道路交通事故斑點圖.csv",fileEncoding = "BIG5")
# 轉為 sf 點資料
accident_sf <- st_as_sf(accident, coords = c("座標.X", "座標.Y"), crs = 4326)
school_sf <- st_transform(school_sf, 3826)
accident_sf <- st_transform(accident_sf, 3826)
# 1. 建立 500 公尺 buffer
school_buffer <- st_buffer(school_sf, dist = 200)
# 2. 將事故點與 buffer 做空間交集
acc_in_buffer <- st_join(accident_sf, school_buffer, join = st_within, left = FALSE)
# 3. 計算每間學校 buffer 內的事故數量
acc_count <- acc_in_buffer %>%
st_drop_geometry() %>%
group_by(SID, Name) %>%
summarise(acc_num = n(), .groups = "drop") %>%
arrange(desc(acc_num))
# 4. 顯示事故數最多的前幾間學校
print(head(acc_count, 10))
NA
# 加上行政區資訊到 school_sf(空間 Join)
school_sf <- st_join(school_sf, tpe_sf[, c("TOWN", "VILLAGE")], join = st_within, left = FALSE)
# STEP 1:找出事故最多的學校
top_sid <- acc_count$SID[1]
top_school <- school_sf %>% filter(SID == top_sid)
# STEP 2:建立該校的 500 公尺 buffer
top_buffer <- st_buffer(top_school, dist = 200)
# STEP 3:找出 buffer 有相交的所有村里
focus_village <- tpe_sf[st_intersects(tpe_sf, top_buffer, sparse = FALSE), ]
# STEP 4:找出 buffer 包含的車禍點
top_acc <- accident_sf[top_buffer, ]
# STEP 5:繪圖
tm_shape(focus_village) +
tm_borders(col = "gray60", lwd = 1.5) +
tm_shape(top_buffer) +
tm_borders(lwd = 2, col = "blue") +
tm_shape(top_acc) +
tm_dots(col = "black", size = 0.04, alpha = 0.6) +
tm_shape(top_school) +
tm_symbols(size = 0.5, col = "red", shape = 19, border.col = "black") + # 確保繪圖格式
tm_layout(main.title = paste0("事故最多學校周邊分布:", top_school$Name),
legend.outside = TRUE)
── tmap v3 code detected ───────────────────────────────────────────────────
[v3->v4] `tm_dots()`: use `fill_alpha` instead of `alpha`.[v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(main.title =
)`

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyfQ0Kcm0obGlzdCA9IGxzKCkpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHRtYXApDQpsaWJyYXJ5KHBhbHMpDQpsaWJyYXJ5KGNhcnRvZ3JhcGh5KQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KbGlicmFyeShncmlkKQ0KbGlicmFyeSh1bml0cykNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGFzcGFjZSkNCmxpYnJhcnkoc3BhdHN0YXQpDQpsaWJyYXJ5KHNwZGVwKQ0KbGlicmFyeShyZWFkcikNCmBgYA0KDQpgYGB7cn0NCnNjaG9vbF9zZj1zdF9yZWFkKCJDOi9Vc2Vycy9Vc2VyL0Rlc2t0b3Av6YKx5Yag55GLL+WPsOWkpy/lpKfkuozkuIsv56m66ZaT5YiG5p6QL+acn+acqy9TQ0hPT0wvU0NIT09MLnNocCIsb3B0aW9ucz0iRU5DT0RJTkc9QklHNSIscXVpZXQ9VCkNCg0KdHBlX3NmPXN0X3JlYWQoIkM6L1VzZXJzL1VzZXIvRGVza3RvcC/pgrHlhqDnkYsv5Y+w5aSnL+Wkp+S6jOS4iy/nqbrplpPliIbmnpAv5pyf5pyrL1RhaXBlaV92aWxsL1RhaXBlaV9WaWxsLnNocCIsb3B0aW9ucz0iRU5DT0RJTkc9QklHNSIscXVpZXQ9VCkNCg0KIyDoroDmqpTvvJrmjIflrprkuK3mlocgQklHNSDnt6jnorwgKyDlrozmlbTot6/lvpENCmFjY2lkZW50IDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9Vc2VyL0Rlc2t0b3Av6YKx5Yag55GLL+WPsOWkpy/lpKfkuozkuIsv56m66ZaT5YiG5p6QL+acn+acqy8xMTPlubToh7rljJfluILpgZPot6/kuqTpgJrkuovmlYXmlpHpu57lnJYuY3N2IixmaWxlRW5jb2RpbmcgPSAiQklHNSIpDQoNCiMg6L2J54K6IHNmIOm7nuizh+aWmQ0KYWNjaWRlbnRfc2YgPC0gc3RfYXNfc2YoYWNjaWRlbnQsIGNvb3JkcyA9IGMoIuW6p+aomS5YIiwgIuW6p+aomS5ZIiksIGNycyA9IDQzMjYpDQoNCmBgYA0KDQpgYGB7cn0NCnNjaG9vbF9zZiA8LSBzdF90cmFuc2Zvcm0oc2Nob29sX3NmLCAzODI2KQ0KYWNjaWRlbnRfc2YgPC0gc3RfdHJhbnNmb3JtKGFjY2lkZW50X3NmLCAzODI2KQ0KDQojIDEuIOW7uueriyA1MDAg5YWs5bC6IGJ1ZmZlcg0Kc2Nob29sX2J1ZmZlciA8LSBzdF9idWZmZXIoc2Nob29sX3NmLCBkaXN0ID0gMjAwKQ0KDQojIDIuIOWwh+S6i+aVhem7nuiIhyBidWZmZXIg5YGa56m66ZaT5Lqk6ZuGDQphY2NfaW5fYnVmZmVyIDwtIHN0X2pvaW4oYWNjaWRlbnRfc2YsIHNjaG9vbF9idWZmZXIsIGpvaW4gPSBzdF93aXRoaW4sIGxlZnQgPSBGQUxTRSkNCg0KIyAzLiDoqIjnrpfmr4/plpPlrbjmoKEgYnVmZmVyIOWFp+eahOS6i+aVheaVuOmHjw0KYWNjX2NvdW50IDwtIGFjY19pbl9idWZmZXIgJT4lDQogIHN0X2Ryb3BfZ2VvbWV0cnkoKSAlPiUNCiAgZ3JvdXBfYnkoU0lELCBOYW1lKSAlPiUNCiAgc3VtbWFyaXNlKGFjY19udW0gPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBhcnJhbmdlKGRlc2MoYWNjX251bSkpDQoNCiMgNC4g6aGv56S65LqL5pWF5pW45pyA5aSa55qE5YmN5bm+6ZaT5a245qChDQpwcmludChoZWFkKGFjY19jb3VudCwgMTApKQ0KDQpgYGANCg0KYGBge3J9DQojIOWKoOS4iuihjOaUv+WNgOizh+ioiuWIsCBzY2hvb2xfc2bvvIjnqbrplpMgSm9pbu+8iQ0Kc2Nob29sX3NmIDwtIHN0X2pvaW4oc2Nob29sX3NmLCB0cGVfc2ZbLCBjKCJUT1dOIiwgIlZJTExBR0UiKV0sIGpvaW4gPSBzdF93aXRoaW4sIGxlZnQgPSBGQUxTRSkNCiMgU1RFUCAx77ya5om+5Ye65LqL5pWF5pyA5aSa55qE5a245qChDQp0b3Bfc2lkIDwtIGFjY19jb3VudCRTSURbMV0NCnRvcF9zY2hvb2wgPC0gc2Nob29sX3NmICU+JSBmaWx0ZXIoU0lEID09IHRvcF9zaWQpDQoNCiMgU1RFUCAy77ya5bu656uL6Kmy5qCh55qEIDUwMCDlhazlsLogYnVmZmVyDQp0b3BfYnVmZmVyIDwtIHN0X2J1ZmZlcih0b3Bfc2Nob29sLCBkaXN0ID0gMjAwKQ0KDQojIFNURVAgM++8muaJvuWHuiBidWZmZXIg5pyJ55u45Lqk55qE5omA5pyJ5p2R6YeMDQpmb2N1c192aWxsYWdlIDwtIHRwZV9zZltzdF9pbnRlcnNlY3RzKHRwZV9zZiwgdG9wX2J1ZmZlciwgc3BhcnNlID0gRkFMU0UpLCBdDQoNCiMgU1RFUCA077ya5om+5Ye6IGJ1ZmZlciDljIXlkKvnmoTou4rnpo3pu54NCnRvcF9hY2MgPC0gYWNjaWRlbnRfc2ZbdG9wX2J1ZmZlciwgXQ0KDQojIFNURVAgNe+8mue5quWclg0KdG1fc2hhcGUoZm9jdXNfdmlsbGFnZSkgKyANCiAgdG1fYm9yZGVycyhjb2wgPSAiZ3JheTYwIiwgbHdkID0gMS41KSArDQoNCnRtX3NoYXBlKHRvcF9idWZmZXIpICsgDQogIHRtX2JvcmRlcnMobHdkID0gMiwgY29sID0gImJsdWUiKSArDQoNCnRtX3NoYXBlKHRvcF9hY2MpICsNCiAgdG1fZG90cyhjb2wgPSAiYmxhY2siLCBzaXplID0gMC4wNCwgYWxwaGEgPSAwLjYpICsNCg0KdG1fc2hhcGUodG9wX3NjaG9vbCkgKw0KICB0bV9zeW1ib2xzKHNpemUgPSAwLjUsIGNvbCA9ICJyZWQiLCBzaGFwZSA9IDE5LCBib3JkZXIuY29sID0gImJsYWNrIikgKyAgIyDnorrkv53nuarlnJbmoLzlvI8NCg0KdG1fbGF5b3V0KG1haW4udGl0bGUgPSBwYXN0ZTAoIuS6i+aVheacgOWkmuWtuOagoeWRqOmCiuWIhuW4g++8miIsIHRvcF9zY2hvb2wkTmFtZSksDQogICAgICAgICAgbGVnZW5kLm91dHNpZGUgPSBUUlVFKQ0KYGBgDQoNCg==