如何用R实现多伦多地址对应选区的自动化查询与记录
自动化获取多伦多地址所属选区的R方案
以下是一套无需手动查询、直接在R中完成地址到选区匹配的方案,同时兼顾部分地址无唯一匹配的情况:
1. 安装并加载依赖包
首先确保安装所需工具包,用于数据处理、地理编码和空间分析:
install.packages(c("tidyverse", "sf", "tidygeocoder", "opendatatoronto")) library(tidyverse) library(sf) library(tidygeocoder) library(opendatatoronto)
2. 加载原始地址数据
导入你的地址数据集:
raw_data <- as.data.frame(c( "570 BLOOR ST W TORONTO ON M6G1K1", "10 STAYNER AVE NORTH YORK ON M6B1N4", "1200 WOODBINE AVE EAST YORK ON M4C4E3", "2480-2490 GERRARD STREET EAST UNIT 20A TORONTO ON M1N 4C3" )) %>% setNames("address")
3. 地址地理编码(获取经纬度)
使用OpenStreetMap的免费地理编码服务,将地址转换为空间坐标:
geocoded_data <- raw_data %>% geocode(address, method = "osm", lat = latitude, long = longitude)
注:部分复杂地址(如带单元号的范围地址)可能无法返回精确坐标,此时
latitude/longitude会显示为NA,后续需手动处理。
4. 获取多伦多官方选区边界数据
通过opendatatoronto包直接获取最新的多伦多选区边界空间数据:
# 获取选区数据集 ward_dataset <- search_packages("ward boundaries") %>% list_package_resources() %>% filter(name == "wards.geojson") %>% get_resource() # 转换为sf空间对象 ward_sf <- st_as_sf(ward_dataset)
5. 空间匹配生成选区字段
将地理编码后的地址与选区边界进行空间关联,匹配对应的选区名称:
# 将地址数据转换为sf空间对象 address_sf <- geocoded_data %>% filter(!is.na(latitude)) %>% st_as_sf(coords = c("longitude", "latitude"), crs = 4326) %>% st_transform(crs = st_crs(ward_sf)) # 执行空间连接 matched_data <- st_join(address_sf, ward_sf, join = st_within) %>% as.data.frame() %>% select(address, ward_name = AREA_NAME) # 合并回原始数据(保留无匹配的地址) cleaned_data <- raw_data %>% left_join(matched_data, by = "address")
6. 处理无匹配的地址
对于无法自动匹配的地址(如示例第4行),可通过以下方式补充:
- 提取 postal code 前缀(如M1N对应Scarborough区域),批量填充 borough 级信息
- 手动查询少数无匹配地址并补充
示例补充代码(基于 postal code 前缀):
cleaned_data <- cleaned_data %>% mutate( postal_prefix = str_extract(address, "M[0-9][A-Z]"), ward = case_when( !is.na(ward_name) ~ ward_name, postal_prefix %in% c("M1B", "M1C", "M1E", "M1G", "M1H", "M1J", "M1K", "M1L", "M1M", "M1N", "M1P", "M1R", "M1S", "M1T", "M1V", "M1W", "M1X") ~ "Scarborough", postal_prefix %in% c("M2H", "M2J", "M2K", "M2L", "M2M", "M2N", "M2P", "M2R", "M3A", "M3B", "M3C", "M3H", "M3J", "M3K", "M3L", "M3M", "M3N") ~ "North York", postal_prefix %in% c("M4A", "M4B", "M4C", "M4E", "M4G", "M4H", "M4J", "M4K", "M4L", "M4M", "M4N", "M4P", "M4R", "M4S", "M4T", "M4V", "M4W", "M4X", "M4Y") ~ "Toronto", # 可继续添加其他区域的postal前缀映射 TRUE ~ NA_character_ ) ) %>% select(-postal_prefix, -ward_name)
最终输出的cleaned_data将包含原始地址和对应的选区信息,与你期望的格式一致。
内容的提问来源于stack exchange,提问作者leecarvallo
相关产品推荐
相关产品推荐

