Membuat bidang tanggal dan waktu yang diperbarui secara otomatis dalam QGIS?

8

Saya ingin membuat bidang yang diperbarui tanggal dan waktu ketika saya mengedit bidang atribut dalam format ini yyyy-mm-dd 00:00:00 (= 2016-05-08 11:04:00) - tanggal / waktu lokal saya. Data ada dalam garis QGIS 2.14 dan garis-garis vektor seperti screenshot di bawah ini.

Ketika fitur sebagai NULL di bidang 'nama', saya ingin memasukkan nama untuk jalan dan medan 'mod' harus menerima de mod ified tanggal / waktu seperti '2016/05/08 15:16:00'.

Saya sudah mencoba beberapa opsi dan gagal. Saya butuh bantuan untuk memulai dari awal.

  1. Saya membuat bidang baru, tipe tanggal / waktu, tetapi tetap dengan nilai NULL setelah saya edit, di bidang "nama", atau fitur itu sendiri.
  2. Saya menggunakan juga, ekspresi now (), tetapi tetap dengan nilai NULL setelah saya edit.

Catatan: tanggal yang terlihat di sana, 2016-04-14 adalah nilai pertama yang dibuat dengan "Kalkulator Bidang".

masukkan deskripsi gambar di sini

Saya menggunakan QGIS 2.14.

Carlos Pires
sumber
Harap edit pertanyaan Anda untuk menentukan format data dan versi perangkat lunak yang digunakan. Anda juga harus menentukan tipe data kolom target (karena bidang tanggal tidak memiliki format)
Vince
Harap edit pertanyaan untuk memuat informasi yang diminta. Anda harus merinci apa yang telah Anda coba, dan bagaimana tepatnya gagal. Ini akan membantu memungkinkan sukarelawan kami untuk memahami apa yang ingin Anda capai. Seperti yang ada, tidak ada informasi yang cukup untuk menebak lebih dari solusi - Saya membayangkan kolom autopopulate di DB2 tidak akan memenuhi kebutuhan Anda.
Vince
Kedengarannya bagi saya jika Anda ingin menyimpan stempel waktu dari edit / pembaruan terakhir dari suatu fitur dalam sebuah atribut, apakah saya mengerti Anda? Sesuatu seperti yang disebut ESRI 'pelacakan editor'?
Jochen Schwarze
2
jadi penyedia data seperti apa yang Anda gunakan (bentuk, postgis, ...) dan ngomong-ngomong: apakah bulan 3 digit merupakan kesalahan pengetikan atau apakah Anda memerlukan sesuatu seperti 2016-may-08? mungkin menangkap sinyal bebeforeCommitChanges´ dari ´QgsVectorLayer´ atau pemicu UPUPDATE´ di postgesql mungkin berhasil.
Jochen Schwarze
1
Shapefile adalah format data yang menyedihkan untuk cap waktu, karena dBase hanya mendukung resolusi siang hari (itu tidak benar-benar mendukung NULL juga). Anda perlu menggunakan kolom karakter untuk informasi ini (yang kemudian harus diuraikan untuk penggunaan lebih lanjut)
Vince

Jawaban:

12

Anda dapat menggunakan kode berikut yang menghubungkan attributeValueChangedacara ke fungsi yang dapat kami tentukan yang menyisipkan hasil $nowekspresi. Sorot layer Anda dan salin / tempel yang berikut ini ke Python Console :

layer = qgis.utils.iface.activeLayer()

def update():
    field = layer.fieldNameIndex('mod')
    e = QgsExpression( " $now " )
    e.prepare( layer.pendingFields() )
    for feat in layer.selectedFeatures():
        feat[field] = e.evaluate( feat )
        layer.updateFeature( feat )

layer.attributeValueChanged.connect(update)

Pilih fitur dengan mengklik nomor baris (ditunjukkan pada kotak merah pada gambar) atau dari kanvas peta dan edit atribut apa pun untuk fitur itu. Atribut di modbidang Anda harus diperbarui:

Hasil


Catatan: Saya menggunakan bidang string sebagai ganti tanggal untuk mendapatkan waktu, jika tidak, bidang tanggal hanya mencatat YYYY-MM-DD .

Yusuf
sumber
@CarlosPires - Selamat datang! Semoga ini membantu :)
Joseph
jadi saya membuat string teks baru (20) bidang 'mod' (lihat 1) , saya menempelkan kode Anda ke konsol Python (setelah ctrl-alt-P), masukkan nama jalan 'nama' (lihat 2) , meninggalkan catatan tetapi bidangnya masih NULL (lihat 3) seperti yang Anda lihat di tangkapan layar. ! [ScreenshotTry] ( i.stack.imgur.com/lGR2D.png ).
Carlos Pires
2
Sekarang berhasil! Karena saya bukan seorang programmer tidak tahu kita harus terlebih dahulu menjalankan kode !! :( Maaf. Catatan : Ini berfungsi dengan alat pilih. Jika bidang atribut diedit dengan alat info (fitur identifikasi), itu tidak berfungsi.
Carlos Pires
2
@CarlosPires Anda dapat menggunakan plugin AutoFields untuk ini. Tonton video ini untuk contoh perhitungan otomatis tanggal dan waktu. Saya kira itu juga akan berfungsi jika Anda menggunakan alat identifikasi untuk memperbarui nilai-nilai Anda, dapatkah Anda memeriksanya?
Germán Carrillo
1
@ GermánCarrillo, sepertinya ini pilihan yang bagus. Saya akan coba nanti. Terima kasih.
Carlos Pires
3

Saya menemukan Q&A ini ketika saya sedang mencari cara untuk perubahan cap tanggal / waktu yang saya buat untuk catatan menggunakan plugin. Saya menempatkan versi kode yang sedikit dimodifikasi ke dalam plugin untuk secara otomatis memperbarui tanggal / waktu ke dalam catatan yang saya ubah:

""" Prepare Change Date/Time Stamp"""
e = QgsExpression( " $now " )
cDate = e.evaluate()

"""" Identify column(s) to change and new value(s) to assign"""
attrs = { 10 : newStat, 20 : cDate }

""" Make record change and capture date/time of change'''
layer.dataProvider().changeAttributeValues({ fid : attrs })
rLogan
sumber
Secara teknis ini tampaknya bukan jawaban tetapi saya pikir "jawaban" ini mungkin memiliki nilai bagi pembaca di masa depan sebagai bagian dari T&J dan jadi saya meninggalkannya di tempat. Itu membutuhkan lebih banyak format daripada mengubahnya menjadi komentar akan memungkinkan. Saya senang ditolak jika ada orang yang lebih dekat menulis QGIS Plug-in daripada yang saya ingin sampaikan dalam komentar di sini dan kemudian ping saya atau moderator lain.
PolyGeo