2011-11-14 1 views
1

J'utilise le package gdistance pour une analyse au moindre coût. L'idée est de déterminer le chemin d'un point de destination à une source sur une grille de coûts (raster) avec des valeurs de coût définies; le chemin évite ainsi les pixels avec des coûts élevés et préfère les pixels avec des valeurs de coût bas. Le code qui fonctionne pour moi avec mes données:Fonction loop ou sapply pour l'analyse multiple à moindre coût dans R

Costpath<-shortestPath(CostTrans,Cherangfirstloc.utm[1,],Cherangfirstloc.utm[132,], output="SpatialLines") 

Ainsi, CostTrans constitue la costgrid, Cherangfirstloc.utm[1,] est le premier lieu/point à partir d'une trame de données Spatialpoints (source) et Cherangfirstloc.utm[132,] est le dernier lieu/point à partir des Spatialpoints dataframe (destination). La sortie est une ligne reliant les deux emplacements/points.

Cependant, je veux maintenant calculer multiples chemins de coût moins, la source sera ainsi chaque ligne du dataframe, la destination reste le même. Cela signifie que la source suivante serait Cherangfirstloc.utm[2,], puis Cherangfirstloc.utm[3,] et ainsi de suite. Je pense que cela peut être fait avec une boucle for ou peut-être une fonction sapply. Malheureusement, je ne sais pas comment formuler cela. Pourriez-vous me donner des conseils sur la façon de formuler ce processus itératif?

J'espère que c'est bon, si je pose cette question dans cet endroit. Fondamentalement, je veux juste savoir comment itérer à travers le dataframe. La façon dont fonctionne l'analyse et l'analyse des coûts les plus faibles est donc sans importance.

Voici un code qui peut être utilisé comme données d'échantillon:

library(gdistance) 

r <- raster(nrows=6, ncols=7, xmn=0, xmx=7, ymn=0, ymx=6, crs="+proj=utm 
+units=m") 

r[] <- c(2, 2, 1, 1, 5, 5, 5, #creates costgrid 
2, 2, 8, 8, 5, 2, 1, 
7, 1, 1, 8, 2, 2, 2, 
8, 7, 8, 8, 8, 8, 5, 
8, 8, 1, 1, 5, 3, 9, 
8, 1, 1, 2, 5, 3, 9) 

T <- transition(r, function(x) 1/mean(x), 8) #creates transition layer of costgrid 
T <- geoCorrection(T) #correction 

c1 <- c(5.5,1.5) #first source point 
c2 <- c(5.5,4) #second source point 
c3 <- c(1.5,5.5) #destination 

sPath2 <- shortestPath(T, c1, c3, output="SpatialLines") # creates the least cost path 

Malheureusement, je ne savais pas comment inclure c1, c2 et c3 dans un dataframe Spatialpoints de sorte que l'on peut itérer. J'espère que cela aide encore.

J'aimerais que vous me donniez des indices à ce sujet. Merci pour vos efforts!

Répondre

1

Si vous souhaitez simplement appeler la fonction shortestPath avec un argument variable, la solution la plus simple consiste à utiliser une boucle for comme suit. Comme je ne suis pas familier avec ce type d'analyse, je ne sais pas ce que vous voulez faire avec les résultats, alors voici deux solutions:

Dans cet exemple, vous utiliserez le chemin le plus court immédiatement, car il sera oublié à l'étape suivante:

for(i in 1:nrow(Cherangfirstloc.utm)) { 
    # Computation 
    Costpath <- shortestPath(CostTrans, Cherangfirstloc.utm[i,], Cherangfirstloc.utm[132,], output="SpatialLines") 

    ### Here your instructions for a direct use of the result ### 
} 

dans celui-ci tous les chemins seront stockés dans une liste (il semble que la fonction shortestPath retourne un objet il est le moyen de stockage plus pratique), chaque résultat sera accessible dans la variable results, par exemple results[[12]] pour le chemin commençant à la 12ème rangée:

results = list() 
for(i in 1:nrow(Cherangfirstloc.utm)) { 
    # Computation, storage in a list element 
    results[[i]] <- shortestPath(CostTrans, Cherangfirstloc.utm[i,], Cherangfirstloc.utm[132,], output="SpatialLines") 
} 

### Here your instructions for a global use of the result ### 
+0

Super, cela fonctionne parfaitement. Merci beaucoup pour votre aide! –