Verbinden Sie die CSV-Datei mit dem Shapefile

9

Ich wollte eine CSV-Datei mit einem Shapefile verbinden.

Wenn ich ein Feld identifiziert habe, um den Join zu erleichtern, z.

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

es kehrte zurück

Fehler in spChFIDs (SP, x): Längen unterscheiden sich

Kann mir jemand raten?

user3915459
quelle
Vielen Dank. Die Spalten-ID enthält jedoch eindeutige Werte, die als Verknüpfungsfeld verwendet werden können. Müssen die Eingänge des Feldes gleich lang sein?
user3915459
Könnten Sie ein Beispiel Ihrer Karte und CSV posten?
Cengel
@cengel Es ist ein riesiger Datensatz und ein Screenshot wird nicht ausreichen, um die Variationen zu zeigen. Das Feld "ID" in der Shapefile "Map" ist eine Folge von Zahlen (mit verschiedenen Ziffern).
user3915459
Speichern Sie die CSV möglicherweise in einer Tabelle, damit Sie wissen, dass die Verknüpfungsfelder denselben Datentyp haben.
Klewis

Antworten:

7

Hier ist, wie Sie es in R mit tun können 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
quelle
Hallo @RobertH, ich wurde von der Frage, die ich gestern gestellt habe, hierher geschickt. Wenn ich nach der allgemeinen Variablen zusammenführe, ziehe ich diese Variable aus dem Shapefile oder der CSV? Die beiden Variablen stimmen im Inhalt überein, jedoch nicht nach Namen. Ich habe versucht, ein bisschen damit [.data.frameherumzuspielen und immer wieder Fehler zu bekommen (hauptsächlich: Fehler in (x @ data ,, by.x, drop = FALSE): undefinierte Spalten ausgewählt)
Lauren
1
Herausgefunden. Da ich die beiden Ebenen mit unterschiedlichen Namen verbinden musste, musste ich das Format etwas ändern. Es sah eher nach Zusammenführung aus (p, d, by.x = "Schlüssel", by.y = "passender Schlüssel")
Lauren
3

Ich weiß nicht, wie ich mit R ein Shapefile mit einer CSV verbinden soll. Wenn dies jedoch hilfreich sein kann, können Sie dies auch in QGIS mithilfe des Plugins MMQGIS tun.

Geben Sie hier die Bildbeschreibung ein

Leasye
quelle
Vielen Dank. Ich habe es schon einmal mit ArcGIS versucht, aber der Datensatz ist riesig und ich bevorzuge dies in R.
user3915459
2

Wenn Sie in R arbeiten, müssen Ihr Shapefile und .csv als data.frame oder data.table geladen werden. Sie können join () verwenden, um sie zusammenzuführen.

Haben Sie weitere Informationen darüber, welche Art von Shapefile Sie haben?

Ich hatte folgendes Glück beim Zusammenführen von Shapefiles und Daten. Beachten Sie, dass Sie die Erweiterung .shp im Argument "layer" weglassen müssen. Ich habe "GEOID" verwendet, wo Sie den Namen der "Form" in Interesse setzen würden.

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

Dann können Sie Ihre Daten mit so etwas wie zusammenführen

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

Wenn Sie in R arbeiten, ist das Zusammenführen eigentlich nicht erforderlich. Sie können ggplot verwenden, um Ihre Daten auf einer Karte anzuzeigen. Siehe mein Beispiel. Dieser Einzeiler wirkt Wunder mit Formfeilen bangladesh = fortify(p1, region = "ADM1_EN"). Und dann können Sie verwenden

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

Und die Karte, die ich bekomme, ist hier.

Ausgabe

Ambrish Dhaka
quelle