Fichier de formes d'ouverture dans R? [fermé]

64

Je dois ouvrir un fichier de formes à partir d'ArcMap in R pour l'utiliser à des fins d'analyse géostatistique. Je l'ai converti en fichier texte ASCII, mais il est reconnu en tant que data.frame. La fonction de coordonnées ne fonctionne pas dès que x et y sont reconnus comme non numériques.

Pourriez-vous aider à y faire face?

slava
la source
1
Quel genre de fichier de formes? J'assume des points puisqu'il comporte une colonne X et Y?
Simbamangu

Réponses:

54

Utilisez le fichier de forme directement. Vous pouvez le faire facilement avec les packages rgdalou sf, et lire la forme dans un objet. Pour les deux packages, vous devez fournir dsn- la source de données, qui dans le cas d'un fichier de formes est le répertoire , et layer- qui est le nom du fichier de formes, extension moins:

# Read SHAPEFILE.shp from the current working directory (".")

require(rgdal)
shape <- readOGR(dsn = ".", layer = "SHAPEFILE")

require(sf)
shape <- read_sf(dsn = ".", layer = "SHAPEFILE")

(Pour rgdal, dans OSX ou Linux vous ne pouvez pas utiliser le « ~ » un raccourci pour le répertoire comme source de données ( dsn) annuaire - un message , sinon vous aurez une inutile « peut - source non de données ouvertes » Le. sfPackage ne fonctionne pas avoir cette limitation, entre autres avantages.)

Cela vous donnera un objet qui est un Spatial * DataFrame (points, lignes ou polygones) - les champs de la table attributaire vous sont alors accessibles de la même manière qu’un dataframe ordinaire, c’est- shape$IDà- dire pour la colonne ID.

Si vous souhaitez utiliser le fichier ASCII que vous avez importé, vous devez simplement convertir les champs de texte (caractères) x et y en nombres, par exemple:

shape$x <- as.numeric(as.character(shape$x))
shape$y <- as.numeric(as.character(shape$y))
coordinates(shape) <- ~x + y

Edit 2015-01-18 : notez que rgdal est un peu meilleur que maptools (ce que j'avais initialement suggéré ici), principalement parce qu'il lit et écrit automatiquement les informations de projection.

Remarques:

  • les as.numeric(as.character())fonctions imbriquées - si votre texte ASCII a été lu comme un facteur (probable), cela garantit que vous obtenez les valeurs numériques au lieu des niveaux de facteur.
  • rgdalet sfont des moyens déroutants d’accéder à différents types de fichiers et de bases de données (par exemple, pour un fichier GPX, DSN est le nom du fichier, et couche les composants individuels tels que les points de cheminement, les points de suivi, etc.), et une lecture attentive des exemples en ligne est nécessaire.
Simbamangu
la source
R devrait analyser les champs numériques, j'imagine qu'il existe un type de caractère spécial dans x et y. De plus, lors de l'importation, sauf indication contraire, les champs de caractères sont forcés dans un facteur. En tant que tel, une simple décélération "as.numeric" ne fonctionnera pas. J'utiliserais aussi "readORG" dans "rgdal" plutôt que maptools.
Jeffrey Evans le
@ Jeffrey, readOGR est sans aucun doute la meilleure solution. Voir quelques discussions sur les questions R ultérieures ici sur gis.SE. Bon point sur la coercition des facteurs; mettra à jour avec imbriqué as.characterpour contourner le problème.
Simbamangu
Vous pouvez utiliser ~ mais vous devez appeler path.expand sur le répertoire, par exemple readOGR (dsn = path.expand ("~ / Downloads / cb_2016_us_zcta510_500k /"), layer = "cb_2016_us_zcta510_500k")
hd1
3
D'une manière ou d'une autre, j'avais encore besoin d'une clarification pour que cette réponse soit tout à fait correcte: dsn="directory where the shapefile, projection file, etc are located" layer="name of the file without .shp extention"
Ufos, le
Je tiens à noter que l' dsnargument ne devrait pas contenir de barres obliques finales - par exemple, dsn = "C:/Users/Downloads/"devrait l'être dsn = "C:/Users/Downloads". J'espère que ça résoudra la frustration de quelqu'un ...
Kim
21

Je suis d’accord avec Simbamangu et j’ai décidé de conserver le fichier de formes, mais j’aimerais attirer votre attention sur la bibliothèque rgdal. Suivez le lien suggéré par gissolved pour le NCEAS et suivez les instructions pour rgdal. L'installation sur certaines machines peut être difficile, mais elle peut considérablement améliorer les résultats en termes de projections.

La bibliothèque maptools est excellente et vous permet de définir la projection pour le fichier de formes que vous lisez, mais vous devez pour ce faire savoir comment spécifier cette projection au format proj4. un exemple pourrait ressembler à quelque chose comme:

project2<-"+proj=eqdc +lat_0=0 +lon_0=0 +lat_1=33 +lat_2=45 +x_0=0 +y_0=0 +ellps=GRS80    
   +datum=NAD83 +units=m +no_defs" #USA Contiguous Equidistant Conic Projection
data.shape<-readShapePoly("./MyMap.shp",IDvar="FIPS",proj4string=CRS(project2))
plot(data.shape)

Si vous souhaitez emprunter cette voie, je vous recommande alors http://spatialreference.org comme endroit pour déterminer à quoi ressemble votre projection dans le format proj4. Si cela vous semble compliqué, rgdal vous facilitera la tâche en lisant le fichier .prj du fichier de formes ESRI (le fichier qui contient la définition de projection ESRI pour le fichier de formes. Pour utiliser rgdal sur le même fichier, écrivez simplement:

library(rgdal)
data.shape<-readOGR(dsn="C:/Directory_Containing_Shapefile",layer="MyMap")
plot(data.shape)

Vous pouvez probablement skater sans utiliser ceci si vous ne travaillez qu'avec un seul fichier de formes, mais dès que vous commencez à examiner plusieurs sources de données ou à superposer avec Google Maps, il est essentiel de conserver vos projections en bon état.

Pour quelques astuces utiles sur les données spatiales dans R, y compris un tas de choses sur l'importation et l'utilisation de modèles de points, j'ai d'anciens supports de cours en ligne à l' adresse https://csde.washington.edu/workshop/point-patterns-and-raster. -surfaces / (plusieurs ateliers peuvent être trouvés ici ) qui pourraient vous aider à voir comment ces méthodes se comparent dans la pratique.

csfowler
la source
+1 pour les informations de référence spatiale ... en particulier pour souligner le tri des projections!
Simbamangu
@csfowler, j'ai essayé d'utiliser readOGR mais il n'importait pas le fichier .prj. Une idée pourquoi? Je suis aussi à UW, au département de biologie.
Herman Toothrot
@ user4050, difficile à connaître sans voir votre code. Je suppose qu'il y a un fichier .prj dans le même répertoire? et que vous avez utilisé la valeur encoding = "ESRI Shapefile" pour vous assurer que rgdal sait qu’il s’agit d’un fichier de formes?
csfowler
17

Vous pouvez utiliser sflibrary pour ouvrir les Shapefiles directement dans R. C’est plus rapide que la rgdalbibliothèque, cochez cette case: Fonctionnalités simples pour R - Repères . Pour plus d'informations sur le sfpackage, consultez la page d'accueil du projet r-spatial .

# Load library
library('sf')

# Load shapefile
shapename <- read_sf('~/path/to/file.shp')
Guzmán
la source
11

Une solution simple en 2017 est la shapefile()fonction de la rasterbibliothèque.

#Load library
library(raster)

#Load shapefile
shp <- shapefile("myshapefile")

MISE À JOUR: Ceci est toujours une bonne option en 2019.

Christopher
la source
Cela peut-il être utilisé pour importer depuis une source en ligne? I
I Del Toro
@IDelToro Pas directement. Vous devrez d'abord le télécharger sur votre disque dur, puis le charger à partir de là.
Christopher
6

Une autre alternative consiste à utiliser la bibliothèque fastshp qui offre:

Routines de traitement des fichiers de formes ESRI volumineux (.shp). Cela inclut la lecture, l’amincissement des points et la correspondance des points avec les formes contenant. L'objectif principal de ce paquet est de fournir la vitesse nécessaire pour prendre en charge des fichiers de formes volumineux (des millions de points). Plusieurs ordres de maginute sont plus rapides que certains autres paquets de fichiers de formes.

Voici ma question sur SE sur la façon de l'utiliser avec ggplot2:

Comment tracer un fichier de formes chargé via Fastshp dans ggplot2?

radek
la source
1
Je trouve un peu gênant que la fonction read.shp n'aboutisse pas à un objet sp. Étant donné que la communauté spatiale R converge vers cela en tant que norme de facto pour la gestion des objets spatiaux, je trouve cela un peu bâclé. Avec suffisamment de RAM et un système d’exploitation 64 bits, la lecture de données volumineuses n’est pas un problème. Avec 8 Go de RAM, j'ai lu 30 millions de points et 2,5 millions de polygones en utilisant rgdal sans aucun problème. Voici quelques indications sur l'utilisation d'objets sp avec ggplot2: github.com/hadley/ggplot2/wiki/plotting-polygon-shapefiles
Jeffrey Evans