Czy istnieje sposób automatycznego zwiększenia wartości dla kolumny identyfikatora w QGIS


22

Tworzę fikcyjną mapę, dlatego muszę utworzyć wiele punktów, linii i na pewno wielokątów. Później eksportuję moje dane jako geojson. Ale przedtem muszę odejść i nadać każdemu elementowi unikalny identyfikator.

Nie potrzebuję specjalnego sortowania, ponieważ największy wielokąt otrzymuje najmniejszy identyfikator. Po prostu trzeba wszystkie wielokąty z o ID na końcu, bez robić to ręcznie jak mam teraz zrobić.

Byłoby wspaniale, gdyby ktoś wiedział, jak to zrobić.


Czy używasz plików kształtów? Czy identyfikatory muszą być takie same po każdym eksporcie, czy można wypełnić pole identyfikatora po każdej sesji edycji?
DPSSpatial

Jak tworzysz wielokąty ze skryptu, digitalizujesz na pulpicie QGIS, czy kopiujesz z pliku kształtu itp.?
landocalrissian

Cóż, tworzę kształt w QGIS, Save as Geojson i jest w porządku. Przepraszam, może źle zrozumiałem twoje pytanie?
kwoxer

Odpowiedzi:


26

Korzystając z kalkulatora pola, możesz:

Nie podano dokumentu tożsamości

  1. Digitalizuj wszystkie funkcje bez wprowadzania identyfikatora.
  2. Przed eksportem zaktualizuj unikalne identyfikatory za pomocą wyrażenia „$ Id” za pomocą kalkulatora pola.

Nie podano identyfikatora

Niektóre dane są już podane

  1. Jeśli masz już identyfikator, możesz użyć „- $ Id”. Upewnij się, że po prostu wybierasz nowe funkcje, co oznacza, że ​​są one „NULL” w wierszu identyfikatora. Po prostu zrób to, zamawiając kolumnę.
  2. Teraz wykonaj kroki ze zdjęć:

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj


Tak, wspaniale. Super łatwa i działająca poprawnie. Dzięki. Btw: może wiesz, jak to zrobić na już istniejących identyfikatorach? Jeśli to zrobię, dostaję
-2-3

Znajdź rozwiązanie i dodało je do swojego postu. Dzięki jeszcze raz.
kwoxer

6

Alleluja! Lub Eureka. Lub cokolwiek. To może być skończone. Z plikiem kształtu.

  1. Jeśli jeszcze go nie ma, dodaj pole zawierające identyfikator funkcji, powiedz „FID”, typu Liczba całkowita (liczba całkowita) .
  2. Otwórz Właściwości warstwy (kliknij warstwę prawym przyciskiem myszy i wybierz Właściwości ... lub kliknij dwukrotnie warstwę), kliknij kartę Formularz atrybutów , a następnie w obszarze Ogólne usuń zaznaczenie opcji Edycja i w obszarze Domyślne w polu Domyślny typ wartościmaximum("FID") + 1 .

Odznaczając opcję Edycja , nie możesz wprowadzić innej wartości ani usunąć tego, co tam jest. Pamiętaj, że jeśli istnieją wartości bez identyfikatora, wartości te nie zostaną zaktualizowane. W pewnym momencie eksperymentuję ze sprawdzeniem Zastosuj wartość domyślną podczas aktualizacji i poprawieniem mojej formuły w celu sprawdzenia wartości zerowej lub NULL w celu zaktualizowania tylko tych rekordów podczas ich edycji, a nie żadnego rekordu o wartości większej niż 1. (Wcześniej w tym po omówiono, jak zaktualizować pole FID o unikalne wartości, co trzeba będzie zrobić, jeśli dodano pole po tym, jak w pliku kształtu były już funkcje).

Pamiętaj, że jest to zapisywane z bieżącym plikiem mapy, a nie z plikiem kształtu, dlatego wielokrotne dodanie tego pliku będzie wymagało skopiowania tej części stylu warstwy na nowo dodaną warstwę. Aby to zrobić, kliknij warstwę prawym przyciskiem myszy, wybierz Style> Kopiuj styl> Pola i kliknij inną warstwę prawym przyciskiem myszy, wybierz Style> Wklej styl> Wszystkie kategorie stylów (lub przejdź do pól ). Możesz także skopiować tę część stylu na dowolną inną warstwę opartą na pliku kształtu, ale pole ID musi mieć taką samą nazwę jak warstwa, z której kopiujesz.

Właściwości warstwy


Pamiętaj, że aby to zadziałało, musisz przynajmniej utworzyć jedną cechę i wpisać jej FID, a następnie zmienić atrybut z Wartość domyślna. W przeciwnym razie otrzymujesz NULL FID.
Techie_Gus,

5

Chciałbym dodać do postu vinayana i krótko wspomnieć o funkcji rownum , ponieważ jest ona bardzo podobna, aw niektórych przypadkach może być nieco wygodniejsza.

wprowadź opis zdjęcia tutaj

id zwraca identyfikator funkcji , co oznacza, że ​​zawsze zaczyna się od zera .
rownum zwraca numer wiersza , co oznacza, że ​​zaczyna się od pierwszego .

wprowadź opis zdjęcia tutaj

Zasadniczo, jeśli chcesz, aby automatyczny przyrost zaczynał się od 0, wybierz $ id , a jeśli chcesz, aby zaczynał się od 1, wybierz $ rownum .


Wypróbowane, a także dobre rozwiązanie. Ale z tym rozwiązaniem tutaj, jeśli masz już kilka identyfikatorów i chcesz je zachować, funkcja rownum nie jest dobra. Ta funkcja zawsze zaczyna się od 1. Powyższa metoda jest o wiele bardziej inteligentna, chociaż trudniej ją skonfigurować. Dziękuję za alternatywę, ale na razie funkcja ID jest moim preferowanym rozwiązaniem =)
kwoxer

4

Temat ten pojawił się tutaj: Utwórz plik kształtu z kluczem podstawowym automatycznego przyrostu w QGIS

Moje sugestie to:

1) Bazy danych SQLITE / SpatialLite obsługują automatyczną inkrementację w polu ustawionym na INTEGER PRIMARY KEY:

W INSERT, jeśli kolumna ROWID lub INTEGER PRIMARY KEY nie jest wyraźnie podana wartość, wówczas zostanie automatycznie wypełniona nieużywaną liczbą całkowitą, zwykle tą większą niż największa aktualnie używana ROWID. Dzieje się tak niezależnie od tego, czy użyto słowa kluczowego AUTOINCREMENT.

Za każdym razem, gdy edytujesz / tworzysz wielokąty, możesz uzupełnić ich atrybuty, a SQLITE da mu przyrostową unikalną wartość w polu, które ustawiłeś na typ INTEGER PRIMARY KEY.

Kiedy jesteś gotowy na eksport do GEOJSON, wszystko jest ustawione z unikalnymi identyfikatorami.

2) Jeśli używasz Shapefiles, utwórz pole OBJECTID typu INTEGER i użyj wyrażenia pola kalkulatora, aby wypełnić to pole za każdym razem, gdy edytujesz / tworzysz wielokąty i musisz je wyeksportować. Utracisz oryginalny identyfikator wielokąta, ale to jedyny sposób na osiągnięcie tego za pomocą .SHP. (Będę musiał znaleźć wyrażenie kalkulatora pola).

PostGIS to kolejne źródło danych, które możesz chcieć eksplorować, chociaż bardziej ciężki wzrost niż SQLITE, możesz znaleźć wartość w takim systemie, gdy posuwasz się naprzód ...


Dziękuję za wyjaśnienie. Ale nie sądzę, że będzie to dobre rozwiązanie zamiast opcji auto_increment bezpośrednio w narzędziu. Mam już tak wiele formatów danych i nie chcę innego narzędzia. Może powinienem napisać do tego dodatek, kiedy będę miał trochę czasu ...
kwoxer

Może być łatwiej porzucić .SHP! Kto wie, jakie nowe przedsięwzięcia zabiorą cię na ...
DPSSpatial

2

Stary post, ale dla każdego innego, kto szuka szybkiej kopalni rozwiązania, było utworzenie pola z $ ID + 1 i automatycznie wygeneruje, zaczynając od 1!


2

Aktualizacja dla QGIS 3

Wiem, że spóźniłem się z tym, ale zawsze dobrze jest podawać wszelkie aktualizacje:

W QGIS 3 istnieje teraz natywne narzędzie, którego można użyć do wykonania tej dokładnej pracy, i nazywa się „Dodaj pole autoinkrementalne”

Nie trzeba używać wyrażeń w kalkulatorze polowym ani wykonywać żadnego kodowania, ale mimo to są one nadal bardzo przydatne i dobrze wiedzieć.

wprowadź opis zdjęcia tutaj


1

Najłatwiej to zrobić za pomocą skryptu python, a może jest to możliwe za pomocą kalkulatora pola. Przepraszam, nie mam dla ciebie jednego, może ktoś inny będzie. W międzyczasie szukałem skryptu w języku Python. Wiele o tym widziałem w ArcGIS, ale jestem pewien, że jest coś dla QGIS.


Najlepiej byłoby, gdyby naprawdę nie było niczego, prośba o funkcję. Nie chcę dodatkowego skryptu w Pythonie oprócz QGIS, także jeśli może to być rozwiązanie za jednym kliknięciem. Ale dziękuję.
kwoxer

1

Jeśli nie potrzebujesz czegoś po ludzku strawnego, jest teraz łatwa poprawka: we właściwościach pola wybierz „Generator UUID” i pozostaw wszystko puste.

Spowoduje to automatyczne utworzenie UUID w polu. Nie tak przyjazny jak zwykła liczba (według $ id lub $ rownum), ale generuje UUID od samego początku, więc nie ma kolejnych kroków.wprowadź opis zdjęcia tutaj


0

Chciałbym dodać, że wydaje się, że to nie działa, gdy używasz warstw bazy danych postgreSQL. $ ID i $ rownum zwracają 0. PostgreSQL 9.6 QGIS 2.18.12


0

rozwiązania te nie działały już dla mnie w QGIS 2.01 Dufour. Wpisanie $idnowego lub istniejącego pola o nazwie „id” w polu wejściowym wyrażenia dało mi błąd „Wyrażenie jest nieprawidłowe”

Co zadziałało, to wpisać funkcję, $rownuma następnie kliknąć „OK”

wprowadź opis zdjęcia tutaj


0

możesz po prostu usunąć pierwszy colmn (id) i utworzyć nowy „As virtual field” wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

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.