2017-06-17 2 views

Répondre

1

Puisque vous n'avez pas fourni un échantillon de vos données, je vais utiliser l'ensemble de données oregon.tract de la bibliothèque UScensus2000tract comme exemple reproductible.

Voici une solution basée sur data.table rapide que j'obtiens de this other answer here.

# load libraries 
    library(data.table) 
    library(geosphere) 
    library(UScensus2000tract) 
    library(rgeos) 

Maintenant, nous allons créer une nouvelle data.table avec toutes les combinaisons de paires possibles d'origines (centroïdes de recensement) et les destinations (installations)

# get all combinations of origin and destination pairs 
# Note that I'm considering here that the distance from A -> B is equal 
from B -> A. 
    odmatrix <- CJ(Datatwo$Code_A , Dataone$Code_B) 
    names(odmatrix) <- c('Code_A', 'Code_B') # update names of columns 

# add coordinates of Datatwo centroids (origin) 
    odmatrix[Datatwo, c('lat_orig', 'long_orig') := list(i.Latitude, 
i.Longitude), on= "Code_A" ] 

# add coordinates of facilities (destination) 
    odmatrix[Dataone, c('lat_dest', 'long_dest') := list(i.Latitude, 
i.Longitude), on= "Code_B" ] 


Now you just need to: 

# calculate distances 
    odmatrix[ , dist := distHaversine(matrix(c(long_orig, lat_orig), ncol 
= 2), 
            matrix(c(long_dest, lat_dest), ncol 
= 2))] 

# and get the nearest destinations for each origin 
    odmatrix[, .( Code_B = Code_B[which.min(dist)], 
        dist = min(dist)), 
            by = Code_A] 

### Prepare data for this reproducible example 
# load data 
    data("oregon.tract") 

# get centroids as a data.frame 
    centroids <- as.data.frame(gCentroid(oregon.tract,byid=TRUE)) 

# Convert row names into first column 
    setDT(centroids, keep.rownames = TRUE)[] 

# get two data.frames equivalent to your census and facility data 
frames 
    Datatwo<- copy(centroids) 
    Dataone <- copy(centroids) 

    names(Datatwo) <- c('Code_A', 'Longitude', 'Latitude') 
    names(Dataone) <- c('Code_B', 'Longitude', 'Latitude') 
+0

J'ai changé le code/exemple reproductible pour le rendre plus proche de votre propres données. J'espère que la réponse/explication est plus claire maintenant –

+0

Je ne sais pas, mais je l'ai juste googlé et j'ai trouvé ce https://stackoverflow.com/questions/36110815/how-to-use-disthaversine-function https://stackoverflow.com/questions/21496587/error-in-pointstomatrixp1-latitude-90 –

+0

lisez le fichier d'aide de '? geosphere :: distHaversine' - il est dit" Valeur: Vecteur de distances dans la même unité que r (la valeur par défaut est le nombre de mètres) " – SymbolixAU