Apakah ada cara auto_increment untuk kolom ID di QGIS

22

Saya membuat peta fiktif, jadi saya perlu membuat banyak titik, garis, dan pasti poligon. Kemudian saya mengekspor data saya sebagai geojson. Tapi sebelum itu saya harus pergi dan memberikan setiap elemen ID unik.

Saya tidak perlu penyortiran khusus, seperti poligon terbesar mendapatkan ID terkecil atau lebih. Aku hanya perlu semua poligon dengan sebuah ID di akhir, tanpa melakukan itu secara manual seperti saya harus lakukan sekarang.

Akan lebih bagus jika seseorang tahu bagaimana melakukan itu.

kwoxer
sumber
Apakah Anda menggunakan shapefile? Apakah ID harus sama setelah setiap ekspor, atau bisakah Anda mengisi bidang ID setelah setiap sesi edit?
DPSSpatial
Bagaimana Anda membuat poligon dari skrip, mendigitalkan di desktop QGIS, atau menyalin dari shapefile dll.?
Landocalrissian
Saya membuat bentuk di QGIS, Save as Geojson dan tidak apa-apa. Maaf mungkin saya salah menjawab pertanyaan Anda?
kwoxer

Jawaban:

26

Menggunakan bidang kalkulator adalah cara untuk pergi:

Tidak ada ID yang diberikan

  1. Digitasi setiap fitur tanpa memasukkan ID apa pun.
  2. Sebelum ekspor, perbarui Id unik dengan ekspresi, '$ Id' menggunakan kalkulator bidang.

Tidak ada ID yang diberikan

Beberapa ID sudah diberikan

  1. Jika Anda sudah memiliki ID, Anda dapat menggunakan '- $ Id'. Pastikan Anda hanya memilih Fitur baru yang artinya 'NULL' di baris id. Cukup lakukan itu dengan memesan kolom.
  2. Sekarang lakukan langkah-langkah dari gambar:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Vinayan
sumber
Ya, mengagumkan. Sangat mudah dan bekerja dengan baik. Terima kasih sobat. Btw: mungkin Anda tahu cara melakukannya pada ID yang sudah ada? JIKA saya melakukan ini, saya mendapatkan -2 -3 dan seterusnya
kwoxer
Menemukan solusi dan menambahkannya ke posting Anda. Terima kasih lagi.
kwoxer
6

Haleluya! Atau Eureka. Atau terserah. Ini bisa dilakukan. Dengan shapefile.

  1. Jika belum ada, tambahkan bidang untuk memuat id fitur, misalnya "FID", dengan tipe Whole number (integer) .
  2. Buka Properti Lapisan (klik kanan pada lapisan dan pilih Properti ... atau klik dua kali lapisan), klik pada tab Formulir Atribut , lalu di bawah centang Hapus umum Diedit dan di bawah Default di bidang Jenis nilai defaultmaximum("FID") + 1 .

Dengan menghapus centang yang Dapat Diedit , Anda tidak dapat memasukkan nilai lain atau menghapus yang ada di sana. Perhatikan bahwa jika ada nilai tanpa ID, nilai ini tidak akan diperbarui. Pada titik tertentu saya akan bereksperimen dengan memeriksa Menerapkan nilai default pada pembaruan dan merevisi rumus saya untuk memeriksa nilai nol atau NULL untuk memperbarui hanya catatan tersebut ketika diedit, bukan catatan apa pun dengan nilai lebih dari 1. (Sebelumnya dalam hal ini posting itu dibahas bagaimana memperbarui bidang FID dengan nilai unik, yang perlu Anda lakukan jika Anda menambahkan bidang setelah sudah ada fitur di shapefile.)

Perhatikan bahwa ini disimpan dengan file peta saat ini, bukan shapefile, jadi menambahkan shapefile itu beberapa kali akan mengharuskan Anda untuk menyalin bagian dari style layer ke layer yang baru ditambahkan. Untuk melakukan ini, klik kanan pada layer, pilih Gaya> Salin Gaya> Bidang , dan klik kanan pada lapisan lain, pilih Gaya> Tempel Gaya> Semua Kategori Gaya (atau lanjutkan ke Bidang ). Anda juga bisa menyalin bagian gaya itu ke lapisan lain berdasarkan pada shapefile, tetapi bidang ID harus memiliki nama yang sama dengan lapisan tempat Anda menyalin.

Properti lapisan

bkepl
sumber
Perhatikan bahwa agar ini berfungsi, Anda harus setidaknya membuat satu fitur dan mengetikkan FID-nya kemudian mengubah bentuk atribut dari nilai Default. Jika tidak, Anda akan mendapatkan NULL FID.
Techie_Gus
5

Saya ingin menambahkan ke posting vinayan dan secara singkat menyebutkan fungsi rownum , karena sangat mirip dan dalam beberapa kasus mungkin sedikit lebih nyaman.

masukkan deskripsi gambar di sini

id mengembalikan ID Fitur , artinya selalu dimulai dari nol .
rownum mengembalikan nomor baris , artinya dimulai pada satu .

masukkan deskripsi gambar di sini

Jadi, pada dasarnya, jika Anda ingin kenaikan otomatis mulai dari 0 pergi untuk $ id , dan jika Anda ingin mulai dari 1 maka pergi untuk $ rownum .

BritishSteel
sumber
Mencoba dan juga solusi yang bagus. Tetapi dengan solusi ini di sini jika Anda sudah memiliki beberapa ID dan ingin mempertahankannya fungsi rownum tidak baik. Fungsi itu selalu dimulai dengan 1. Cara di atas menghitung jauh lebih cerdas meskipun lebih sulit untuk diatur. Jadi terima kasih atas alternatifnya tetapi untuk saat ini fungsi ID adalah solusi yang saya sukai =)
kwoxer
4

Topik ini telah muncul di sini: Buat Shapefile dengan kunci primer kenaikan otomatis di QGIS

Saran saya adalah:

1) Database SQLITE / SpatialLite mendukung penambahan otomatis pada bidang yang disetel ke INTEGER PRIMARY KEY:

Pada INSERT, jika kolom ROWID atau INTEGER PRIMARY KEY tidak diberi nilai secara eksplisit, maka itu akan diisi secara otomatis dengan integer yang tidak digunakan, biasanya yang lebih dari ROWID terbesar yang saat ini digunakan. Ini benar terlepas dari apakah kata kunci AUTOINCREMENT digunakan atau tidak.

Setiap kali Anda mengedit / membuat poligon, Anda dapat mengisi atributnya, dan SQLITE akan memberinya nilai unik tambahan di bidang yang telah Anda atur ke tipe INTEGER PRIMARY KEY.

Ketika Anda siap untuk mengekspor ke GEOJSON, Anda sudah siap dengan ID UNIK Anda.

2) Jika menggunakan Shapefile, buat bidang OBJECTID tipe INTEGER dan gunakan ekspresi kalkulator bidang untuk mengisi bidang itu setiap kali Anda mengedit / membuat poligon dan perlu mengekspornya. Anda akan kehilangan ID asli yang pernah dimiliki poligon, tetapi Anda ini adalah satu-satunya cara untuk mencapai ini menggunakan .SHP. (Saya harus menemukan ekspresi kalkulator bidang).

PostGIS adalah sumber data lain yang mungkin ingin Anda jelajahi, meskipun lebih berat daripada SQLITE, Anda mungkin menemukan nilai dalam sistem seperti itu saat Anda bergerak maju ...

DPSSpatial
sumber
Terima kasih telah menjelaskan. Tapi saya tidak berpikir itu akan menjadi solusi yang baik daripada opsi auto_increment langsung di alat ini. Saya sudah memiliki banyak format data dan belum menginginkan alat lain. Mungkin aku harus menulis addon untuk itu ketika aku punya waktu ...
kwoxer
Mungkin lebih mudah untuk meninggalkan .SHP! Siapa yang tahu usaha baru apa yang akan membawa Anda ...
DPSSpatial
2

Posting lama tetapi untuk orang lain yang mencari solusi cepat saya adalah membuat bidang dengan $ ID +1 dan secara otomatis akan menghasilkan dimulai dengan 1!

Blipple
sumber
2

Pembaruan untuk QGIS 3

Saya tahu saya cukup terlambat untuk hal ini tetapi selalu baik untuk memberikan pembaruan apa pun:

Di QGIS 3 sekarang ada alat asli yang dapat digunakan untuk melakukan pekerjaan yang tepat ini dan itu disebut "Tambahkan bidang autoincremental"

Tidak perlu menggunakan ekspresi dalam kalkulator lapangan atau melakukan pengkodean apa pun, namun demikian semuanya masih sangat berguna dan baik untuk diketahui.

masukkan deskripsi gambar di sini

AWGIS
sumber
1

Cara termudah untuk melakukan ini mungkin dengan skrip python atau mungkin dengan kalkulator bidang. Maaf saya tidak punya satu untuk Anda, mungkin orang lain akan melakukannya. Sementara itu, saya akan mencari skrip python untuk itu. Saya sudah melihat banyak tentang ini untuk ArcGIS, tapi saya yakin ada sesuatu di luar sana untuk QGIS.

Tangnar
sumber
Yah yang terbaik adalah jika benar-benar tidak ada, permintaan fitur. Saya tidak ingin skrip python tambahan untuk QGIS juga jika itu mungkin solusi satu-klik. Tapi terima kasih.
kwoxer
1

Jika Anda tidak membutuhkan sesuatu yang dapat dicerna secara manusiawi, sekarang ada perbaikan yang mudah: Di propreties lapangan, pilih "UUID Generator", dan biarkan semuanya kosong.

Ini secara otomatis akan membuat UUID di lapangan. Tidak seramah nomor sederhana (sesuai $ id atau $ rownum), tetapi menghasilkan UUID sejak awal, jadi tidak ada langkah berurutan.masukkan deskripsi gambar di sini

Horizen
sumber
0

Saya ingin menambahkan bahwa ini sepertinya tidak berfungsi ketika Anda menggunakan lapisan basis data postgreSQL. $ ID dan $ rownum semuanya kembali 0. PostgreSQL 9.6 QGIS 2.18.12

Tyler Veinot
sumber
0

solusi ini tidak lagi berfungsi untuk saya di QGIS 2.01 Dufour. Mengetik $iddi bidang baru atau yang sudah ada yang bernama 'id' di bidang input ekspresi memberi saya kesalahan "Ekspresi tidak valid"

Apa yang berhasil adalah mengetik fungsi $rownumdan kemudian klik "OK"

masukkan deskripsi gambar di sini

tom
sumber
0

Anda bisa menghapus kolom pertama (id) dan membuat yang baru "Sebagai bidang virtual" masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Rtronic
sumber