Широта Долгота Координаты к Государственному Кодексу в R
Существует ли быстрый способ преобразования координат широты и долготы в коды состояний в R? Я использовал пакет zipcode в качестве справочной таблицы, но он слишком медленный, когда я запрашиваю множество значений lat/long
Если нет в R, есть ли способ сделать это, используя геокодер Google или любой другой тип сервиса быстрых запросов?
Спасибо!
6 ответов
Вот функция, которая принимает data.frame из значений long-long в нижних 48 состояниях и для каждой точки возвращает состояние, в котором она находится.
Большая часть функции просто готовит SpatialPoints
а также SpatialPolygons
объекты, необходимые для over()
функция в sp
пакет, который делает настоящий тяжелый подъем вычисления "пересечения" точек и многоугольников:
library(sp)
library(maps)
library(maptools)
# The single argument to this function, pointsDF, is a data.frame in which:
# - column 1 contains the longitude in degrees (negative in the US)
# - column 2 contains the latitude in degrees
latlong2state <- function(pointsDF) {
# Prepare SpatialPolygons object with one SpatialPolygon
# per state (plus DC, minus HI & AK)
states <- map('state', fill=TRUE, col="transparent", plot=FALSE)
IDs <- sapply(strsplit(states$names, ":"), function(x) x[1])
states_sp <- map2SpatialPolygons(states, IDs=IDs,
proj4string=CRS("+proj=longlat +datum=WGS84"))
# Convert pointsDF to a SpatialPoints object
pointsSP <- SpatialPoints(pointsDF,
proj4string=CRS("+proj=longlat +datum=WGS84"))
# Use 'over' to get _indices_ of the Polygons object containing each point
indices <- over(pointsSP, states_sp)
# Return the state names of the Polygons object containing each point
stateNames <- sapply(states_sp@polygons, function(x) x@ID)
stateNames[indices]
}
# Test the function using points in Wisconsin and Oregon.
testPoints <- data.frame(x = c(-90, -120), y = c(44, 44))
latlong2state(testPoints)
[1] "wisconsin" "oregon" # IT WORKS
Вы можете сделать это в несколько строк R.
library(sp)
library(rgdal)
#lat and long
Lat <- 57.25
Lon <- -9.41
#make a data frame
coords <- as.data.frame(cbind(Lon,Lat))
#and into Spatial
points <- SpatialPoints(coords)
#SpatialPolygonDataFrame - I'm using a shapefile of UK counties
counties <- readOGR(".", "uk_counties")
#assume same proj as shapefile!
proj4string(points) <- proj4string(counties)
#get county polygon point is in
result <- as.character(over(points, counties)$County_Name)
Видите? В пакете sp. Вам нужно иметь государственные границы в виде SpatialPolygonDataFrame.
Пример данных (полигоны и точки)
library(raster)
pols <- shapefile(system.file("external/lux.shp", package="raster"))
xy <- coordinates(p)
Используйте растр:: экстракт
extract(p, xy)
# point.ID poly.ID ID_1 NAME_1 ID_2 NAME_2 AREA
#1 1 1 1 Diekirch 1 Clervaux 312
#2 2 2 1 Diekirch 2 Diekirch 218
#3 3 3 1 Diekirch 3 Redange 259
#4 4 4 1 Diekirch 4 Vianden 76
#5 5 5 1 Diekirch 5 Wiltz 263
#6 6 6 2 Grevenmacher 6 Echternach 188
#7 7 7 2 Grevenmacher 7 Remich 129
#8 8 8 2 Grevenmacher 12 Grevenmacher 210
#9 9 9 3 Luxembourg 8 Capellen 185
#10 10 10 3 Luxembourg 9 Esch-sur-Alzette 251
#11 11 11 3 Luxembourg 10 Luxembourg 237
#12 12 12 3 Luxembourg 11 Mersch 233
Вот быстрый и простой способ преобразовать широту и долготу в штат США и его аббревиатуру.
# library(remotes)
# install_github("JVAdams/jvamisc") # if you are installing this for the first time you will need to load the remotes package
library(jvamisc)
library(stringr)
#> Warning: package 'stringr' was built under R version 4.2.3
# Example Data
data <- data.frame(
longitude = c(-74.28000,-80.62036,-77.43923),
latitude = c(40.99194,33.82849,37.54588))
# Use function latlong2 from library(jvamisc) to convert lat and long points to state
data$state <- latlong2(data, to = 'state')
# Use function str_to_title form library(stringr) to make the first letter of each state uppercase
data$state <- str_to_title(data$state)
# Convert state name to state abbreviation
data$state_abb <- state.abb[match(data$state, state.name)]
data
#> longitude latitude state state_abb
#> 1 -74.28000 40.99194 New Jersey NJ
#> 2 -80.62036 33.82849 South Carolina SC
#> 3 -77.43923 37.54588 Virginia VA
Создано 20 июня 2023 г. с использованием reprex v2.0.2.
Это очень просто, используя sf
:
library(maps)
library(sf)
## Get the states map, turn into sf object
US <- st_as_sf(map("state", plot = FALSE, fill = TRUE))
## Test the function using points in Wisconsin and Oregon
testPoints <- data.frame(x = c(-90, -120), y = c(44, 44))
# Make it a spatial dataframe, using the same coordinate system as the US spatial dataframe
testPoints <- st_as_sf(testPoints, coords = c("x", "y"), crs = st_crs(US))
#.. and perform a spatial join!
st_join(testPoints, US)
ID geometry
1 wisconsin POINT (-90 44)
2 oregon POINT (-120 44)