Czy istnieje szybki sposób na usunięcie wszystkich atrybutów z warstwy, ale pozostawienie wielokątów na miejscu?

9

Mam warstwę Shapefile w QGIS 2.6 z kilkoma wielokątami, z których każda zawiera dane w ponad 100 polach. Muszę utworzyć nową warstwę z tymi samymi wielokątami, ale z wszystkimi polami danych pustymi (ustawione na 0, Null lub puste w zależności od typu pola). Czy istnieje szybszy sposób na zrobienie tego niż naciśnięcie Delete na każdym polu każdego wielokąta pojedynczo, musiałbym to zrobić ponad 1000 razy w ten sposób.

zupa alfabetyczna
źródło
1
Proszę edytować pytanie zawierać wersję oprogramowania GIS i format danych (np shapefile, FGDB, PostGIS, ..)
Vince

Odpowiedzi:

3

Czy nie możesz po prostu skopiować i wkleić danych do warstwy X (warstwa / plik kształtu / klasa obiektów / cokolwiek), która nie ma atrybutów (oprócz OID i geometrii), a następnie skopiować i wkleić teraz „pustą” geometrię z powrotem w twoją oryginalną warstwę?

użytkownik23715
źródło
6

Możesz wprowadzić następujący kod w konsoli Python, aby wyczyścić WSZYSTKIE atrybuty NULLdla pliku shapefile załadowanego do QGIS. Wybierz warstwę z panelu warstw (Spis treści) i uruchom kod:

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

Zostało to przetestowane na QGIS 2.8.2.


AKTUALIZACJA :

W odpowiedzi na komentarz @Vince poniższy kod można skopiować / wkleić bezpośrednio do konsoli Pythona i zmieni on wartości atrybutów w zależności od typu pola (tj. 0Dla pól liczb całkowitych ; NULLdla pól ciągów ; i epoki 1900-01-01dla Data pole):

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
źródło
1
Czy potrafisz dostroić logikę, aby przypisać zero cyfrom, puste / NULL ciągom znaków, a epokę datom?
Vince
@Vince - Dzięki kolego, z pewnością mogę spróbować, ponieważ nie jestem ekspertem w tej kwestii :)
Joseph
@Vince - Jeszcze raz dziękuję za wzmiankę o usprawnieniu, zdarzyło mi się dowiedzieć więcej o python =)
Joseph
1
Myślę, że mój wiek pokazuje, kiedy myślę o epoce z 1 stycznia 1970 r. Lub 1900 r., A nie 2000;)
Vince
3

Możesz po prostu zapisać go jako nowy plik i zaznaczyć pole „Pomiń tworzenie atrybutów” w oknie dialogowym „Zapisz jako ...”. Robi dokładnie to, co mówi.

Będzie jedna numeryczna kolumna licznika o nazwie FID, najwyraźniej format Shapefile wymaga co najmniej jednego atrybutu? Jeśli możesz, użyj czegoś lepszego, przestrzennego lub geopackage.

bugmenot123
źródło
+1, masz rację, ponieważ musi być co najmniej jeden atrybut. Jest to jednak bardzo przyjemna i prosta metoda, ponieważ można uruchomić kalkulator pola i zastąpić wszystkie wartości FID na NULL.
Joseph,
1
Zachowanie QGIS wydaje się dziwne. Kolumna FID jest edytowalna i nie jest rzeczywistym odwzorowaniem między geometrią a atrybutami. Jeśli usuniesz kolumnę, otrzymasz jeden o nazwie „identyfikator funkcji”, którego nie można edytować. To powinien być już pierwszy wynik. QGIS 2.10. Zgłoszę błąd później.
bugmenot123
2

Otwórz plik .dbf w openoffice lub innym i usuń dane.
Możesz użyć Pythona do przechodzenia między plikami i usuwania wszystkich oprócz nagłówków Zobacz moduł dbf Python

julsbreakdown
źródło
1
Korzystanie z narzędzi ignorujących pliki shapefile w komponencie pliku dBase może spowodować uszkodzenie pliku shapefile. Jeśli celem jest wypełnienie spacji i zer, „usunięcie” danych prawdopodobnie spowoduje utworzenie pliku dBase z mniejszą liczbą rekordów niż .shp / .shx.
Vince
Rzeczywiście, ale my po prostu usuwamy dane, nie ma żadnego ryzyka.
julsbreakdown
Nie, zadaniem jest zachowanie wielokątów i usunięcie odpowiednich atrybutów, więc ryzyko jest bardzo wysokie. Każda odpowiedź, która nie ostrzega przed potencjalną korupcją, nie bierze wystarczająco poważnie ryzyka.
Vince
Zdaję sobie sprawę, że jest to trudna droga, tzn. Nie jest regularna, ale działa. Oczywiście mile widziane jest tworzenie kopii zapasowych oryginalnych danych.
Leehan
W tym szczególnym przypadku ryzyko nie jest tak duże, ponieważ inicjowane są wszystkie atrybuty we wszystkich polach. Dlatego jeśli kolejność rekordów zmienia się w pliku dbf, nie spowoduje to bałaganu, ponieważ wszystkie rekordy mają takie same dane w atrybutach. Użytkownik musi nadal uważać, aby liczba funkcji w .dbf była taka sama jak w .shp. Jednak, jak napisał @Vince, należy ostrzec użytkowników, że a) zmiana kolejności wierszy b) liczba wierszy w .dbf prowadzi zazwyczaj do uszkodzenia i nieużytecznego pliku kształtu.
user30184,
2

QGIS może otwierać pliki kształtów bez pliku .dbf.

Więc możesz po prostu usunąć komponent .dbf i załadować .shp, co przyniesie tylko geometrię.

HeikkiVesanto
źródło
To dobra wskazówka, chociaż osobiście powstrzymuję się od usuwania powiązanych plików :)
Joseph
1
Tak, zmiana nazwy może być bezpieczniejszą opcją.
HeikkiVesanto
2

Być może możesz edytować plik * .dbf w programie Excel.

Następnie usuwasz wszystkie pola oprócz geom.

Wreszcie zapisz i wyjdź.

Przydałoby się przechowywać archiwum * .shp przed zrobieniem tego.

Leehan
źródło
Wydaje się, że chodzi o utrzymanie schematu w nienaruszonym stanie, dlatego tylko wartości atrybutów powinny być ustawione na pewną wartość domyślną. I nie można zapisać do formatu dbf za pomocą Excela.
user30184,
2
Pole geometrii nie istnieje w składniku dBase pliku kształtu.
Vince
nie ma pola wkt podczas edycji dbf za pomocą programu Excel.
Leehan
Pole FID łączy wiersze w .dbf z geometrią zapisaną w .shp. Naprawdę .dbf nie ma nic wspólnego z geometrią. en.wikipedia.org/wiki/Shapefile
mr.adam
1

W QGIS 2.8.x możesz także pozbyć się określonych lub wszystkich pól. Otwórz tabelę atrybutów, Przełącz tryb edycji, kliknij przycisk „Usuń kolumnę”, wybierz wszystkie niechciane atrybuty i kliknij „OK”. Zapisz zmiany.

Cuitlahuac Hernandez-Santiago
źródło