Tornando o campo de data e hora atualizado automaticamente no QGIS?


8

Quero criar um campo atualizado de data e hora enquanto edito um campo de atributo neste formato aaaa-mm-dd 00:00:00 (= 2016-05-08 11:04:00) - minha data / hora local. Os dados estão em um shapefile do QGIS 2.14 e nas linhas Vector como captura de tela abaixo.

Quando um recurso como NULL no campo 'nome', eu quero introduzir um nome para a estrada e o campo 'mod' deve receber de mod ified data / hora como '2016/05/08 15:16:00'.

Eu já tentei algumas opções e falhei. Preciso de ajuda para começar do começo.

  1. Crio um novo campo, tipo data / hora, mas permanece com o valor NULL após a edição, no campo "nome" ou no recurso que ele próprio.
  2. Também usei a expressão now (), mas permanece com o valor NULL após a edição.

Nota: a data vista lá, 14/04/2016 é o primeiro valor criado com "Calculadora de campo".

insira a descrição da imagem aqui

Estou usando o QGIS 2.14.


Por favor edite sua pergunta para especificar o formato de dados e as versões do software em uso. Você também deve especificar o tipo de dados da coluna de destino (uma vez que os campos de data não têm formatos)
Vince

Por favor editar a pergunta para conter as informações solicitadas. Você deve detalhar o que tentou e exatamente como ele falhou. Isso ajudará a permitir que nossos voluntários entendam o que você está tentando alcançar. Tal como está, não há informações suficientes para mais do que adivinhar uma solução - estou imaginando que uma coluna de preenchimento automático no DB2 não atenda às suas necessidades.
Vince

Parece-me que você gostaria de armazenar o carimbo de data e hora da última edição / atualização de um recurso em um atributo, entendi direito? Algo parecido com o que a ESRI chama de 'rastreamento de editor'?
Jochen Schwarze

2
então que tipo de provedor de dados você está usando (forma, postgis, ...) e, a propósito: o mês de 3 dígitos é um erro de digitação ou você precisa de algo como 2016-may-08? talvez captar o sinal 'beforeCommitChanges' de um gatilho 'QgsVectorLayer' ou 'UPDATE' no postgesql possa ser bem-sucedido.
Jochen Schwarze

1
Shapefile é um formato de dados miserável para registros de data e hora, pois o dBase suporta apenas a resolução diurna (também não suporta NULLs). Você precisa usar uma coluna de caracteres para obter essa informação (o que, em seguida, precisa ser analisado para qualquer outro uso)
Vince

Respostas:


12

Você pode usar o código a seguir que conecta o attributeValueChangedevento a uma função que podemos definir que insere os resultados da $nowexpressão. Destaque sua camada e copie / cole o seguinte no Console 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)

Selecione o recurso clicando no número da linha (mostrado na caixa vermelha na imagem) ou na tela do mapa e edite qualquer atributo para esse recurso. O atributo em seu modcampo deve atualizar:

Resultado


Nota: usei um campo de sequência em vez de data para obter a hora, caso contrário, o campo de data registra apenas AAAA-MM-DD .


@CarlosPires - Muito bem-vindo! Espero que ajude :)
Joseph

então criei um novo campo de texto (20) 'mod' (veja 1) , colei seu código no console do Python (depois de ctrl-alt-P), insira o nome da rua 'name' (veja 2) , saiu do registro, mas o campo ainda é NULL (veja 3), como você vê na captura de tela. ! [ScreenshotTry] ( i.stack.imgur.com/lGR2D.png ).
Carlos Pires

2
Agora funciona! Como eu não sou programador, não sabia que primeiro executamos o código! :( Desculpe. Nota : Funciona com a ferramenta de seleção. Se o campo de atributo for editado com a ferramenta de informações (recurso de identificação), ele não funciona.
Carlos Pires

2
@CarlosPires Você pode usar o plugin AutoFields para isso. Assista a este vídeo para um exemplo de cálculo automático de data e hora. Eu acho que também deve funcionar se você usar a ferramenta de identificação para atualizar seus valores, poderia verificar?
Germán Carrillo

1
@ GermánCarrillo, parece uma boa escolha. Vou tentar mais tarde Obrigado.
Carlos Pires

3

Eu me deparei com essas perguntas e respostas enquanto procurava uma maneira de alterar as datas / horas que estava fazendo nos registros usando um plug-in. Coloquei uma versão ligeiramente modificada do código no plug-in para atualizar automaticamente a data / hora nos registros que alterei:

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

Tecnicamente, isso não parece ser uma resposta, mas acho que essa "resposta" pode ter algum valor para um futuro leitor como parte das perguntas e respostas e, portanto, estou deixando-a no lugar. Ele precisa de mais formatação do que a conversão em um comentário permitiria. Fico feliz em ser anulado se alguém mais próximo de escrever os plug-ins do QGIS do que eu quiser fazer um caso nos comentários aqui e depois fazer ping em mim ou em outro moderador.
PolyGeo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.