75 votos

¿Abrir un shapefile en R?

Necesito abrir un shapefile de ArcMap en R para utilizarlo en posteriores análisis geoestadísticos. Lo he convertido en un archivo de texto ASCII, pero en R se reconoce como data.frame. La función de coordenadas no funciona en cuanto x e y son reconocidas como no numéricas.

¿Podría ayudar a resolverlo?

1 votos

¿Qué tipo de shapefile? ¿Supongo que puntos, ya que tiene una columna X e Y?

64voto

Utilice el shapefile directamente. Puede hacerlo fácilmente con la función rgdal o sf y leer la forma en un objeto. Para ambos paquetes es necesario proporcionar dsn - la fuente de datos, que en el caso de un shapefile es el directorio y layer - que es el nombre del shapefile, menos la extensión:

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

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

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

(En el caso de rgdal, en OSX o Linux no se puede utilizar la abreviatura '~' para el directorio personal como fuente de datos ( dsn ), de lo contrario aparecerá un mensaje poco útil: "No se puede abrir la fuente de datos". La página web sf no tiene esta limitación, entre otras ventajas).

Esto le dará un objeto que es un Spatial*DataFrame (puntos, líneas o polígonos) - los campos de la tabla de atributos son entonces accesibles de la misma manera que un dataframe ordinario, es decir shape$ID para la columna ID.

Si quieres utilizar el archivo ASCII que has importado, simplemente debes convertir los campos x e y de texto (caracteres) en números, por ejemplo

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

Editar 2015-01-18 Nota: rgdal es un poco mejor que maptools (que inicialmente sugerí aquí), principalmente porque lee y escribe la información de la proyección automáticamente.

Notas:

  • el anidado as.numeric(as.character()) si su texto ASCII fue leído como un factor (probablemente), esto asegura que usted obtenga los valores numéricos en lugar de los niveles del factor.
  • rgdal y sf tienen formas confusas de acceder a diferentes tipos de archivos y bases de datos (por ejemplo, para un archivo GPX, el dsn es el nombre del archivo, y las capas los componentes individuales como waypoints, trackpoints, etc), y es necesario leer cuidadosamente los ejemplos en línea.

0 votos

R debe analizar los campos numéricos, por lo que me imagino que hay un tipo de carácter especial en x e y. Además, en la importación, a menos que se especifique lo contrario, los campos de carácter serán coaccionados en un factor. Por lo tanto, una simple desaceleración "as.numeric" no funcionará. También utilizaría "readORG" en "rgdal" en lugar de maptools.

0 votos

@Jeffrey, readOGR es definitivamente la mejor manera de ir - ver algunas discusiones sobre las preguntas posteriores R aquí en gis.SE. Buen punto sobre la coerción de factores; actualizaré con as.character para evitar el problema.

0 votos

Podría utilizar ~, pero tendría que llamar a path.expand en el directorio, por ejemplo, readOGR(dsn=path.expand("~/Downloads/cb_2016_us_zcta510_500k/"), layer="cb_2016_us_zcta510_500k")

24voto

Chris McKee Puntos 1133

Puede utilizar sf biblioteca para abrir Shapefiles directamente en R . Es más rápido que rgdal biblioteca, consulte aquí: Funciones sencillas para R - Puntos de referencia . Para más información sobre el sf paquete consulte la página web del proyecto r-espacio .

# Load library
library('sf')

# Load shapefile
shapename <- read_sf('~/path/to/file.shp')

21voto

Josef Puntos 4395

Estoy de acuerdo con Simbamangu y gissolved en cuanto a conservar el shapefile pero quiero dirigir tu atención específicamente a la biblioteca rgdal. Siga el enlace sugerido por gissolved para el NCEAS y siga las instrucciones para rgdal. Puede ser difícil de instalar en algunas máquinas, pero puede mejorar sustancialmente los resultados cuando se trata de proyecciones.

La librería maptools es excelente y permite definir la proyección del shapefile que se está leyendo, pero para ello hay que saber especificar esa proyección en el formato proj4. un ejemplo podría ser algo así:

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 quiere seguir este camino, le recomiendo http://spatialreference.org como el lugar al que acudir para averiguar cómo es su proyección en el formato proj4. Si eso le parece una molestia, rgdal se lo pondrá fácil leyendo el archivo .prj del shapefile de ESRI (el archivo que contiene la definición de proyección de ESRI para el shapefile. Para utilizar rgdal en el mismo archivo, sólo tiene que escribir:

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

Es probable que pueda prescindir de esto si sólo trabaja con un único archivo shape, pero en cuanto empiece a examinar múltiples fuentes de datos o a superponerlos con Google Maps, será esencial mantener las proyecciones en buen estado.

Para obtener algunos tutoriales útiles sobre datos espaciales en R, incluyendo un montón de cosas sobre la importación y el trabajo con patrones de puntos, tengo algunos materiales de cursos antiguos en línea en https://csde.washington.edu/workshop/point-patterns-and-raster-surfaces/ (se pueden encontrar más talleres aquí ) que puede ayudarle a ver cómo se comparan estos métodos en la práctica.

0 votos

+1 por la información de referencia espacial... ¡especialmente por hacer hincapié en mantener las proyecciones ordenadas!

0 votos

@csfowler, he intentado utilizar el readOGR pero no importa el archivo .prj. ¿Alguna idea de por qué? Yo también estoy en la UW, en el departamento de biología.

0 votos

@user4050, difícil de saber sin ver tu código. Supongo que hay un archivo .prj en el mismo directorio? y que utilizó la codificación = "ESRI Shapefile" valor para asegurarse de que rgdal sabe que es un shapefile?

17voto

John Nolan Puntos 16633

Creo que no deberías convertir el shapefile a un ASCII, sino usar el shapefile directamente con una de las extensiones espaciales. Aquí puedes encontrar tres formas de leer (y escribir) un shapefile http://www.nceas.ucsb.edu/scicomp/usecases/ReadWriteESRIShapeFiles . El proyecto R-spatial probablemente también le interesará http://cran.r-project.org/web/packages/sp/index.html .

16voto

rafek Puntos 126

Una solución fácil en 2017 es la shapefile() en la función raster biblioteca. En realidad, como dice el archivo de ayuda, es una "simple función de envoltura alrededor de readOGR y writeOGR (paquete rgdal)"

#Load library
library(raster)

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

ACTUALIZACIÓN: Esta sigue siendo una buena opción en 2019.

0 votos

¿Se puede utilizar para importar desde una fuente en línea? I

0 votos

@IDelToro No directamente. Tendrás que descargarlo primero en tu disco duro y luego cargarlo desde allí.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X