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.


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ę?


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

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.


+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


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ę.


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.