R:制作加拿大邮政编码地图

2023-12-04

我正在使用 R 编程语言。

这是我的问题的一些背景:

  • 在加拿大,每个地址都有一个邮政编码(如美国邮政编码)。这些邮政编码的格式为:字母编号字母 - 数字字母编号(例如 A1B 2C3)
  • 邮政编码的前三个字符称为 FSA - 所有前三个字母相同的邮政编码均被视为属于同一个 FSA
  • 在线提供免费且公开的“地理空间形状文件”,其中包含加拿大所有 FSA 的地理边界(https://www150.statcan.gc.ca/n1/en/catalogue/92-179-X)
  • 然而,加拿大邮政编码没有这样的形状文件 - 这就是我试图在 R 中构建的(即近似的)

为了开始解决这个问题,我找到了以下开放数据链接 - 其中包含数百万个经过地理编码的加拿大地址(每个地址的邮政编码和经度/纬度坐标):https://www.statcan.gc.ca/en/lode/databases/oda

这是我的计划:

  • 对于加拿大的某个省份 - 我可以创建一个“凸包”(https://en.wikipedia.org/wiki/Convex_hull) 具有相同邮政编码的所有地址。这可能可以作为每个邮政编码的“近似”边界。
  • 如果我对所有邮政编码重复此操作,我将得到一个近似的形状文件

这是我到目前为止所尝试的:

Step 1:我下载了给定省份(例如安大略省)的文件(临时文件):

url <- "https://www150.statcan.gc.ca/n1/en/pub/46-26-0001/2021001/ODA_ON_v1.zip"

temp <- tempfile()

download.file(url, temp)

unzipped_files <- unzip(temp, exdir = tempdir())

csv_file <- unzipped_files[grepl(".csv$", unzipped_files)]


df <- read.csv(unzipped_files[1], stringsAsFactors = FALSE)

Step 2:然后,使用lapply- 我使用内置函数计算了同一邮政编码中所有地址的凸包chull()功能。最后,我创建了一个形状文件,其最终结果是:

library(sf)

hulls <- lapply(unique(df$postal_code), function(postal_code) {
    chull(df[df$postal_code == postal_code, c("longitude", "latitude")])
})

hull_sfs <- lapply(seq_along(hulls), function(i) {
    st_as_sf(df[df$postal_code == unique(df$postal_code)[i], ][hulls[[i]], ],
             coords = c("longitude", "latitude"), crs = 4326)
})

hull_sf_combined <- do.call(rbind, hull_sfs)

st_write(hull_sf_combined, "hulls.shp")

Step 3:作为可选步骤,我们可以可视化最终结果:

library(ggplot2)

ggplot(df, aes(x = longitude, y = latitude)) +
    geom_point(aes(color = postal_code)) +
    lapply(seq_along(hulls), function(i) {
        geom_polygon(data = df[df$postal_code == unique(df$postal_code)[i], ][hulls[[i]], ],
                     aes(x = longitude, y = latitude, fill = postal_code), alpha = 0.5)
    })

我的问题:虽然代码似乎正在运行,但我不确定我所做的一切是否正确。有人可以帮我解决这个问题吗?

Thanks!

Note:根据@Ben Bolker提供的评论,是否最好采用此处提供的每个邮政编码的地理质心(https://www.serviceobjects.com/blog/free-zip-code-and-postal-code-database-with-geocooperatives/)并使用 Voronoi Cells 来确定近似边界?


这是有关清理邮政编码区域的部分答案。假设您使用凸包来获取一堆定义多边形的顶点。

library(polyclip)
library(ggplot2)

canada <- data.frame(x = c(0,1,1,0),
                     y = c(0,0,1,1))
postcode1 <- data.frame(x = c(0.5, 1.5, 1.5, 0.8),
                        y = c(0.5, 0.8, 1.5, 1.5))
postcode2 <- data.frame(x = c(0.25, 0.75, 0.75, 0.25),
                        y = c(0.25, 0.25, 0.75, 0.75))

ggplot() +
    geom_polygon(data = canada, aes(x,y), fill = "lightblue", color = "blue", alpha = 0.5) +
    geom_polygon(data = postcode1, aes(x,y), fill = "lightgreen", color = "green", alpha = 0.5) +
    geom_polygon(data = postcode2, aes(x,y), fill = "pink", color = "red", alpha = 0.5)

enter image description here

您可以看到邮政编码区域的凸包彼此重叠,其中之一延伸到国外。这polyclip包允许您对顶点所包围的区域进行交集、并集、异或和 setdiff。

clip1 <- polyclip(postcode1, canada, "intersect")[[1]] |> as.data.frame()
clip2 <- polyclip(postcode2, clip1, "minus")[[1]] |> as.data.frame()

ggplot() +
    geom_polygon(data = canada, aes(x,y), fill = "lightblue", color = "blue", alpha = 0.5) +
    geom_polygon(data = clip1, aes(x,y), fill = "lightgreen", color = "green", alpha = 0.5) +
    geom_polygon(data = clip2, aes(x,y), fill = "pink", color = "red", alpha = 0.5)

enter image description here

剪报快乐!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R:制作加拿大邮政编码地图 的相关文章

随机推荐

  • react-native-firebase 通知中的深层链接

    我使用带有消息传递功能的react native firebase通过云功能向我的应用程序发送通知 使用admin messaging send message 与这里非常相似 https medium com the modern dev
  • findIndex() JavaScript 数组对象

    var array one 1 two 2 one 3 two 4 var result array findIndex function value if value 2 return false return true console
  • jQuery 原地弹跳

    我需要我的列表项元素弹跳到位 而不是相互掉落 我创建了一个 JSFiddle 来表达我的意思 http jsfiddle net RGvjj 有人可以告诉我为什么这些元素会这样做以及我需要做什么来解决这个问题吗 尝试删除inline显示从
  • WPF ErrorTemplate 在未聚焦时可见?

    我正在使用 WPF 验证进行 TextBox 验证 我定义了这个模板
  • GZipStream:压缩文件比原始文件大

    我正在尝试在 C 中使用 gzip 流 但压缩后的文件似乎比以前大 当我使用 avi 和 mkv 文件时会发生这种情况 但是如果我使用比原始文件小的 txt 和 html 压缩文件 using MemoryStream output new
  • 如何使用 cURL 将文件内容作为正文实体发送

    我正在使用 cURL 命令行实用程序将 HTTP POST 发送到 Web 服务 我想将文件的内容作为 POST 的正文实体包含在内 我尝试过使用 d to filename gt 以及带有类型信息的其他变体 例如 data to file
  • 如何使用 TcpListener 和 TcpClient 创建双工连接?

    我遇到一种情况 我需要并行发送和接收信息 我的协议可以定义读取端口和写入端口 我目前有以下代码 public void Listen ThreadPool SetMinThreads 50 50 listener Start while t
  • Twitter LED 时间线

    你好 我已经为 twitter 时间轴编写了一个脚本 它可以工作 除了我不知道如何授权我的 twitter api 密钥之外 我的 led 标志只是说 错误的身份验证数据 这是我的代码 usr bin perl require LWP Us
  • sf sfc对象的坐标变换似乎不起作用

    我有一个 R sf 对象 library sf library magritr g1 structure list ele c 1819 80249 1821 150879 1825 393188 1817 905029 time stru
  • 如何访问 .ashx 文件中的本地化资源?

    我有一个 ashx 文件 它返回本地化消息 这是从 Ajax 请求调用的 我需要访问 ashx 文件中的 Asp net ResourceManager 以下代码对我有用 HttpContext GetGlobalResourceObjec
  • 为 C++/C Visual Studio 解决方案项目创建 Nuget 包

    我有几个用 C C 编写的旧组件 希望将它们包装到 Nuget 包中并从 C 代码中使用此包 将 C 代码实际包装在 nuget 包中的最佳方法是什么 我看过CoApp解决方案 但现在似乎不受支持 离线稳定版本 我可以回答如何从 Visua
  • 在 jquery ui 日期选择器中如何允许选择特定工作日并禁用其他工作日

    我需要将 jquery ui 日期选择器限制为仅将未来的星期二和星期四作为可选日期 我怎样才能做到这一点 这一切都在文档中 beforeShowDay 函数将执行您想要的操作 http api jqueryui com datepicker
  • IPython 将变量加载到工作区:你能想到比这更好的解决方案吗?

    我正在从 MATLAB 迁移到 ipython 在迈出这一步之前 我将完成我的最小工作流程 以确保我每天在 MATLAB 上执行的用于数据处理的每项操作都可以在 ipython 上使用 我目前陷入了通过单行命令 例如 MATLAB 的命令
  • 实现像 Wordle 这样的词云的算法

    Context 看看Wordle http www wordle net 它比我见过的任何其他词云生成器都要好看得多 注意 来源不可用 请阅读常见问题解答 http www wordle net faq code 我的问题 有没有一种算法可
  • 如果 BYMONTHDAY 是周末,iCal 可以在 BYMONTHDAY 之后的第一个工作日安排活动吗?

    如果我在该月的某一天 即 15 日 有一个重复发生的事件 并且该天恰逢周六或周日 iCal 是否可以将该事件安排在下一个可用的工作日发生 您不能设置例外 但可以使用 byday 和 bymonthday 的组合 类似的东西会给你一个周末后的
  • 如何在“android水平进度条”中绘制垂直线

    我需要制作一个自定义水平进度条 如下图所示 我使用图层列表设计了如下图所示的进度条 可绘制 我想在进度大于 25 时画一条垂直线 如图所示 我需要的 我写了这段代码 但它不起作用 myProgressBar ProgressBar find
  • 按列进行动态 SQL 透视 SQL Server

    假设我们有n列与m rows table 1 someName1 someName2 someName3 someNameN 12 5 12 34 56 6 33 2 1 2323 12 5 57 2 123 1 2 789 45 2 76
  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • ArrayList 中类对象属性的总和

    我有一个 ArrayList 其中有很多对象 我想要计算相同属性名称的值的总和 示例 数据在Array List这是对象损益数据DO Michel 5000 Alex 5000 Edvin 4000 Sosha 3000 Michel 20
  • R:制作加拿大邮政编码地图

    我正在使用 R 编程语言 这是我的问题的一些背景 在加拿大 每个地址都有一个邮政编码 如美国邮政编码 这些邮政编码的格式为 字母编号字母 数字字母编号 例如 A1B 2C3 邮政编码的前三个字符称为 FSA 所有前三个字母相同的邮政编码均被