J'ai un shapefile de ligne représentant un réseau routier. Je souhaite pixelliser ces données, les valeurs résultantes dans le raster indiquant la longueur totale des lignes qui se trouvent dans la cellule raster.
Les données sont dans la projection du British National Grid, les unités seront donc en mètres.
Idéalement, je voudrais effectuer cette opération en utilisant R
, et je suppose que la rasterize
fonction du raster
package jouerait un rôle dans la réalisation de cela, je ne peux tout simplement pas déterminer quelle devrait être la fonction appliquée.
vignette('over', package = 'sp')
- être que ça pourrait aider.Réponses:
Suite à une question récente , vous souhaiterez peut-être utiliser les fonctionnalités offertes par le package rgeos pour résoudre votre problème. Pour des raisons de reproductibilité, j'ai téléchargé un fichier de formes de routes tanzaniennes à partir de DIVA-GIS et l'ai mis dans mon répertoire de travail actuel. Pour les tâches à venir, vous aurez besoin de trois packages:
Par conséquent, vos premières lignes de pourraient ressembler à ceci:
Après cela, vous devez importer les données du fichier de formes. Notez que les fichiers de formes DIVA-GIS sont distribués en EPSG: 4326, donc je projetterai le fichier de formes en EPSG: 21037 (UTM 37S) pour traiter les mètres plutôt que les degrés.
Pour la pixellisation ultérieure, vous aurez besoin d'un modèle de tramage qui couvre l'étendue spatiale de votre fichier de formes. Le modèle raster se compose de 10 lignes et 10 colonnes par défaut, évitant ainsi des temps de calcul trop longs.
Maintenant que le modèle est configuré, parcourez toutes les cellules du raster (qui se compose actuellement de valeurs NA uniquement). En attribuant une valeur de «1» à la cellule actuelle et en l'exécutant par la suite
rasterToPolygons
, le fichier de formes résultant «tmp_shp» contient automatiquement l'étendue du pixel actuellement traité.gIntersects
détecte si cette étendue chevauche des routes. Sinon, la fonction renverra une valeur de «0». Sinon, le fichier de formes de route est rogné par la cellule actuelle et la longueur totale des «SpatialLines» dans cette cellule est calculée à l'aide degLength
.Enfin, vous pouvez insérer les longueurs calculées (qui sont converties en kilomètres) dans le modèle raster et vérifier visuellement vos résultats.
la source
sapply()
àpbsapply()
et utilisé l'argument du clustercl = detectCores()-1
. Maintenant, je peux exécuter cet exemple en parallèle!Ce qui suit est modifié à partir de la solution de Jeffrey Evans. Cette solution est beaucoup plus rapide car elle n'utilise pas la pixellisation
la source
raster::intersect()
, comme je ne l'avais jamais vu auparavant, j'aime bien qu'il combine les attributs des entités intersectées, contrairement àrgeos::gIntersection()
.Vous n'avez pas besoin d'une boucle for. Il suffit de couper tout à la fois, puis d'ajouter des longueurs de ligne aux nouveaux segments de ligne à l'aide de la fonction "SpatialLinesLengths" de sp. Ensuite, en utilisant la fonction rasterize du package raster avec l'argument fun = sum, vous pouvez créer un raster avec la somme des longueurs de ligne coupant chaque cellule. L'utilisation de la réponse ci-dessus et des données associées ici est un code qui générera les mêmes résultats.
la source
SpatialLinesLengths
. Je suppose qu'il n'est jamais trop tard pour apprendre, merci (:rasterize
prend assez de temps, cependant (7 fois plus long que l'approche supérieure sur ma machine).rasterize()
fonction inclut toutes les lignes qui touchent une cellule donnée. Il en résulte que les longueurs de segment de ligne sont comptées deux fois dans certains cas: une fois dans la cellule, elles sont censées le faire et une fois dans la cellule adjacente que l'extrémité de la ligne touche juste.Voici encore une autre approche. Il s'écarte de ceux déjà donnés en utilisant le
spatstat
package. Pour autant que je sache, ce package a sa propre version des objets spatiaux (par exemple,im
vsraster
objets), mais lemaptools
package permet la conversion entre lesspatstat
objets et les objets spatiaux standard.Cette approche est tirée de ce poste R-sig-Geo .
Le bit le plus lent convertit les routes d'
SpatialLines
un modèle de segment de ligne (c.spatstat::psp
-à-d.). Une fois cela fait, les pièces de calcul de la longueur réelle sont assez rapides, même pour des résolutions beaucoup plus élevées. Par exemple, sur mon ancien MacBook 2009:la source
Permettez-moi de vous présenter la veine du package avec plusieurs fonctions pour travailler les lignes spatiales et importer sf et data.table
la source
Cela peut sembler un peu naïf, mais s'il s'agit d'un système routier, sélectionnez les routes et enregistrez-les dans un presse-papiers, puis recherchez un outil qui vous permet d'ajouter un tampon au presse-papiers, réglez-le sur la largeur légale de la route, c'est-à-dire 3 mètres +/- rappelez-vous que le tampon est de la ligne médiane au bord * 2 i pour chaque côté, donc un tampon de 3 mètres est en fait une route de 6 mètres d'un côté à l'autre.
la source