Criando etiqueta formatada como "1.000" no campo numérico?

9

Esta pergunta baseia-se em uma pergunta anterior que encontrei em gis.stackexchange: Como editar facilmente dados de atributos usando Expressões regulares?

Talvez alguém possa me apontar na direção certa?

Eu tenho um shapefile de vetor de linhas de contorno. Na tabela de atributos, eu já converti um campo chamado FEET, que consiste em dados inteiros contendo valores de elevação em um campo de string chamado Label. Além disso, anexei com êxito um 'ao final da string, para que, quando os dados forem rotulados, sejam lidos como pés.

A próxima coisa que estou tentando fazer é inserir uma vírgula entre os dois primeiros valores da string apenas se o comprimento da string for maior que 4 ou para que uma vírgula apareça apenas entre os milhares e centenas de dígitos no campo Label. O comprimento deve ser maior que 4, porque também estou contando o '

Meu código até agora é:

case when  length( "Label") >4  then regexp_replace( "Label", '^([0-9])+([0-9]{3}\')$','$1 , $2') else "Label" end

no entanto, a função regexp_replace parece não aceitar as variáveis ​​de grupo $ 1 $ 2 no terceiro parâmetro da função.

Eu olhei http://docs.python.org/2/library/re.html como o regex campo-calculadora é pelo que eu entendo com base no uso de python de regex, mas não foram capazes de descobrir isso. Talvez o que estou tentando fazer ainda não seja possível com esta função na calculadora de campo no QGIS 1.8 no mac OSX. Ou, mais provavelmente, minha sintaxe está errada, pois sou um programador iniciante e um tanto novo para expressões regulares.

Clhenrick
fonte
Ele precisa ser codificado - não seria uma maneira simples (no Excel ou similar) criar uma nova coluna com o rótulo formatado da maneira que você queria - tudo o que você precisaria usar seria um comando concatenado.
Andrew Tice
Sim, essa seria uma maneira de resolver o problema, no entanto, estou tentando resolvê-lo no QGIS ou com python.
clhenrick
@chrishenrick - minha resposta resolveu isso para você?
26613 Stev_k
@Stev_k ainda não teve tempo de experimentá-lo, fará isso em breve e informará. Obrigado pela ajuda!
clhenrick

Respostas:

8

O uso de duas funções de seqüência de caracteres na calculadora QGIS na versão 2.6 do Mac OS XI conseguiu isso. Aqui estão os passos:

  1. Usando a calculadora de campo, crie um novo campo que seja um tipo de sequência com uma largura relevante.

  2. Execute a seguinte expressão para definir o valor do campo:
    concat( format_number( "Field_name" , 0) , '\'')

Isso criou uma coluna com uma string formatada como eu queria, por exemplo, o número 2000seria formatado 2,000'com o final 'que significa pés.

Clhenrick
fonte
6

O QGIS criou uma função chamada format_numberpara resolver isso. Você simplesmente faz format_number(12345,0)para conseguir 12,345.

Minh Mai
fonte
Boas notícias. Embora parte da minha pergunta envolva anexar 'a ao final do número para representar "pés". Você seria capaz de fazer o seguinte no QGIS com esta função? format_number(12345,0) + "'"
clhenrick
Eu acredito que a resposta seria concat(tostring(format_number(12345,0)), "'"). Você precisaria primeiro transformar o número formatado em uma string usando a tostringfunção e, em seguida, use a concatfunção para anexar o 'no final.
Minh Mai
Faz sentido, isso é o que eu postei na minha resposta acima e funcionou:concat( format_number( "Field_name" , 0) , '\'')
clhenrick
3

Você pode fazer o agrupamento de dígitos facilmente no Python. Aqui está uma função que eu usei, que acho que encontrei no StackOverflow:

def digitgroup(n, sep = ','):
    if n == "": n = 0
    s = str(n)[::-1]
    groups = []
    i = 0
    while i < len(s):
        groups.append(s[i:i+3])
        i += 3
    return sep.join(groups)[::-1]
dmahr
fonte
obrigado pela sugestão, dmahr. no entanto, não estou claro como implementar essa função no QGIS. Tentei recortar e colar esta função na expressão da calculadora de campo e definir n para o nome do meu campo, mas sem sorte. Existe uma maneira de implementar scripts python no QGIS fora da calculadora de campo?
clhenrick
3

Para pessoas cuja localidade não se ajusta à exibição de formatação desejada, format_numbernão é uma solução adequada. Por exemplo, no meu sistema francês, format_number(2000)sempre é exibido 2 000(com um espaço como separador de milhares) independentemente das configurações de idioma do QGIS, embora às vezes eu precise de uma exibição em "estilo inglês" - por exemplo. 2,000.

Nesses casos, a seguinte abordagem (e um tanto complicada) funciona (pelo menos no QGIS 2.18):

if (your_field > 1000,
  concat(
    floor(your_field/1000),
    ',',
    your_field-1000*floor(your_field/1000)
  ),
  your_field
)

É claro que você pode substituir ','por qualquer separador de milhares que desejar. Observe que essa expressão funciona apenas com números inferiores a 1.000.000.

ArMoraer
fonte
2

No QGIS, a função "format_number" no menu de strings da calculadora de campos reformata os números para separadores específicos de localidades e casas decimais.

forkandwait
fonte
veja meu comentário na resposta de Minh Mai.
clhenrick
1

É um pouco mais complicado do que isso nos QGis. De acordo com este artigo , você deve criar sua própria definição de função no Python e importá-la para o QGis (isso pode ser feito automaticamente na inicialização). Isso pode parecer complicado, mas você só precisa fazer uma vez e sempre estará lá!

Esta é a função que eu usei, com base nos dmahrs acima. Não tenho certeza de como ele lida com as strings, pois modifiquei um pouco o código.

from qgis.utils import qgsfunction
from qgis.core import QGis

@qgsfunction(2, "Python") # number of arguments
def thousands_separator(values, feature, parent): # values are the arguments passed in
    # this is the documentation for your function which you will see in QGis
    """
    Adds a separator to values over 1000\n        
    Parameters: (n, sep) \n                   
    n = expression_field \n
    sep = desired separator (default is ",")
    """ 
    number = values[0]                        # the first argument (which in the
    separator = values[1]                     # labelling case is a field name
    if separator == '':
        separator = ','
    s = str(number)[::-1]
    groups = []
    i = 0
    while i < len(s):
        groups.append(s[i:i+3])
        i += 3
    return separator.join(groups)[::-1]

Em seguida, salve isso em .qgis / python, importe o arquivo para o QGis usando o console e, em seguida, ele aparecerá nas funções "Python" na ferramenta de rótulo.

A expressão que usei é: thousand_comma ("[field_name]", ',')

Stev_k
fonte
Além disso, eu não vi o que a versão que você estava usando - você deve atualizar para 2.0 para fazer este trabalho
Stev_k
oi, obrigado e desculpe pela resposta tardia. Estou na versão 2.6 do Mac OS X 10.9.5 Onde exatamente coloco o arquivo python? Eu suponho em algum lugar /Applications/QGIS.app/Contents/Resources/python/?
clhenrick
Veja minha resposta abaixo para uma correção muito mais simples. Eu não sei qual versão é necessária para fazê-la funcionar, no entanto.
forkandwait