我有 100 个加拿大邮政编码的列表(例如
M4B 1C7
)。有没有办法将这些邮政编码转换为近似的经度和纬度值?目前,我正在使用以下网站手动执行此操作:https://geocoder.ca/
在 R 中是否有更快的方法来做到这一点?我遇到了 tidygeocoder 包,但我不确定这是否适用于加拿大邮政编码。
正如上面@Dave2e所指出的,数据可以在这里下载,尽管你必须注册并同意使用条款(基本上,你不能重新分发数据或违反任何其他法律:我引用了为了方便起见,将它们放在下面)。邮政编码数据并不更容易获得,这似乎很奇怪,但显然它的知识产权地位是有争议的——加拿大邮政出售数据库的访问权限。
这个解决方案在未来可能不够稳健:我之前曾使用过其他来源来获取此数据,但这些来源后来从网络上消失了。这些文件截至 2021 年 4 月 18 日 2023 年 8 月 9 日可用(至少,该网站已上线并且出现了注册对话框;我实际上并没有尝试再次下载它们......)。
下载并解压 CSV 文件后,一切就非常简单了。
library(tidyverse)
cc <- (read_csv("CanadianPostalCodes202104.csv")
## if all you want is lat/long: file also includes city, province abbreviation,
## time zone - maybe useful for troubleshooting/proofreading
%>% select(POSTAL_CODE, LATITUDE, LONGITUDE)
%>% rename(postcode="POSTAL_CODE", lat="LATITUDE", lon="LONGITUDE")
)
mydata <- tibble(postcode=c("M4B 1C7","L8P 2V7"))
mydata_aug <- left_join(mydata, cc, by="postcode")
## postcode lat lon
## 1 M4B 1C7 43.7 -79.3
## 2 L8P 2V7 43.2 -79.9
地点的图片(如果我费心将其放入具有省边界等的适当空间环境中,这会更漂亮):我不确定明显位于加拿大南部的十几个地点的情况如何-美国边境。例如,该数据库显然认为斯托维尔 ON 位于 44.8°N 93.3°W,根据谷歌地图,它正好位于美国明尼苏达州西布卢明顿的中部:根据谷歌地图,它实际上位于 43°58′N 79°15′W维基百科...
使用条款(部分):
您不得(也不允许任何第三方)转售 Zip 文件、将 Zip 文件合并到任何产品或服务中、复制、分发、出售、披露、出借、转让、传达、修改、反编译、反汇编或逆向工程 Zip 文件任何目的。
在任何情况下,您均不得: (i) 使用 Zip 文件中的信息建立数据库以供转售或供与服务对象直接竞争的第三方访问; (ii) 允许以任何方式使用 Zip 文件中的信息来验证来自与服务对象直接竞争的转售数据的第三方的信息; (iii) 向与服务对象直接竞争的转售数据的第三方提供对 Zip 文件的访问权或来自 Zip 文件的信息,或向计划向其他第三方转售对 Zip 文件或从 Zip 文件获得的信息的访问权的第三方。
您同意严格遵守与使用 Zip 文件相关的所有适用法律和法规。
https://pypi.org/project/pgeocode/ 速度非常快。 pgeocode 的问题在于它实际上仅解析为正向分拣区域(即前 3 个字符),而不是完整的邮政编码。
pgeocode 应用程序使用来自 GeoNames.org 的文件,我看到加拿大有一个完整的文件(即完整的邮政编码),但我还没有弄清楚如何使用它。 如果有人知道请告诉我。
OP 这里 - 几年后,但我找到了使用 R 和 OSM(开放街道地图)的解决方案。
这是一个例子:
library(tmap)
library(tmaptools)
remotes::install_github("riatelab/osrm")
q1 = geocode_OSM("6301 Silver Dart Dr, Mississauga, ON L5P 1B2")
q2 = geocode_OSM("290 Bremner Blvd, Toronto, ON M5V 3L9")
q1 = as.numeric(q1$coords)
q2 = as.numeric(q2$coords)