Tạo trường ngày và giờ cập nhật tự động trong QGIS?


8

Tôi muốn tạo trường cập nhật ngày và giờ khi tôi chỉnh sửa trường thuộc tính theo định dạng này yyyy-mm-dd 00:00:00 (= 2016-05-08 11:04:00) - ngày / giờ địa phương của tôi. Dữ liệu nằm trong shapefile QGIS 2.14 và các dòng Vector dưới dạng ảnh chụp màn hình.

Khi một tính năng như NULL trong 'tên' lĩnh vực, tôi muốn nhập một tên cho con đường và trường 'mod' phải nhận de mod ified ngày / giờ như '2016/05/08 15:16:00'.

Tôi đã thử một số tùy chọn và thất bại. Tôi cần giúp đỡ để bắt đầu lại từ đầu.

  1. Tôi tạo một trường mới, loại ngày / giờ, nhưng vẫn giữ nguyên giá trị NULL sau khi tôi chỉnh sửa, trong trường "tên" hoặc tính năng tự tạo.
  2. Tôi cũng đã sử dụng, biểu thức now (), nhưng vẫn giữ nguyên giá trị NULL sau khi tôi chỉnh sửa.

Lưu ý: ngày được xem ở đó, 2016-04-14 là giá trị đầu tiên được tạo bằng "Máy tính trường".

nhập mô tả hình ảnh ở đây

Tôi đang sử dụng QGIS 2.14.


Vui lòng chỉnh sửa câu hỏi của bạn để chỉ định định dạng dữ liệu và các phiên bản phần mềm đang sử dụng. Bạn cũng nên chỉ định kiểu dữ liệu của cột mục tiêu (vì các trường ngày không có định dạng)
Vince

Vui lòng chỉnh sửa câu hỏi để chứa thông tin được yêu cầu. Bạn nên chi tiết những gì bạn đã cố gắng, và chính xác làm thế nào nó thất bại. Điều này sẽ giúp cho các tình nguyện viên của chúng tôi hiểu những gì bạn đang cố gắng đạt được. Vì thế, không có đủ thông tin để đoán hơn giải pháp - Tôi đang tưởng tượng một cột tự động trong DB2 sẽ không đáp ứng nhu cầu của bạn.
Vince

Âm thanh với tôi nếu bạn muốn lưu trữ dấu thời gian của lần chỉnh sửa / cập nhật cuối cùng của một tính năng trong một thuộc tính, tôi đã hiểu đúng chưa? Một cái gì đó giống như những gì ESRI gọi là 'theo dõi biên tập viên'?
Jochen Schwarze

2
Vậy bạn đang sử dụng loại nhà cung cấp dữ liệu nào (hình dạng, postgis, ...) và nhân tiện: tháng 3 chữ số có phải là lỗi đánh máy hay bạn cần một cái gì đó như 2016-may-08? có lẽ việc bắt được tín hiệu ọb BeforeCommitChanges của một QQVVVLLV hoặc một trình kích hoạt UPDATE trong postgesql có thể thành công.
Jochen Schwarze

1
Shapefile là một định dạng dữ liệu khốn khổ cho dấu thời gian, vì dBase chỉ hỗ trợ độ phân giải ngày (nó cũng không thực sự hỗ trợ NULL). Bạn cần sử dụng một cột ký tự cho thông tin này (sau đó sẽ cần được phân tích cú pháp để sử dụng thêm)
Vince

Câu trả lời:


12

Bạn có thể sử dụng đoạn mã sau kết nối attributeValueChangedsự kiện với hàm chúng ta có thể xác định đoạn nào chèn kết quả của $nowbiểu thức. Đánh dấu lớp của bạn và sao chép / dán phần sau vào Bảng điều khiển Python :

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)

Chọn tính năng bằng cách nhấp vào số hàng (hiển thị trong hộp màu đỏ trong hình ảnh) hoặc từ khung vẽ bản đồ và chỉnh sửa bất kỳ thuộc tính nào cho tính năng đó. Thuộc tính trong modtrường của bạn sẽ cập nhật:

Kết quả


Lưu ý: Tôi đã sử dụng trường chuỗi thay vì ngày để lấy thời gian, nếu không, trường ngày chỉ ghi YYYY-MM-DD .


@CarlosPires - Chào mừng bạn nhất! Hy vọng nó sẽ giúp :)
Joseph

Vì vậy, tôi đã tạo một chuỗi văn bản mới (20) 'mod' (xem 1) , tôi đã dán mã của bạn vào bảng điều khiển Python (sau ctrl-alt-P), chèn tên của tên 'đường phố' (xem 2) , để lại bản ghi nhưng trường vẫn là NULL (xem 3) như bạn thấy trong ảnh chụp màn hình. ! [Ảnh chụp màn hình] ( i.stack.imgur.com/lGR2D.png ).
Carlos Pires

2
Bây giờ nó hoạt động! Vì tôi không phải là lập trình viên nên không biết chúng tôi đã chạy mã đầu tiên !! :( Xin lỗi. Lưu ý : Nó hoạt động với công cụ chọn. Nếu trường thuộc tính được chỉnh sửa bằng công cụ thông tin (tính năng xác định), nó không hoạt động.
Carlos Pires

2
@CarlosPires Bạn có thể sử dụng plugin AutoFields cho việc này. Xem video này để biết ví dụ về tính toán ngày và giờ tự động. Tôi đoán nó cũng sẽ hoạt động nếu bạn sử dụng công cụ nhận dạng để cập nhật giá trị của mình, bạn có thể kiểm tra không?
Germán Carrillo

1
@ GermánCarrillo, có vẻ như là một lựa chọn tốt. Tôi sẽ thử lại sau. Cảm ơn.
Carlos Pires

3

Tôi đã vấp phải câu hỏi và trả lời này trong khi tôi đang tìm cách thay đổi tem ngày / giờ mà tôi đang thực hiện để ghi lại bằng plugin. Tôi đã đặt một phiên bản sửa đổi một chút của mã vào plugin để tự động cập nhật ngày / giờ vào (các) bản ghi mà tôi đã thay đổi:

""" 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 })

Về mặt kỹ thuật, điều này dường như không phải là một câu trả lời nhưng tôi nghĩ rằng "câu trả lời" này có thể có một số giá trị đối với người đọc trong tương lai như là một phần của câu hỏi và vì vậy tôi sẽ để nó ở vị trí đó. Nó cần định dạng nhiều hơn là chuyển đổi nó thành một nhận xét sẽ cho phép. Tôi rất vui khi được ghi đè nếu bất kỳ ai gần gũi hơn khi viết Plug-in QGIS hơn tôi muốn đưa ra một trường hợp trong các bình luận ở đây và sau đó ping tôi hoặc người điều hành khác.
PolyGeo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.