¿Realiza una actualización automática de fecha y hora en QGIS?

8

Quiero hacer un campo actualizado de fecha y hora mientras edito un campo de atributo en este formato aaaa-mm-dd 00:00:00 (= 2016-05-08 11:04:00) - mi fecha / hora local. Los datos se encuentran en un archivo de forma QGIS 2.14 y líneas vectoriales como captura de pantalla a continuación.

Cuando una característica como NULL en el campo 'nombre', Quiero introducir un nombre para el campo de la 'mod' carretera y debe recibir de mod ified fecha / hora como '05/08/2016 15:16:00'.

Ya probé algunas opciones y fallé. Necesito ayuda para comenzar desde el principio.

  1. Creo un nuevo campo, tipo de fecha / hora, pero permanece con el valor NULL después de editarlo, en el campo "nombre" o en la función propia.
  2. También usé la expresión now (), pero permanece con el valor NULL después de editar.

Nota: la fecha vista allí, 14/04/2016 es el primer valor creado con "Calculadora de campo".

ingrese la descripción de la imagen aquí

Estoy usando QGIS 2.14.

Carlos Pires
fuente
Por favor, editar su pregunta para especificar el formato de datos y las versiones del software en uso. También debe especificar el tipo de datos de la columna de destino (ya que los campos de fecha no tienen formatos)
Vince
Por favor, editar la pregunta para contener la información solicitada. Debe detallar lo que ha intentado y exactamente cómo falló. Esto ayudará a que nuestros voluntarios entiendan lo que está tratando de lograr. Tal como está, no hay suficiente información para más que adivinar una solución: me imagino que una columna de autopoblación en DB2 no satisfará sus necesidades.
Vince
Me parece que si desea almacenar la marca de tiempo de la última edición / actualización de una característica en un atributo, ¿lo entendí bien? ¿Algo como lo que ESRI llama 'seguimiento del editor'?
Jochen Schwarze
2
Entonces, ¿qué tipo de proveedor de datos está utilizando (forma, postgis, ...) y por cierto: ¿es el mes de 3 dígitos un error de escritura o necesita algo como 2016-may-08? quizás la captura de la señal 'beforeCommitChanges' de un 'QgsVectorLayer' o un disparador 'UPDATE' en postgesql podría ser exitosa.
Jochen Schwarze
1
Shapefile es un formato de datos miserable para las marcas de tiempo, ya que dBase solo admite resolución diurna (tampoco admite NULL). Debe usar una columna de caracteres para esta información (que luego debería analizarse para cualquier uso posterior)
Vince

Respuestas:

12

Puede usar el siguiente código que conecta el attributeValueChangedevento a una función que podemos definir que inserta los resultados de la $nowexpresión. Resalte su capa y copie / pegue lo siguiente en la Consola 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)

Seleccione la entidad haciendo clic en el número de fila (que se muestra en el cuadro rojo de la imagen) o desde el lienzo del mapa y edite cualquier atributo para esa entidad. El atributo en su modcampo debe actualizarse:

Resultado


Nota: Utilicé un campo de cadena en lugar de la fecha para obtener la hora; de lo contrario, el campo de fecha solo registra AAAA-MM-DD .

José
fuente
@CarlosPires: ¡bienvenido! Espero que ayude :)
Joseph
así que creé un nuevo campo 'mod' de cadena de texto (20) (ver 1) , pegué su código en la consola de Python (después de ctrl-alt-P), inserte el nombre del 'nombre' de la calle (vea 2) , dejó el registro pero el campo sigue siendo NULL (ver 3) como se ve en la captura de pantalla. ! [Captura de pantalla Prueba ] ( i.stack.imgur.com/lGR2D.png ).
Carlos Pires
2
¡Ahora funciona! Como no soy programador, no sabía que habíamos ejecutado el código primero. :( Lo sentimos. Nota : Funciona con la herramienta de selección. Si el campo de atributo se edita con la herramienta de información (función de identificación), no funciona.
Carlos Pires
2
@CarlosPires Puede usar el complemento AutoFields para esto. Mire este video para ver un ejemplo de cálculo automático de fecha y hora. Supongo que también debería funcionar si usa la herramienta de identificación para actualizar sus valores, ¿podría verificar?
Germán Carrillo
1
@ GermánCarrillo, parece una buena elección. Voy a intentar más tarde. Gracias.
Carlos Pires
3

Me topé con estas preguntas y respuestas mientras buscaba una forma de cambios de fecha / hora que estaba haciendo en los registros usando un complemento. Coloqué una versión ligeramente modificada del código en el complemento para actualizar automáticamente la fecha / hora en los registros que cambié:

""" 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
fuente
Técnicamente, esto no parece ser una respuesta, pero creo que esta "respuesta" puede tener algún valor para un futuro lector como parte de las preguntas y respuestas, por lo que la estoy dejando en su lugar. Necesita más formato del que permitiría convertirlo en un comentario. Estoy feliz de ser anulado si alguien más cercano a escribir QGIS Plug-ins que yo quiero presentar un caso en los comentarios aquí y luego enviarme un ping u otro moderador.
PolyGeo