Abrir archivo de forma en R? [cerrado]

64

Necesito abrir un archivo shape desde ArcMap en R para usarlo para un análisis geoestadístico adicional. Lo he convertido en un archivo de texto ASCII, pero en R se reconoce como data.frame. La función de coordenadas no funciona tan pronto como x e y se reconocen como no numéricos.

¿Podrías ayudar a lidiar con eso?

Slava
fuente
1
¿Qué tipo de shapefile? Estoy asumiendo puntos ya que tiene una columna X e Y?
Simbamangu

Respuestas:

54

Use el archivo de forma directamente. Puede hacerlo fácilmente con los paquetes rgdalo sf, y leer la forma en un objeto. Para ambos paquetes debe proporcionar dsn: la fuente de datos, que en el caso de un shapefile es el directorio , y layer- cuál 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")

(Para rgdal, en OSX o Linux no puede usar la abreviatura '~' para el directorio de inicio como el directorio de origen de datos ( dsn); de lo contrario, recibirá un mensaje inútil "No se puede abrir el origen de datos". El sfpaquete no tener esta limitación, entre otras ventajas).

Esto le dará un objeto que es un Marco de Datos Espacial * (puntos, líneas o polígonos): los campos de la tabla de atributos son accesibles para usted de la misma manera que un marco de datos ordinario, es decir, shape$IDpara la columna ID.

Si desea utilizar el archivo ASCII que importó, simplemente debe convertir los campos de texto (caracteres) xey 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 : tenga en cuenta que rgdal es un poco mejor que maptools (que inicialmente sugerí aquí), principalmente porque lee y escribe información de proyección automáticamente.

Notas:

  • las as.numeric(as.character())funciones anidadas : si su texto ASCII se leyó como un factor (probablemente), esto garantiza que obtenga los valores numéricos en lugar de los niveles de los factores.
  • rgdaly sftiene 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 pone en capas los componentes individuales como waypoints, trackpoints, etc.), y se necesita una lectura cuidadosa de ejemplos en línea.
Simbamangu
fuente
R debería analizar los campos numéricos, así 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 caracteres se convertirán en un factor. Como tal, una simple desaceleración "as.numeric" no funcionará. También usaría "readORG" en "rgdal" en lugar de maptools.
Jeffrey Evans el
@Jeffrey, readOGR es definitivamente el mejor camino a seguir: vea algunas discusiones sobre preguntas R posteriores aquí en gis.SE. Buen punto sobre la coerción del factor; se actualizará con anidado as.characterpara solucionar el problema.
Simbamangu
Podría usar ~, 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")
hd1
3
De alguna manera todavía necesitaba una aclaración esta respuesta realmente correcta: dsn="directory where the shapefile, projection file, etc are located" layer="name of the file without .shp extention"
Ufos
Quiero señalar que el dsnargumento no debe contener barras diagonales finales, por ejemplo, dsn = "C:/Users/Downloads/"debe ser dsn = "C:/Users/Downloads". Espero que esto resuelva la frustración de alguien ...
Kim
21

Estoy de acuerdo con el Simbamangu y estoy resuelto en términos de conservar el archivo de forma, pero quiero dirigir su atención específicamente a la biblioteca rgdal. Siga el enlace sugerido por gissolved para NCEAS y siga las instrucciones para rgdal. Puede ser un desafío instalarlo en algunas máquinas, pero puede mejorar sustancialmente los resultados cuando se trata de proyecciones.

La biblioteca maptools es excelente y le permite definir la proyección para el archivo de forma en el que está leyendo, pero para hacerlo necesita saber cómo especificar esa proyección en el formato proj4. un ejemplo podría parecerse a algo como:

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 desea seguir esta ruta, le recomiendo http://spatialreference.org como el lugar a donde ir para descubrir cómo se ve su proyección en el formato proj4. Si eso le parece una molestia, rgdal facilitará la lectura del archivo .prj del archivo de forma ESRI (el archivo que contiene la definición de proyección de ESRI para el archivo de forma. Para usar rgdal en el mismo archivo, simplemente escriba:

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

Es probable que pueda patinar sin hacer esto si solo está trabajando con un solo archivo de forma, pero tan pronto como comience a buscar múltiples fuentes de datos o superponer con Google Maps, mantener sus proyecciones en buena forma se vuelve esencial.

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

csfowler
fuente
+1 para información de referencia espacial ... ¡especialmente para enfatizar el mantenimiento de las proyecciones ordenadas!
Simbamangu
@csfowler, intenté usar el readOGR pero no está importando el archivo .prj. ¿Alguna idea de por qué? También estoy en UW, en el departamento de biología.
Herman Toothrot
@ user4050, difícil de saber sin ver su código. ¿Asumo que hay un archivo .prj en el mismo directorio? y que usaste el valor encoding = "ESRI Shapefile" para asegurarte de que rgdal sepa que es un shapefile?
csfowler
17

Puede usar la sfbiblioteca para abrir Shapefiles directamente en R. Es más rápido que la rgdalbiblioteca, verifique aquí: Características simples para R - Benchmarks . Para obtener más información sobre el sfpaquete, consulte la página de inicio del proyecto r-spaceial .

# Load library
library('sf')

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

Una solución fácil en 2017 es la shapefile()función en la rasterbiblioteca.

#Load library
library(raster)

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

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

Christopher
fuente
¿Se puede usar para importar desde una fuente en línea? I
I Del Toro
@IDelToro No directamente. Primero deberá descargarlo en su disco duro y luego cargarlo desde allí.
Christopher
6

Una alternativa más es usar la biblioteca fastshp que ofrece ::

Rutinas para el manejo de grandes archivos de forma ESRI (.shp). Esto incluye la lectura, el adelgazamiento de puntos y la coincidencia de puntos con formas que contienen. El objetivo principal de este paquete es proporcionar la velocidad para admitir grandes archivos de forma (millones de puntos). Es varias órdenes de maginute más rápido que algunos otros paquetes de shapefile.

Aquí está mi pregunta sobre SE sobre cómo usarlo con ggplot2:

¿Cómo puedo trazar el shapefile cargado a través de fastshp en ggplot2?

radek
fuente
1
Me resulta un poco molesto que la función read.shp no resulte en un objeto sp. Dado que la comunidad espacial R está convergiendo en esto como el estándar de facto para manejar objetos espaciales, esto me parece un tanto descuidado. Dada suficiente RAM y un sistema operativo de 64 bits, leer datos de gran tamaño no es un gran problema. Con 8 GB de RAM, he leído 30 millones de puntos y 2.5 millones de polígonos usando rgdal sin problemas. Aquí hay algunas instrucciones sobre el uso de objetos sp con ggplot2: github.com/hadley/ggplot2/wiki/plotting-polygon-shapefiles
Jeffrey Evans