如何使用形状文件中的经纬度查找城市?
How to find city using latitude and longitude from shape file?
我的问题:我想使用许多经度和纬度数据从 shapefile 中获取城市名称。一些纬度和经度不一定在多边形(城市)的中心,而是在多边形的某些部分。我的意思是,我不知道这个点属于哪个城市,这就是我想知道的。在形状文件中有属于各自城市的每个多边形的名称。
我知道 Google 和其他 API 的支付 and/or 有限。
我更喜欢从 shapefile 中获取。
[link 到巴西圣保罗州的 shapfile(城市)] (geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2020/UFs/SP/SP_Municipios_2020.zip)
一些点示例:
'坐标<- data.frame(
"lon" = c(-48.1766, -50.078, -52.958, -51.3837, -50.2466, -47.0006, -47.8348, -45.0857),
"lat" = c(-21.7946, -21.4209, -22.482, -20.8939, -20.2834, -21.4708, -24.4881, -23.4339))'
出于某种原因,库 revgeo
(使用 Photon 地理编码器进行反向地理编码)目前对我不起作用。你可以尝试这样的事情:
library(tidyverse)
library(rjson)
coord %>%
select(lon, lat) %>%
imap(~str_c(.y, "=", .x)) %>%
pmap(~str_c(c(...), collapse = "&")) %>%
str_c("https://photon.komoot.io/reverse?", .) %>%
map(~rjson::fromJSON(file = .x)) %>%
map(~pluck(.x, "features", 1, "properties")) %>%
map_dfr(~.x[c("country", "city", "county", "district", "state")]) %>%
cbind(coord, .)
lon lat country city county district state
1 -48.1766 -21.7946 Brasil Araraquara Região Geográfica Intermediária de Araraquara Vila Melhado São Paulo
2 -50.0780 -21.4209 Brasil Penápolis Região Geográfica Intermediária de Araçatuba Penápolis São Paulo
3 -52.9580 -22.4820 Brasil Rosana Região Geográfica Intermediária de Presidente Prudente Rosana São Paulo
4 -51.3837 -20.8939 Brasil Andradina Região Geográfica Intermediária de Araçatuba Vila Peliciari São Paulo
5 -50.2466 -20.2834 Brasil Fernandópolis Região Geográfica Intermediária de São José do Rio Preto Coester São Paulo
6 -47.0006 -21.4708 Brasil Mococa Região Geográfica Intermediária de Campinas Centro São Paulo
7 -47.8348 -24.4881 Brasil Registro Região Geográfica Intermediária de Sorocaba Vila Paraguai São Paulo
8 -45.0857 -23.4339 Brasil Ubatuba Região Metropolitana do Vale do Paraíba e Litoral Norte Jardim Carolina São Paulo
使用形状文件:
library(sf)
shp_df <- read_sf(data_path)
st_coord <- st_as_sf(coord, coords = c("lon", "lat"), crs = st_crs(shp_df))
coord$city <- shp_df[unlist(st_within(st_coord, shp_df)),]$NM_MUN
coord
lon lat city
1 -48.1766 -21.7946 Araraquara
2 -50.0780 -21.4209 Penápolis
3 -52.9580 -22.4820 Rosana
4 -51.3837 -20.8939 Andradina
5 -50.2466 -20.2834 Fernandópolis
6 -47.0006 -21.4708 Mococa
7 -47.8348 -24.4881 Registro
8 -45.0857 -23.4339 Ubatuba
其中 data_path
是 SP_Municipios_2020.shp
的路径。
我的问题:我想使用许多经度和纬度数据从 shapefile 中获取城市名称。一些纬度和经度不一定在多边形(城市)的中心,而是在多边形的某些部分。我的意思是,我不知道这个点属于哪个城市,这就是我想知道的。在形状文件中有属于各自城市的每个多边形的名称。
我知道 Google 和其他 API 的支付 and/or 有限。 我更喜欢从 shapefile 中获取。
[link 到巴西圣保罗州的 shapfile(城市)] (geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2020/UFs/SP/SP_Municipios_2020.zip)
一些点示例:
'坐标<- data.frame( "lon" = c(-48.1766, -50.078, -52.958, -51.3837, -50.2466, -47.0006, -47.8348, -45.0857), "lat" = c(-21.7946, -21.4209, -22.482, -20.8939, -20.2834, -21.4708, -24.4881, -23.4339))'
出于某种原因,库 revgeo
(使用 Photon 地理编码器进行反向地理编码)目前对我不起作用。你可以尝试这样的事情:
library(tidyverse)
library(rjson)
coord %>%
select(lon, lat) %>%
imap(~str_c(.y, "=", .x)) %>%
pmap(~str_c(c(...), collapse = "&")) %>%
str_c("https://photon.komoot.io/reverse?", .) %>%
map(~rjson::fromJSON(file = .x)) %>%
map(~pluck(.x, "features", 1, "properties")) %>%
map_dfr(~.x[c("country", "city", "county", "district", "state")]) %>%
cbind(coord, .)
lon lat country city county district state
1 -48.1766 -21.7946 Brasil Araraquara Região Geográfica Intermediária de Araraquara Vila Melhado São Paulo
2 -50.0780 -21.4209 Brasil Penápolis Região Geográfica Intermediária de Araçatuba Penápolis São Paulo
3 -52.9580 -22.4820 Brasil Rosana Região Geográfica Intermediária de Presidente Prudente Rosana São Paulo
4 -51.3837 -20.8939 Brasil Andradina Região Geográfica Intermediária de Araçatuba Vila Peliciari São Paulo
5 -50.2466 -20.2834 Brasil Fernandópolis Região Geográfica Intermediária de São José do Rio Preto Coester São Paulo
6 -47.0006 -21.4708 Brasil Mococa Região Geográfica Intermediária de Campinas Centro São Paulo
7 -47.8348 -24.4881 Brasil Registro Região Geográfica Intermediária de Sorocaba Vila Paraguai São Paulo
8 -45.0857 -23.4339 Brasil Ubatuba Região Metropolitana do Vale do Paraíba e Litoral Norte Jardim Carolina São Paulo
使用形状文件:
library(sf)
shp_df <- read_sf(data_path)
st_coord <- st_as_sf(coord, coords = c("lon", "lat"), crs = st_crs(shp_df))
coord$city <- shp_df[unlist(st_within(st_coord, shp_df)),]$NM_MUN
coord
lon lat city
1 -48.1766 -21.7946 Araraquara
2 -50.0780 -21.4209 Penápolis
3 -52.9580 -22.4820 Rosana
4 -51.3837 -20.8939 Andradina
5 -50.2466 -20.2834 Fernandópolis
6 -47.0006 -21.4708 Mococa
7 -47.8348 -24.4881 Registro
8 -45.0857 -23.4339 Ubatuba
其中 data_path
是 SP_Municipios_2020.shp
的路径。