O que é a sintaxe de "mapeamento de campo" da ferramenta Refactor Fields no QGIS?

10

No QGIS, existe esta boa ferramenta "Refatorar campos" na caixa de ferramentas de processamento:

Ferramenta Refatorar campos

Usá-lo em uma única camada é bastante simples.

No entanto, quando você planeja usá-lo em um lote, é possível ver a caixa de texto "Mapeamento de campos" . Estou procurando um exemplo da sintaxe a ser usada lá . Ainda não encontrei nenhuma documentação específica.

Refatorar em lote

gisnside
fonte
Depois de executar um refactoring do GUI, você pode assistir o comando no processamento -> menu Histórico (Ctrl + Alt + H)
kadarivan

Respostas:

7

Não é muito confortável, mas a seguinte é a sintaxe necessária para essa caixa de texto (eu a escrevo em várias linhas apenas por uma questão de clareza):

{'expression': u'type the expression here',
 'length': <type the length>,
 'type': <code of the type>,
 'name': u'type the field name here',
 'precision': <type the precision>}

Por exemplo (lembre-se de usar colchetes):

{'expression': u'"FLAG1"+"FLAG2"',
 'length': 20, 'type': 6,
 'name': u'FLAG1',
 'precision': 5}

Você precisa escrever tantas linhas como a acima, como o número de campos de entrada, separados por vírgulas. Por exemplo, se sua camada contiver três campos:

{'expression': u'"FLAG1"+"FLAG2"', 'length': 20, 'type': 6, 'name': u'FLAG1', 'precision': 5}, {'expression': u'100*"FLAG2"', 'length': 20, 'type': 6, 'name': u'FLAG2', 'precision': 5}, {'expression': u'"100-"FLAG2"', 'length': 20, 'type': 6, 'name': u'FLAG3', 'precision': 5}

e deve funcionar (funcionou para mim).

Observe que você pode evitar usar essa sintaxe orientada a dicionário e usar diretamente os valores necessários. Por exemplo, com referência ao primeiro exemplo, você pode simplesmente usar:

{u'"FLAG1"+"FLAG2"', 20, 6, u'FLAG1', 5}

Se você não usar essa sintaxe, o seguinte erro será mostrado:

Valor do parâmetro ausente: mapeamento de campos (linha 1)

mgri
fonte
2
Você pode explicar o que significa <código do tipo>? Eu tentei usar 3 assumindo que é para string (como é o terceiro nas opções suspensas), mas recebi um erro: o objeto 'int' não tem atributo ' getItem ' Consulte o log para obter mais detalhes. O código que usei é: {u '"FLAG"', 0, 3, u'FLAG ', 0} para uma das minhas camadas em que {' expression ': u' "FLAG" ',' length ': 0,' digite ': 3,' nome ': u'FLAG', 'precision': 0}.
JAT86
@ JAT86 É o número que identifica o tipo de dados (por exemplo, int, string e assim por diante). Infelizmente, não encontrei uma referência para eles, mas devo lembrar os valores para os tipos mais usados: 2 para int, 6 para double e 10 para string. Além disso, talvez você não deva especificar 0o tamanho do campo (pelo menos 1!). Por favor, deixe-me saber se você resolveu o problema.
Mgri 11/09/17
Obrigado pela resposta rápida. Talvez o processamento em lote seja muito mais complexo do que eu pensava. Tentei usar pelo menos 1 para o comprimento e 10 para o tipo de código: {u '"FLAG"', 1, 10, u'FLAG ', 0} Ainda assim, o erro aparece: o objeto' int 'não tem atributo' getItem 'Veja o log para mais detalhes. Meu camada tem os seguintes atributos: Nome: bandeira, Tipo: corda, Comprimento: 0, Precisão: 0, Expressão: "flag"
JAT86
@ JAT86 A execução da ferramenta a partir da GUI retorna algum problema?
MGRI
Se por GUI você quis dizer uma única camada, não, não teve nenhum problema. A coluna FLAG foi excluída com sucesso ao "clicar em Excluir campo selecionado" e foi salva em uma nova camada "Refatorada".
JAT86
2

Existe outro algoritmo semelhante a esse, cuja interface simplifica melhor o processo em lote.

insira a descrição da imagem aqui

Carmen Carmen Hernández
fonte
1
Inglês english
BERA
A tradução em inglês para o item de menu em questão é "Adicionar campo à tabela de atributos"
J. Taylor