Associe o arquivo CSV ao shapefile

9

Eu queria associar um arquivo CSV a um shapefile.

Quando identifiquei um campo para facilitar a junção, por exemplo,

map <- spChFIDs(map, as.character(map$ID))

voltou

Erro em spChFIDs (SP, x): os comprimentos diferem

Alguém pode aconselhar?

user3915459
fonte
Obrigado. Mas o ID da coluna possui valores exclusivos que podem ser usados ​​como o campo de junção. As entradas do campo devem ter o mesmo comprimento?
user3915459
Você poderia postar uma amostra do seu mapa e CSV?
Cengel
@cengel É um enorme conjunto de dados e uma captura de tela não será suficiente para mostrar as variações. O campo "ID" no shapefile "map" é uma sequência de números (com vários números de dígitos).
user3915459
Talvez salve o CSV em uma tabela, para que você saiba que os campos de junção são do mesmo tipo de dados.
klewis

Respostas:

7

Aqui está como você pode fazer isso em R usando sp::merge

library(raster)
# read data    
p <- shapefile("path/file.shp")
d <- read.csv("path/file.csv")

# merge on common variable, here called 'key'
m <- merge(p, d, by='key')

# perhaps save as shapefile again
shapefile(m, "path/merged.shp")
Robert Hijmans
fonte
Olá @RobertH, fui enviado aqui da pergunta que publiquei ontem. Quando mesclo pela variável comum, puxo essa variável do shapefile ou do CSV? As duas variáveis ​​estão correspondendo no conteúdo, mas não pelo nome. Eu tentei brincar com ele um pouco e continuo recebendo erros (principalmente: Erro no [.data.frame(x @ dados, by.x, gota = false): Colunas indefinidos selecionado)
Lauren
1
Descobri isso. Como eu precisava juntar as duas camadas que tinham nomes diferentes, tive que alterar um pouco o formato. Parecia mais merge (p, d, by.x = "chave", by.y = "matching.key")
Lauren
3

Eu não sei como fazer com R para ingressar em um shapefile com um CSV. No entanto, se isso puder ajudá-lo, você também poderá fazer isso no QGIS usando o pluggin MMQGIS.

insira a descrição da imagem aqui

Leasye
fonte
Obrigado. Eu tentei com o ArcGIS antes, mas o conjunto de dados é enorme e eu prefiro fazer isso em R.
user3915459
2

Se você estiver trabalhando no R, seu shapefile e .csv precisam ser carregados como data.frame ou data.table. Você pode usar join () para mesclá-los.

Você tem mais informações sobre que tipo de shapefile você possui?

Tive sorte ao fazer o seguinte quando mesclo shapefiles e dados. Observe que você precisa deixar a extensão .shp no argumento "layer". Eu usei "GEOID" onde você colocaria qualquer que seja o nome da "forma" em interesse.

library("rgdal")
library("data.table")
shapefile = readOGR(dsn = "DIRECTORY WITH SHAPEFILES", layer = "THE ACTUAL SHAPEFILE")
shapefile@data$id = rownames(shapefile@data)
shapefile.points = fortify(shapefile, region = "id")
shapefile.df = join(shapefile.points, shapefile@data, by = "id")
shapefile.df = subset(shapefile.df, select = c(long, lat, group, GEOID))
names(shapefile.df) = c("long", "lat", "group", "GEOID")

Em seguida, você pode mesclar seus dados usando algo como

full.data = join(mydata, shapefile.df, by = "GEOID", type = "full")
Nancy
fonte
1

Se você estiver trabalhando em R, a mesclagem não é realmente necessária. Você pode usar o ggplot para exibir seus dados em um mapa. Veja, meu exemplo. Este forro faz maravilhas com arquivo de forma bangladesh = fortify(p1, region = "ADM1_EN"). E então você pode usar

ggplot() + geom_map(data = br2016a, aes(map_id = ADM1_EN, fill = HectareLocal), 
                    map =bangladesh) +
  expand_limits(x = bangladesh$long, y = bangladesh$lat) + 
  coord_fixed(.96) +
  scale_fill_gradient(low="thistle2", high="darkred", 
                      guide="colorbar", na.value="white") +
  labs(title = "Bangladesh Boro Rice (Local variety), 2016", x = element_blank(), y = element_blank(), 
       fill='Hectares') +   theme(legend.position = "bottom") 

E o mapa que recebo está aqui.

Resultado

Ambrish Dhaka
fonte