es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eres un traductor de español que traduce documentos de tecnología de la información. Traduce lo siguiente al español: asignar puntos de una cuadrícula del mapa a los centroides de los distritos más cercanos con longitud y latitud en R.

Tengo dos conjuntos de datos: uno con más de 300.000 puntos en un mapa y el otro con 75 centroides de distrito. Ambos conjuntos de datos tienen coordenadas de longitud/latitud de los puntos del mapa y los centroides de los distritos. Estoy intentando emparejar cada punto del mapa con cada distrito, de manera que la distancia entre el punto del mapa y el centroide del distrito sea menor o igual a 100 km. ¿Cómo puedo hacer esto en R?

Intenté usar los paquetes de geosphere:

{r}
merged %>%
distGeo(c(merged$longitude, merged$latitude), c(geo$centroid_longitude, geo$centroid_latitude))

También intenté el comando distm, pero tampoco funciona.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para emparejar cada punto de grilla con cada distrito basado en un criterio de distancia en R, puedes utilizar el paquete geosphere. Aquí tienes un código de ejemplo:

    library(geosphere)
    
    # crear marcos de datos de muestra
    grid_points <- data.frame(id = 1:300000,
                              lon = runif(300000, -180, 180),
                              lat = runif(300000, -90, 90))
    
    districts <- data.frame(name = paste0("Distrito ", 1:75),
                             lon = runif(75, -180, 180),
                             lat = runif(75, -90, 90))
    
    # definir una función para calcular la distancia entre dos puntos
    dist_fun <- function(lon1, lat1, lon2, lat2) {
      dist <- distGeo(c(lon1, lat1), c(lon2, lat2))
      return(dist)
    }
    
    # encontrar los distritos correspondientes para cada punto de grilla
    for (i in 1:nrow(grid_points)) {
      distances <- apply(districts[, c("lon", "lat")], 1, dist_fun, grid_points[i, "lon"], grid_points[i, "lat"])
      matches <- districts[distances <= 100000, "name"]
      grid_points[i, "matched_districts"] <- paste(matches, collapse = ";")
    }
    

    Explicación del código:

    1. Primero creamos dos marcos de datos de muestra: grid_points con 300,000 puntos de grilla y districts con 75 centroides de distritos.
    2. Definimos una función dist_fun que calcula la distancia entre dos puntos utilizando distGeo del paquete geosphere.
    3. Utilizando un bucle sobre cada punto de grilla, calculamos las distancias a cada centroide de distrito y encontramos los nombres de los distritos que se encuentran a una distancia de 100 km. Estos nombres de distritos se agrupan y se almacenan en una nueva columna matched_districts en el marco de datos grid_points.

    Ten en cuenta que este enfoque puede tardar algún tiempo en ejecutarse para conjuntos de datos grandes. También puedes considerar parallelizar el bucle utilizando foreach u otros paquetes similares para una computación más rápida.

Comments are closed.