Saltar al contenido

Coordenadas de latitud longitud al código de estado en R

Posterior a de una larga recopilación de datos pudimos solucionar este apuro que tienen algunos los lectores. Te compartimos la solución y deseamos serte de gran ayuda.

Solución:

Aquí hay dos opciones, una usando s.f. y uno usando sp funciones del paquete. s.f. es el paquete más moderno (y, aquí en 2020, recomendado) para analizar datos espaciales, pero en caso de que aún sea útil, dejo mi respuesta original de 2012 que muestra cómo hacer esto con sp-funciones relacionadas.


Método 1 (usando sf):

library(sf)
library(spData)

## pointsDF: A data.frame whose first column contains longitudes and
##           whose second column contains latitudes.
##
## states:   An sf MULTIPOLYGON object with 50 states plus DC.
##
## name_col: Name of a column in `states` that supplies the states'
##           names.
lonlat_to_state <- function(pointsDF,
                            states = spData::us_states,
                            name_col = "NAME") 
    ## Convert points data.frame to an sf POINTS object
    pts <- st_as_sf(pointsDF, coords = 1:2, crs = 4326)

    ## Transform spatial data to some planar coordinate system
    ## (e.g. Web Mercator) as required for geometric operations
    states <- st_transform(states, crs = 3857)
    pts <- st_transform(pts, crs = 3857)

    ## Find names of state (if any) intersected by each point
    state_names <- states[[name_col]]
    ii <- as.integer(st_intersects(pts, states))
    state_names[ii]


## Test the function with points in Wisconsin, Oregon, and France
testPoints <- data.frame(x = c(-90, -120, 0), y = c(44, 44, 44))
lonlat_to_state(testPoints)
## [1] "Wisconsin" "Oregon"    NA

Si necesita límites de estado de mayor resolución, lea sus propios datos vectoriales como un sf objeto usando sf::st_read() o por algún otro medio. Una buena opción es instalar el tierranatural paquete y utilícelo para cargar una capa de vector de estado desde rnaturalearthcontratos. Luego usa el lonlat_to_state() función que acabamos de definir como se muestra aquí:

library(rnaturalearth)
us_states_ne <- ne_states(country = "United States of America",
                          returnclass = "sf")
lonlat_to_state(testPoints, states = us_states_ne, name_col = "name")
## [1] "Wisconsin" "Oregon"    NA         

Para obtener resultados muy precisos, puede descargar un geopaquete que contiene las fronteras administrativas mantenidas por GADM para los Estados Unidos desde esta página. Luego, cargue los datos de los límites del estado y utilícelos así:

USA_gadm <- st_read(dsn = "gadm36_USA.gpkg", layer = "gadm36_USA_1")
lonlat_to_state(testPoints, states = USA_gadm, name_col = "NAME_1")
## [1] "Wisconsin" "Oregon"    NA        

Método 2 (usando sp):

Aquí hay una función que toma un marco de datos de lat-longs dentro de los 48 estados inferiores y, para cada punto, devuelve el estado en el que se encuentra.

La mayor parte de la función simplemente prepara el SpatialPoints y SpatialPolygons objetos que necesita el over() función en el sp paquete, que hace el verdadero trabajo pesado de calcular la 'intersección' de puntos y polígonos:

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

lonlat_to_state_sp <- 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([email protected], function(x) [email protected])
    stateNames[indices]


# Test the function using points in Wisconsin and Oregon.
testPoints <- data.frame(x = c(-90, -120), y = c(44, 44))

lonlat_to_state_sp(testPoints)
[1] "wisconsin" "oregon" # IT WORKS

Puedes hacerlo en unas pocas líneas de 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)

Ver ?over en el paquete sp.

Deberá tener los límites estatales como SpatialPolygonsDataFrame.

Aquí puedes ver las reseñas y valoraciones de los lectores

Si tienes algún reparo y forma de aumentar nuestro reseña puedes escribir una aclaración y con gusto lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *