Mehr

Das Bearbeiten der DBF für ein Shapefile führt in R und QGIS zu völlig unterschiedlichen Ergebnissen, aber die Attributtabellen sind identisch


ich habe ein seltsames Problem, bei dem ich hoffe, dass jemand etwas Licht ins Dunkel bringen kann. Ich erstelle meine Karte tatsächlich in R, verwende aber QGIS als Werkzeug, um meinen Kartierungsprozess zu überprüfen (R newb hier). Lassen Sie uns also hineingraben.

Ich versuche, Flüsse in meinem Interessengebiet (Tansania) zu zeichnen, aber das Quell-Shapefile (diva-gis.org) enthält jede Menge unnötige Wasserleitungen. Aus Gründen der Reproduzierbarkeit werde ich alle bearbeiteten DBFs und Shapefiles einschließen. Hier ist die Original-DBF-Datei und hier ist das Original-Shapefile. Es sieht aus wie das.

Wie Sie in der DBF sehen können, sind viele der Flüsse unbekannt / unbenannt und als "UNK" aufgeführt, was für mich nicht sehr nützlich ist. In QGIS kann ich einfach die Attributtabelle öffnen, nach Namen sortieren und alle UNK-Werte entfernen. Alternativ kann ich diese Werte über den SQL-Ausdruck herausfiltern:

"NAM" != "UNK"

Beide führen zu den gleichen Ergebnissen. Hier ist die QGIS-bearbeitete DBF und hier ist das QGIS-bearbeitete Shapefile. So sieht die Karte aus:

Dann wird es skurril. Auch hier erstelle ich diese Karte tatsächlich in R. Unter Verwendung der ursprünglichen Quelldaten bearbeite ich die DBF mit dem Paket "foreign", überschreibe die DBF und ordne dann mit ggplot zu. Ich bekomme ein ganz anderes Ergebnis als das oben abgebildete. Hier ist ein kleiner Ausschnitt des Beispielcodes (nicht für die vollständige Karte, aber im Wesentlichen sieht dieser Teil des Kartencodes so aus):

library(rgdal) library(foreign) library(ggplot2) #Setze dein passendes Arbeitsverzeichnis setwd("D:/Mapping-R/Returns-Practice") #read dbf, sql expression, um alle UNK-Werte in NAM water.lines zu entfernen < - read.dbf("original-waterlines.dbf") water.lines <- water.lines[water.lines$NAM != "UNK",] #overwrite dbf write.dbf(water.lines, "TZA_water_lines_dcw.dbf" ) #shapefile lesen, anreichern, um lesbaren Datenrahmen zu erstellen water.lines.shp <- readOGR(dsn = "D:/Mapping-R/Returns-Practice", layer = "original-waterlines") water.lines.shp <- fortify(water.lines.shp) #plot ggplot() + geom_polygon(data = water.lines.shp, aes(long, lat, group = group), color = "slategray4")

Das Ergebnis dieses Codes sieht so aus:

Irgendwie gestreckt und funky, folgt aber eindeutig nicht dem gleichen Linienmuster wie das QGIS-bearbeitete Bild. Das hat mich total verrückt gemacht. Ich habe die R-Attribute tatsächlich durchgesehen und mit den QGIS-Attributen verglichen und sie passten perfekt zusammen, aber das Bildergebnis ist völlig anders. Nachdem ich noch etwas damit herumgespielt hatte, dachte ich, dass mein Code schuld war und da habe ich es vermasselt. Aber dann habe ich das Original-DBF geöffnet und alle UNK-Werte manuell entfernt und wieder in QGIS gesteckt. Hier ist die resultierende DBF und hier ist das entsprechende Shapefile, das dem R-Bild/Plot entspricht und so aussieht:

Was gibt?! Die Attributtabellen sind identisch, aber die Bilder sind unterschiedlich. Ich habe das Gefühl, dass es etwas wirklich Offensichtliches geben muss, das mir fehlt, aber ich habe buchstäblich Stunden damit gespielt und kann es nicht herausfinden.


So würde ich es in R machen.

library(rgdal) # Einlesen des Shapefiles tz.wl <- readOGR(."", "TZA_water_lines_dcw") # jetzt select tz.wl.selection <- tz.wl[tz.wl$NAM != 'UNK',] # Sie können dies ausschreiben und mit Ihrer Qgis-Datei vergleichen: writeOGR(tz.wl.selection, ".", "TZA_water_lines_selection", driver = "ESRI Shapefile")

Leg dich nicht mit Shapefile-DBFs an!

Die Verbindung zwischen Geometrien und Attributen wird leicht durcheinander gebracht, insbesondere wenn Sie beginnen, Einträge in der DBF zu entfernen oder neu anzuordnen. Das wird nie funktionieren.

Verwenden Sie ein anderes Dateiformat oder verwenden Sie eine Bibliothek, die Shapefiles als Ganzes und nicht nur DBF unterstützt.


Schau das Video: how to convert.dbf to.xlsx without any software (Oktober 2021).