Gibt es eine schnelle Möglichkeit, alle Attribute aus einer Ebene zu löschen, aber die Polygone an Ort und Stelle zu lassen?

9

Ich habe eine Shapefile-Ebene in QGIS 2.6 mit mehreren Polygonen, von denen jedes Daten in über 100 Feldern enthält. Ich muss eine neue Ebene mit denselben Polygonen erstellen, wobei jedoch alle Datenfelder leer sind (je nach Feldtyp auf 0, Null oder leer gesetzt). Gibt es eine schnellere Möglichkeit, dies zu tun, als für jedes Feld jedes Polygons nacheinander die Entf-Taste zu drücken? Ich müsste dies mehr als 1000 Mal tun.

alphabetasoup
quelle
1
Bitte bearbeiten Sie die Frage, um die GIS-Softwareversion und das Datenformat (z. B. Shapefile, FGDB, PostGIS, ..) einzuschließen
Vince

Antworten:

3

Können Sie Ihre Daten nicht einfach kopieren und in Layer X (eine Ebene / Shapefile / Feature-Class / was auch immer) ohne Attribute (außer OID und Geometrie) einfügen und dann die jetzt "leere" Geometrie zurück kopieren und einfügen? in deine ursprüngliche Schicht?

user23715
quelle
6

Sie können den folgenden Code in die Python-Konsole eingeben, um ALLE Attribute NULLfür ein in QGIS geladenes Shapefile zu löschen . Wählen Sie die Ebene im Ebenenbedienfeld (Inhaltsverzeichnis) aus und führen Sie den Code aus:

layer = qgis.utils.iface.activeLayer()     
layer.startEditing()   
for field in layer.dataProvider().attributeIndexes():   
    for feature in layer.getFeatures(): 
        layer.changeAttributeValue(feature.id(), field, NULL)    

layer.commitChanges()        

Dies wurde auf QGIS 2.8.2 getestet.


UPDATE :

Als Reaktion auf den Kommentar von @Vince kann der folgende Code direkt in die Konsole Python kopiert / eingefügt werden und die Werte des Attributs auf der Abhängigkeit ändern Typ des Feldes (dh 0für ganzzahlige Felder; NULLfür String Felder, und eine Epoche 1900-01-01für ein Datumsfeld ):

layer = qgis.utils.iface.activeLayer()     
layer.startEditing()  
for field in layer.pendingFields():
        if field.typeName() == 'Integer':
                name_int = field.name()
                for feature in layer.getFeatures():
                        feature[name_int] = '0'
                        layer.updateFeature(feature)
        if field.typeName() == 'String':
                name_str = field.name()
                for feature in layer.getFeatures():
                        feature[name_str] = NULL
                        layer.updateFeature(feature)
        if field.typeName() == 'Date':
                name_dat = field.name()
                for feature in layer.getFeatures():
                        feature[name_dat] = '1900-01-01'
                        layer.updateFeature(feature)
layer.commitChanges()
Joseph
quelle
1
Können Sie die Logik optimieren, um Zahlen numerisch zuzuweisen, Zeichenfolgen leer / NULL und Datumsangaben die Epoche zuzuweisen?
Vince
@ Prince - Danke Kumpel, ich kann es auf jeden Fall versuchen, da ich kein Experte in dieser Angelegenheit bin :)
Joseph
@Vince - Nochmals vielen Dank für die Erwähnung der Optimierung, ich habe zufällig mehr über Python erfahren =)
Joseph
1
Ich denke, mein Alter zeigt sich, wenn ich an eine Epoche vom 1. Januar 1970 oder 1900 denke, nicht von 2000;)
Vince
3

Sie können es einfach als neue Datei speichern und im Dialogfeld "Speichern unter ..." das Kontrollkästchen "Attributerstellung überspringen" aktivieren. Es macht genau das, was es sagt.

Es wird eine numerische Zählerspalte mit dem Namen FID geben. Anscheinend erfordert das Shapefile-Format mindestens ein Attribut. Wenn Sie können, verwenden Sie etwas Besseres, Spatialite oder Geopaket.

bugmenot123
quelle
+1, Sie haben Recht, da es mindestens ein Attribut geben muss. Dies ist jedoch eine sehr schöne und einfache Methode, da Sie den Feldrechner ausführen und alle Werte der FID durch ersetzen können NULL.
Joseph
1
QGIS-Verhalten scheint seltsam. Die Spalten-FID kann bearbeitet werden und ist nicht die tatsächliche Zuordnung zwischen Geometrie und Attributen. Wenn Sie die Spalte löschen, erhalten Sie eine mit dem Namen "Feature-ID", die nicht bearbeitet werden kann. Das sollte schon das erste Ergebnis sein. QGIS 2.10. Ich werde später einen Fehler melden.
Bugmenot123
2

Öffnen Sie die DBF-Datei mit openoffice oder anderen und entfernen Sie die Daten.
Sie können Python verwenden, um die Dateien zu durchlaufen und alle Header außer den Headern zu entfernen. Siehe DBF-Python-Modul

julsbreakdown
quelle
1
Die Verwendung von Shapefile-ignoranten Tools für die dBase-Dateikomponente führt wahrscheinlich zu einer Beschädigung des Shapefiles. Wenn der Zweck darin besteht, Leerzeichen und Nullen zu füllen, führt das "Entfernen" der Daten wahrscheinlich nur zu einer dBase-Datei mit weniger Datensätzen als .shp / .shx.
Vince
In der Tat, aber wir entfernen einfach die Daten, gibt es kein Risiko.
Julsbreakdown
Nein, die Aufgabe besteht darin, Polygone beizubehalten und die entsprechenden Attribute zu löschen, sodass das Risiko sehr hoch ist. Jede Antwort, die nicht vor möglicher Korruption warnt, nimmt das Risiko nicht ernst genug.
Vince
Ich erkenne, dass es ein harter Weg ist, dh kein normaler, aber es funktioniert. Natürlich ist es willkommen, eine Sicherungskopie der Originaldaten zu erstellen.
Leehan
In diesem speziellen Fall ist das Risiko nicht so groß, da alle Attribute in allen Feldern initialisiert werden. Wenn sich die Reihenfolge der Datensätze in der DBF-Datei ändert, wird dies dennoch nicht zu Problemen führen, da alle Datensätze dieselben Daten in Attributen enthalten. Der Benutzer muss weiterhin darauf achten, dass die Anzahl der Funktionen in .dbf mit der in .shp übereinstimmt. Wie @Vince schrieb, sollten Benutzer jedoch gewarnt werden, dass a) das Ändern der Zeilenreihenfolge von b) die Anzahl der Zeilen in .dbf im Allgemeinen zu einem beschädigten und unbrauchbaren Shapefile führt.
user30184
2

QGIS kann Formdateien ohne die .dbf öffnen.

Sie können also einfach die .dbf-Komponente löschen und in die .shp-Datei laden, wodurch nur die Geometrie eingefügt wird.

HeikkiVesanto
quelle
Das ist ein guter Tipp, obwohl ich persönlich darauf verzichte, keine zugehörigen Dateien zu löschen :)
Joseph
1
Ja, das Umbenennen ist möglicherweise eine sicherere Option.
HeikkiVesanto
2

Vielleicht können Sie die * .dbf-Datei mit Excel bearbeiten.

Dann löschen Sie alle Felder außer dem geom.

Zum Schluss speichern und beenden.

Es wäre nützlich, vorher ein Archiv der * .shp zu führen.

Leehan
quelle
Die Bedeutung scheint darin zu bestehen, das Schema intakt zu halten, sodass nur die Werte der Attribute auf einen Standardwert gesetzt werden sollten. Und Sie können mit Excel nicht im DBF-Format speichern.
user30184
2
Das Geometriefeld ist in der dBase-Komponente eines Shapefiles nicht vorhanden.
Vince
genau dort gibt es kein wkt feld beim bearbeiten von dbf mit excel.
Leehan
Das FID-Feld verknüpft die Zeilen in der .dbf mit der Geometrie, die in der .shp gespeichert ist. Die .dbf hat wirklich nichts mit Geometrie zu tun. en.wikipedia.org/wiki/Shapefile
mr.adam
1

In QGIS 2.8.x können Sie auch bestimmte oder alle Felder entfernen. Attributtabelle öffnen, Bearbeitungsmodus umschalten, auf "Spalte löschen" klicken, alle unerwünschten Attribute auswählen und auf "OK" klicken. Änderungen speichern.

Cuitlahuac Hernandez-Santiago
quelle