Abrindo shapefile em R? [fechadas]

64

Preciso abrir um shapefile do ArcMap no R para usá-lo para análises geoestatísticas adicionais. Eu o converti em arquivo de texto ASCII, mas em R é reconhecido como data.frame. A função de coordenadas não funciona assim que xey são reconhecidos como não numéricos.

Você poderia ajudar a lidar com isso?

slava
fonte
11
Que tipo de shapefile? Estou assumindo pontos, uma vez que tem uma coluna X e Y?
precisa saber é o seguinte

Respostas:

54

Use o shapefile diretamente. Você pode fazer isso facilmente com os pacotes rgdalou sfe ler a forma em um objeto. Para ambos os pacotes, você precisa fornecer dsn- a fonte de dados, que no caso de um shapefile é o diretório , e layer- qual é o nome do shapefile, menos a extensão:

# 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, no OSX ou Linux, você não pode usar a abreviação '~' para o diretório inicial como o diretório da fonte de dados ( dsn) - caso contrário, receberá uma mensagem inútil "Não é possível abrir a fonte de dados". O sfpacote não tenha essa limitação, entre outras vantagens.)

Isso fornecerá um objeto que é um DataFrame * espacial (pontos, linhas ou polígonos) - os campos da tabela de atributos são acessíveis a você da mesma maneira que um quadro de dados comum, ou seja, shape$IDpara a coluna ID.

Se você deseja usar o arquivo ASCII importado, basta converter os campos x e y de texto (caractere) em números, por exemplo:

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

Editar 18/01/2015 : observe que o rgdal é um pouco melhor que o maptools (o que sugeri aqui inicialmente), principalmente porque ele lê e grava informações de projeção automaticamente.

Notas:

  • os aninhados as.numeric(as.character())funções - se o seu texto ASCII foi lido como um fator (provável), isso garante que você obtenha os valores numéricos, em vez dos níveis de fator.
  • rgdale sfpossui maneiras confusas de acessar diferentes tipos de arquivos e bancos de dados (por exemplo, para um arquivo GPX, o dsn é o nome do arquivo e coloca em camadas os componentes individuais, como waypoints, trackpoints, etc.), e é necessária uma leitura cuidadosa dos exemplos on-line.
Simbamangu
fonte
R deve analisar os campos numéricos, portanto, eu imagino que exista um tipo de caractere especial em x e y. Além disso, na importação, a menos que especificado de forma diferente, os campos de caracteres serão coagidos a um fator. Como tal, uma simples desaceleração "as.numeric" não funcionará. Eu também usaria "readORG" em "rgdal" em vez de maptools.
Jeffrey Evans
@Jeffrey, o readOGR é definitivamente o melhor caminho a seguir - veja algumas discussões sobre questões R posteriores aqui no gis.SE. Bom ponto sobre coerção fatorial; será atualizado com aninhado as.characterpara contornar o problema.
Simbamangu 18/01
Você poderia usar ~, mas teria que chamar path.expand no diretório, por exemplo, readOGR (dsn = path.expand ("~ / Downloads / cb_2016_us_zcta510_500k /"), layer = "cb_2016_us_zcta510_500k")
hd1
3
De alguma forma eu ainda precisava de um esclarecimento esta resposta realmente correta: dsn="directory where the shapefile, projection file, etc are located" layer="name of the file without .shp extention"
Ufos
Quero observar que o dsnargumento não deve conter barras finais - por exemplo, dsn = "C:/Users/Downloads/"deveria ser dsn = "C:/Users/Downloads". Espero que isso resolva a frustração de alguém ...
Kim
21

Concordo com o Simbamangu e resolvi em termos de manter o shapefile, mas quero direcionar sua atenção especificamente para a biblioteca rgdal. Siga o link sugerido por gissolved para o NCEAS e siga as instruções para rgdal. Pode ser um desafio instalar em algumas máquinas, mas pode melhorar substancialmente os resultados quando se trata de projeções.

A biblioteca maptools é excelente e permite definir a projeção para o shapefile em que você está lendo, mas para isso, é necessário saber como especificar essa projeção no formato proj4. um exemplo pode ser 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)

Se você quiser seguir esse caminho, recomendo http://spatialreference.org como o local para descobrir a aparência da sua projeção no formato proj4. Se isso lhe parecer um aborrecimento, o rgdal facilitará a leitura do arquivo .prj do shapefile da ESRI (o arquivo que contém a definição de projeção da ESRI para o shapefile. Para usar o rgdal no mesmo arquivo, basta escrever:

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

Você provavelmente pode andar de skate sem fazer isso se estiver apenas trabalhando com um único arquivo de forma, mas assim que começar a olhar para várias fontes de dados ou sobrepor o Google Maps, será essencial manter suas projeções em boa forma.

Para algumas orientações úteis sobre dados espaciais no R, incluindo várias coisas sobre importação e trabalho com padrões de pontos, tenho alguns materiais antigos do curso on-line em https://csde.washington.edu/workshop/point-patterns-and-raster -superfícies / (mais workshops podem ser encontrados aqui ) que podem ajudá-lo a ver como esses métodos se comparam na prática.

csfowler
fonte
+1 para informações de referência espacial ... especialmente para enfatizar a manutenção das projeções!
Simbamangu 23/01
@csfowler, tentei usar o readOGR, mas ele não está importando o arquivo .prj. Alguma idéia do porquê? Também estou na UW, no departamento de biologia.
Herman Toothrot
@ user4050, difícil de saber sem ver seu código. Presumo que exista um arquivo .prj no mesmo diretório? e que você usou o valor encoding = "ESRI Shapefile" para garantir que a rgdal saiba que é um shapefile?
Csfowler 31/10/2013
17

Você pode usar a sfbiblioteca para abrir Shapefiles diretamente no R. É mais rápido que a rgdalbiblioteca, confira aqui: Recursos simples para R - Benchmarks . Para mais informações sobre o sfpacote, consulte a página inicial do projeto r-spatial .

# Load library
library('sf')

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

Uma solução fácil em 2017 é a shapefile()função na rasterbiblioteca.

#Load library
library(raster)

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

ATUALIZAÇÃO: Essa ainda é uma boa opção em 2019.

Christopher
fonte
Isso pode ser usado para importar de uma fonte online? I
I Del Toro
@IDelToro Não diretamente. Você precisará baixá-lo para o disco rígido primeiro e depois carregá-lo a partir daí.
Christopher
6

Mais uma alternativa é usar a biblioteca fastshp , que oferece:

Rotinas para manipulação de grandes arquivos de forma ESRI (.shp). Isso inclui leitura, afinamento de pontos e correspondência de pontos para conter formas. O principal objetivo deste pacote é fornecer a velocidade para suportar grandes arquivos de forma (milhões de pontos). São várias ordens de maginute mais rápidas que alguns outros pacotes shapefile.

Aqui está minha pergunta no SE sobre como usá-lo com o ggplot2:

Como plotar o shapefile carregado através do fastshp no ggplot2?

radek
fonte
11
Acho um pouco irritante que a função read.shp não resulte em um objeto sp. Dado que a comunidade espacial R está convergindo para isso como o padrão de fato para lidar com objetos espaciais, acho isso um tanto desleixado. Dada RAM suficiente e um sistema operacional de 64 bits, a leitura de grandes dados não é um problema. Com 8GB de RAM, li 30M de pontos e 2,5M de polígonos usando o rgdal sem problemas. Aqui é alguma orientação sobre o uso de objetos sp com ggplot2: github.com/hadley/ggplot2/wiki/plotting-polygon-shapefiles
Jeffrey Evans