2017-07-16 4 views
0

J'essaie de combiner un SpatialPointsDataFrame (grille) de 1000x1000m carrés sur un SpatialPolygonsDataFrame (info) pour agréger toutes les informations des points dans chaque carré de la grille.Combinaison de SpatialPointsDataFrame avec l'erreur SpatialPolygonsDataFrame: taille maximale de la matrice dense renvoyée dépassée

J'ai essayé le code:

combined <- intersect(info, grid)

Mais je recive cette erreur:

Error in RGEOSBinPredFunc(spgeom1, spgeom2, byid, func) : 
    rgeos_binpredfunc_prepared: maximum returned dense matrix size exceeded 

Y at-il anotherway faire ce que je veux ou pour résoudre l'erreur?

Répondre

1

L'erreur indique que vous utilisez la mémoire maximale. Une solution consiste à diviser votre ensemble de données et à faire l'intersection en morceaux. Le nouveau package SF rend cela un peu plus facile à utiliser avec les verbes dplyr. Ajouter une colonne pour définir vos morceaux, puis effectuez les opérations suivantes:

combined <- info %>% 
    group_by(chuncks) %>% 
    do(sf::st_intersection(., grid)) 

Pour accélérer le processus, vous pouvez également essayer de diviser votre ensemble de données dans une liste de chuncks, puis en appliquant la fonction st_intersection en parallèle. C'est beaucoup plus rapide.

#import packages 
library(foreach) 
library(doParallel) 

#setup parallel backend to use 8 processors 
cl<-makeCluster(4) 
registerDoParallel(cl) 

tmp <- split(info, info$chunks) 

# run using foreach 
by.chunk <- foreach(df = tmp) %dopar% { 
    sf::st_intersection(df, grid) 
} 

# combine list of data.frames 
combined <- ldply(by.chunck