如何使用形状文件中的经纬度查找城市?

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_pathSP_Municipios_2020.shp 的路径。