You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 06:45:32