Unir archivo CSV a shapefile

9

Quería unir un archivo CSV a un shapefile.

Cuando identifiqué un campo para facilitar la unión, por ejemplo,

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

volvió

Error en spChFID (SP, x): las longitudes difieren

¿Alguien puede aconsejar?

usuario3915459
fuente
Gracias. Pero la ID de la columna tiene valores únicos que se pueden usar como campo de unión. ¿Deben las entradas del campo tener la misma longitud?
user3915459
¿Podría publicar una muestra de su mapa y csv?
cengel
@cengel Es un gran conjunto de datos y una captura de pantalla no será suficiente para mostrar las variaciones. El campo "ID" en el "mapa" del archivo de forma es una cadena de números (con varios números de dígitos).
user3915459
Quizás guarde el CSV en una tabla, para que sepa que los campos de unión son del mismo tipo de datos.
klewis

Respuestas:

7

Así es como puedes hacerlo en 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
fuente
Hola @RobertH, me enviaron aquí por la pregunta que publiqué ayer. Cuando me fusiono con la variable común, ¿saco esa variable del archivo de forma o del CSV? Las dos variables coinciden en contenido, pero no por nombre. He intentado jugar un poco y sigo recibiendo errores (principalmente: Error en [.data.frame(x @ data, by.x, drop = FALSE): columnas indefinidas seleccionadas)
Lauren
1
Lo averigué. Como necesitaba unir las dos capas que tenían nombres diferentes, tuve que modificar un poco el formato. Se parecía más a merge (p, d, by.x = "key", by.y = "matching.key")
Lauren
3

No sé cómo hacer con R para unir un shapefile con un csv. Sin embargo, si esto puede ayudarlo, también puede hacerlo en QGIS utilizando el complemento MMQGIS.

ingrese la descripción de la imagen aquí

Leasye
fuente
Gracias. He intentado con ArcGIS antes, pero el conjunto de datos es enorme y prefiero hacerlo en R.
user3915459
2

Si está trabajando en R, su shapefile y .csv deben cargarse como data.frame o data.table. Puede usar join () para fusionarlos.

¿Tienes más información sobre qué tipo de shapefile tienes?

Tuve suerte haciendo lo siguiente cuando fusioné archivos de forma y datos. Tenga en cuenta que debe omitir la extensión .shp en el argumento "capa". Usé "GEOID" donde pondrías el nombre de la "forma" en interés.

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")

Entonces puedes fusionar tus datos usando algo como

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

Si está trabajando en R, la fusión no es necesaria. Puede usar ggplot para mostrar sus datos en un mapa. Mira, mi ejemplo. Este forro hace maravillas con el archivo de forma bangladesh = fortify(p1, region = "ADM1_EN"). Y luego puedes 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") 

Y, el mapa que obtengo está aquí.

Salida

Dhaka ambrish
fuente