Suite

Convertir un fichier de formes avec des listes en bloc de données dans R


Je voudrais demander de l'aide pour convertir un fichier de formes en bloc de données. J'ai téléchargé des données relatives aux routes de Natural Earth. J'ai importé le fichier de formes en utilisantfichiers de formespaquet comme le suivant.

foo <- read.shp("ne_10m_roads_north_america.shp")

Ensuite, j'ai vérifié str(foo) et j'ai vu ce qui suit. Ceci n'est que la partie de début.

> str(foo) Liste de 2 $ shp :Liste de 49183… $ :Liste de 8… $ record : int 1… $ content.length: int 656… $ shape.type : int 3… $ box : Nommé num [1 :4] -119,6 37,8 -119,6 37,9… - attr(*, "noms")= chr [1:4] "xmin" "ymin" "xmax" "ymax"… $ num.parts : int 1… $ num. points : int 79… $ parties : int 0… $ points :'data.frame' : 79 obs. de 2 variables :… $ X : num [1:79] -120 -120 -120 -120 -120… $ Y : num [1:79] 37,9 37,9 37,9 37,9 37,9… $ :Liste de 8… $ enregistrement : int 2… $ content.length: int 40… $ shape.type : int 3… $ box : Named num [1:4] -119,8 39,1 -119,7 39,1… - attr(*, "names")= chr [1:4 ] "xmin" "ymin" "xmax" "ymax"… $ num.parts : int 1… $ num.points : int 2… $ parts : int 0… $ points :'data.frame' : 2 obs. de 2 variables :… $ X : num [1:2] -120 -120… $ Y : num [1:2] 39,1 39,1

Je fais habituellement quelque chose comme ça.

df <- data.frame(matrix(unlist(foo), nrow=100, byrow=T))

Mais, il semble que chaque liste ait un nombre différent de lignes. Je ne sais donc pas si cette approche est la bonne. J'ai également essayé ce qui suit.do.call(rbind)sera probablement lent même si cela fonctionne.rbindlist()indique les nombres de colonnes différents parmi les éléments.rangera une nouvelle fonction appeléeunnest()qui fonctionnerait, mais R s'est écrasé.

> test<- do.call(rbind.data.frame, foo) Erreur dans data.frame(record = 1L, content.length = 656L, shape.type = 3L, : les arguments impliquent un nombre différent de lignes : 1, 4, 79 > test <- rbindlist(foo) Erreur dans rbindlist(foo) : l'élément 2 a 12 colonnes, incohérent avec l'élément 1 qui a 49183 colonnes

Cela semble être une chose relativement facile à faire, mais je ne suis pas familier avec les fichiers de formes. Comment puis-je aborder cette situation?


Pour lire votre shapefile, je vous recommande d'utiliserrgdalpaquet et seslireOGRfonction, ou éventuellement utiliserreadShapeLinesdeoutils de cartepaquet. Ces forfaits reposent sur lesppackage quant à la manière dont les données géospatiales sont structurées dans R.

Vous pouvez le faire facilement pour convertir votre fichier de formes entrame de données(ie extraire les attributs du shapefile)

require(rgdal) foo <- readOGR(dsn=".",layer="ne_10m_roads_north_america") foo.df <- as(foo, "data.frame")

Et c'est tout!

Remarque : si nous comparonslireOGRetreadShapeLinesen terme de performances,readShapeLinessemble donner de meilleurs résultats :

-aveclireOGR

système utilisateur écoulé 114,48 7,34 123,83

-avecreadShapeLines

système utilisateur écoulé 76,28 0,43 78,05

Veuillez lire la vignette sp sur les classes et méthodes spatiales.

vignette(paquet="sp")[4] vignette("intro_sp")

Puisqu'il existe un slot (@data) qui contient un data.frame lié à l'objet sp, aucune coercition n'est requise.

class([email protected]) str([email protected]) ( df <- [email protected] )

Cependant, il est recommandé d'opérer directement sur le slot @data plutôt que de le tirer vers un nouvel objet. Non seulement il est plus efficace, mais il évite également de rompre la relation entre l'ordre des lignes et les emplacements dans l'objet sp auquel il se rapporte.


Vous pouvez utiliser le forfait Balai.

Exécutez simplement :

my_df <- bien rangé(foo)

Convertissez le data.frame suivant en un SpatialPointsDataFrame à l'aide de la méthode coordinates() , puis tracez les points avec plot() .

latitude lon identifiant
12 -35 1
15 -35 2
17 -32 3
12 -32 4
Afficher la solution


Données spatiales au format texte

Le fichier HARV_PlotLocations.csv contient des emplacements x, y (points) pour la parcelle d'étude où NEON collecte des données sur la végétation et d'autres mesures écologiques. Nous voudrions:

  • Créez une carte de ces emplacements de parcelles.
  • Exportez les données dans un format shapefile à partager avec nos collègues. Ce fichier de formes peut être importé dans n'importe quel logiciel SIG.
  • Créez une carte montrant la hauteur de la végétation avec les emplacements des parcelles superposés.

Les données spatiales sont parfois stockées dans un format de fichier texte ( .txt ou .csv ). Si le fichier texte a une colonne d'emplacement x et y associée, nous pouvons le convertir en un objet spatial sf. L'objet sf nous permet de stocker à la fois les valeurs x,y qui représentent l'emplacement des coordonnées de chaque point et les données attributaires associées - ou les colonnes décrivant chaque entité dans l'objet spatial.

Nous continuerons à utiliser les packages sf et raster dans cet épisode.


Attacher un dataframe à un shapefile et le tracer

J'ai eu du mal à tenter de joindre un bloc de données avec un fichier de formes et de tracer les résultats. J'essaie de suivre la méthode utilisée proposée dans la réponse de @jlhoward à cette question.

J'ai un ensemble de données national des taux de vaccination par code postal. J'essaie de le fusionner avec un fichier de formes ESRI de codes postaux du Bureau australien des statistiques et de tracer les résultats par code postal selon l'autre question.

C'est là que se situe ma tentative actuelle:

Je pense que mon problème réside dans les deux lignes suivantes, je sais que je dois attribuer by.x= et/ou by.y=: mais je continue à recevoir des erreurs dont je ne sais pas d'où elles proviennent. Je ne suis pas sûr de ce que j'essaie de réaliser ici.

Mon fichier de formes se termine avec plus de 5 500 000 observations à ce stade et R commence à se débattre.

Il convient également de noter qu'il existe certains codes postaux dans le fichier de formes ABS pour lesquels je n'ai aucune donnée. Je ne sais pas comment les exclure. Ils peuvent être un problème. Dans une tentative précédente, j'ai essayé cette approche:

Si quelqu'un a une idée de l'endroit où je tombe, j'apprécierais beaucoup des conseils. Je suis nouveau sur R alors je m'excuse si c'est une question évidente.


Mise à jour juillet 2020 :

La valeur par défaut du paramètre stringsAsFactors est désormais default.stringsAsFactors(), qui à son tour renvoie FALSE par défaut.

En supposant que votre liste de listes s'appelle l :

Ce qui précède convertira toutes les colonnes de caractères en facteurs, pour éviter cela, vous pouvez ajouter un paramètre à l'appel data.frame() :

Edit: la version précédente renvoie data.frame de la liste au lieu des vecteurs (comme @IanSudbery l'a souligné dans les commentaires).

Vous pouvez utiliser le package plyr. Par exemple une liste imbriquée de la forme

a maintenant une longueur de 4 et chaque liste dans l contient une autre liste de longueur 3. Vous pouvez maintenant exécuter

et devrait obtenir le même résultat que dans la réponse @Marek et @nico.

Correction des exemples de données afin qu'ils correspondent à la description d'origine « chaque élément est une liste de longueur 20 »

nous pouvons le convertir en un bloc de données comme celui-ci :

sapply le convertit en matrice. data.frame convertit la matrice en une trame de données.

supposons que votre liste s'appelle L ,

Le package data.table a la fonction rbindlist qui est une implémentation ultra-rapide de do.call(rbind, list(. )) .

Il peut prendre une liste de listes , data.frames ou data.tables en entrée.

Cela renvoie un data.table hérite de data.frame .

Si tu vraiment voulez reconvertir en data.frame utiliser as.data.frame(DT)

Le paquetage tibble a une fonction enframe() qui résout ce problème en forçant les objets de liste imbriqués à des objets tibble imbriqués (cadre de données « ordonné »). Voici un bref exemple de R pour Data Science :

Puisque vous avez plusieurs imbrications dans votre liste, l , vous pouvez utiliser le unlist(recursive = FALSE) pour supprimer l'imbrication inutile afin d'obtenir une seule liste hiérarchique, puis passer à enframe() . J'utilise tidyr::unnest() pour désimbriquer la sortie dans un bloc de données "rangé" à un seul niveau, qui contient vos deux colonnes (une pour le nom du groupe et une pour les observations avec la valeur des groupes). Si vous voulez des colonnes larges, vous pouvez ajouter une colonne à l'aide de add_column() qui répète simplement l'ordre des valeurs 132 fois. Ensuite, il suffit de diffuser () les valeurs.


Alors que les fichiers texte sont souvent autonomes (un fichier CSV ) est composé d'un fichier unique, de nombreux formats spatiaux sont composés de plusieurs fichiers. Un shapefile est créé par 3 fichiers ou plus, qui doivent tous conserver le même NOM et être stockés dans le même répertoire de fichiers, afin que vous puissiez travailler avec eux.

Structure du fichier de formes

Il existe 3 fichiers clés associés à tous les fichiers de formes :

  • .shp : le fichier qui contient la géométrie de toutes les entités.
  • .shx : le fichier qui indexe la géométrie.
  • .dbf : le fichier qui stocke les attributs d'entité dans un format tabulaire.

Ces fichiers doivent avoir le même nom et à stocker dans le même répertoire (dossier) pour s'ouvrir correctement dans un outil SIG, R ou Python.

Parfois, un fichier de formes aura d'autres fichiers associés, notamment :

  • .prj : le fichier qui contient des informations sur le format de projection, y compris le système de coordonnées et les informations de projection. Il s'agit d'un fichier en texte brut décrivant la projection en utilisant le format de texte bien connu ( WKT ).
  • .sbn et .sbx : les fichiers qui sont un index spatial des entités.
  • .shp.xml : le fichier qui est les métadonnées géospatiales au format XML, (par exemple ISO 19115 ou format XML).

Le fichier HARV_PlotLocations.csv contient des emplacements x, y (points) pour la parcelle d'étude où NEON collecte des données sur la végétation et d'autres mesures écologiques. Nous voudrions:

  • Créez une carte de ces emplacements de parcelles.
  • Exportez les données dans un format shapefile à partager avec nos collègues. Ce fichier de formes peut être importé dans n'importe quel logiciel SIG.
  • Créez une carte montrant la hauteur de la végétation avec les emplacements des parcelles superposés.

Les données spatiales sont parfois stockées dans un format de fichier texte ( .txt ou .csv ). Si le fichier texte a une colonne d'emplacement x et y associée, nous pouvons le convertir en un objet spatial sf. L'objet sf nous permet de stocker à la fois les valeurs x,y qui représentent l'emplacement des coordonnées de chaque point et les données attributaires associées - ou les colonnes décrivant chaque entité dans l'objet spatial.


Fonctionnalité de conversion

Après avoir maîtrisé les bases du déplacement des données d'un bout à l'autre du pont, l'étape suivante naturelle consiste à commencer à analyser les données. R a un nombre énorme de packages et de méthodes qui se concentrent sur les données spatiales et les attributs qui leur sont associés. En tant que tel, il est important que vous sachiez comment manipuler vos données dans un format cohérent avec la méthode elle-même. Il y a plusieurs fonctions dans le arcgisliaison package qui se concentre sur la conversion de vos données dans un format nécessaire à de nombreuses analyses de données. Ces fonctions incluent :

L'objet de bloc de données spatiales du sp package est un format courant requis pour exécuter de nombreuses analyses spatiales dans R. En tant que tel, le pont possède une paire de fonctions conçues pour convertir des trames de données en un objet de trame de données spatiales et vice versa. Les entités ponctuelles sont converties en un bloc de données de points spatiaux ( SpatialPointsDataFrame ), tandis que les polygones et les entités linéaires sont mappés sur des blocs de données de polygones spatiaux et de lignes ( SpatialPolygonsDataFrame , SpatialLinesDataFrame ). Lorsqu'une méthode requiert que vos données soient dans un sp format, appelez simplement la fonction arc.data2sp.

Par la suite, la fonction arc.sp2data est utilisée lorsque vous avez terminé d'effectuer l'analyse spatiale et que vous souhaitez convertir votre sp objet vers un bloc de données :

Le sp L'objet de cadre de données vous permet d'indexer vos données comme s'il s'agissait d'un objet de cadre de données R régulier, car ils contiennent un emplacement pour vos attributs de données. Si cet emplacement supplémentaire n'est pas nécessaire pour votre travail, une alternative consiste à convertir vos données en un objet de points spatiaux ( SpatialPoints ), de lignes spatiales ( SpatialLines ) ou de polygones spatiaux ( SpatialPolygons ) au lieu d'un objet de bloc de données spatiales. Cela peut être accompli avec la fonction arc.shape2sp :

Le pont fournit également un cadre simple pour reprojeter vos données. Deux fonctions, arc.fromP4ToWkt et arc.fromWktToP4 facilitent ce processus en vous permettant d'obtenir facilement soit le PROJ.4 chaîne du système de référence de coordonnées ou le texte connu (WKT) chaîne de représentation de vos données. (Remarque : Actuellement, ces fonctions ne fonctionnent qu'avec ArcGIS Pro). Le pont vous offre plusieurs options pour obtenir les informations géométriques souhaitées dans le format dont vous avez besoin. Par exemple, vous pouvez utiliser le slot shapeinfo de votre arc.dataset objet pour obtenir la chaîne de représentation de texte bien connue, puis convertir en un PROJ.4 chaîne de système de référence de coordonnées.

Le pont peut également reconnaître des identifiants connus et les convertir de la même manière :

La sortie de ces fonctions peut ensuite être utilisée avec la fonction arc.select pour reprojeter vos données. Cette fonction contient un argument facultatif pour spécifier la référence spatiale dans laquelle vous souhaitez placer vos données. Ces fonctionnalités simplifient grandement la tâche de reprojeter vos données et vous permettent d'obtenir facilement les informations de géométrie pour vos données dans le format dont vous avez besoin.

Les sections précédentes vous ont montré comment importer/exporter vos données et les convertir en un sp objet afin que vous puissiez effectuer une analyse statistique dans R. Vous avez également appris à utiliser le pont pour reprojeter vos données. La section suivante décrit plusieurs fonctions qui aident les développeurs qui souhaitent appeler la fonctionnalité R depuis ArcGIS. Cela vous permettra d'exploiter toute la puissance du système d'information géographique et de rendre votre code R accessible à un public plus large.


Légendes et barres d'échelle

Vous pouvez utiliser le package ggsn pour ajouter comme par magie une légende et une barre d'échelle à votre carte finale. Vous pouvez également utiliser ce package pour créer un arrière-plan de carte « vierge » - en supprimant tous les éléments d'arrière-plan de la grille. Essayons.

Vous pouvez ajouter une barre d'échelle à l'aide de la fonction scalebar(). Notez qu'il existe également une fonction de barre d'échelle dans le package raster, vous dites donc explicitement à R d'utiliser la fonction du package ggsn en utilisant la syntaxe

Notez également qu'il y a actuellement un bogue dans le package ggsn où la documentation nous dit d'utiliser dd2km = FALSE pour les données qui ne sont pas en lat/long géographique. Cependant, pour que cela fonctionne, vous devez simplement omettre l'argument de la fonction comme suit :

Pour les données en mètres UTM : ggsn::scalebar(data = sjer_roads_df, dist = .5, location = "bottomright")

Pour les données en latitude/longitude géographique - datum wgs 84 : ggsn::scalebar(data = sjer_roads_df, dd2km = TRUE, model = "WGS84", dist = .5, location = "bottomright")

Ci-dessous, je définis explicitement l'emplacement de la légende en utilisant les arguments suivants :

  • emplacement : placez la barre d'échelle dans le coin inférieur droit du graphique
  • ancre : cela me permet de spécifier explicitement l'emplacement du coin inférieur de ma barre d'échelle
  • st.size et st.dist : cela me permet de définir respectivement la taille du texte et la distance du texte par rapport à la barre d'échelle

ggsn::scalebar(data = sjer_roads_df, dist = .5, location = "bottomright", st.dist = .05, st.size = 5, height = .06, anchor = c(x = x_scale_loc, y = (y_scale_loc - 360)))

Enfin, vous pouvez ajouter une flèche nord en utilisant :

ggsn::north(sjer_roads_df, échelle = .08)

Vous pouvez également ajuster la taille et l'emplacement de la flèche nord.


Ensembles de données de pays/zones individuels

Je suis Robin Wilson, pigiste en SIG, télédétection et science des données. Pour plus d'informations, consultez mon site Web et mon blog indépendant.

Pourquoi avez-vous créé cela ?

Je n'arrêtais pas de tomber sur des ensembles de données SIG en ligne qui semblaient être utiles - pour mes recherches, celles de mes amis ou simplement pour le plaisir ! J'ai pensé que je garderais une liste de ceux qui avaient l'air bien - et j'ai ensuite décidé de la mettre en ligne afin que d'autres personnes puissent en bénéficier également. Avance rapide de quelques mois et voici ce que vous avez : plus de trois cents liens et des centaines de visites par jour.

Où avez-vous trouvé les jeux de données ?

Une variété d'endroits vraiment. Certains que je connaissais déjà, et d'autres que j'avais utilisés dans mes recherches (ou lu dans la littérature scientifique). D'autres que j'ai rencontrés en ligne, notamment via GIS.SE et le groupe GIS LinkedIn. Un certain nombre d'articles sont venus d'un large éventail de personnes qui m'ont envoyé des liens, me demandant de les ajouter à ce site.

Quelles sont les exigences pour un ensemble de données dans cette liste ?

Comme vous pouvez le deviner d'après le titre - je ne liste que libre Ensembles de données SIG ici. Ce mot est plutôt ambigu (demandez à Richard Stallman !), mais ici j'utilise le sens de « gratuit comme dans la bière », et j'inclus des sites qui fournissent des données gratuitement à des fins non commerciales. Curieusement, étant donné le titre, je ne fais pas de lien vers des ensembles de données qui coûtent de l'argent !

Y a-t-il quelque chose que je puisse faire pour aider?

Je suis content que vous ayez demandé - bien sûr qu'il y en a ! Trois choses vraiment : vous pouvez parler du site à vos amis et collègues (voir les liens Facebook et Twitter en haut à droite ?), vous pouvez m'envoyer par e-mail des informations sur les nouveaux ensembles de données vers lesquels lier (voir ci-dessous), et vous pouvez en faire don de l'argent (voir ce bouton en haut à droite ?) pour m'aider à couvrir les frais d'hébergement.


Voir la vidéo: Convertir un fichier Shapefile SHP vers un fichier Autocad DWG (Octobre 2021).