Creare un'etichetta formattata come "1.000" dal campo numerico?


9

Questa domanda si basa su una domanda precedente che ho riscontrato su gis.stackexchange: come modificare facilmente i dati degli attributi usando le espressioni regolari?

Forse qualcuno può indicarmi la giusta direzione?

Ho un file di forma vettoriale di linee di contorno. Nella tabella degli attributi ho già convertito un campo chiamato FEET costituito da dati interi contenenti valori di elevazione in un campo stringa chiamato Etichetta. Inoltre ho aggiunto con successo un 'alla fine della stringa in modo che quando i dati vengono etichettati verranno letti come piedi.

La prossima cosa che sto tentando di fare è inserire una virgola tra i primi due valori della stringa solo se la lunghezza della stringa è maggiore di 4, o così una virgola apparirà solo tra le migliaia e le centinaia cifre nel campo Etichetta. La lunghezza deve essere maggiore di 4 perché sto anche contando il '

Il mio codice finora è:

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

tuttavia la funzione regexp_replace non sembra accettare le variabili di gruppo $ 1 $ 2 nel 3o parametro della funzione.

Ho esaminato http://docs.python.org/2/library/re.html poiché il regex di calcolatrice di campo proviene da ciò che capisco basato sull'uso di regex da parte di python ma non sono stato in grado di capirlo. Forse quello che sto tentando di fare non è ancora possibile con questa funzione nel calcolatore di campo in QGIS 1.8 su mac OSX. O più probabilmente la mia sintassi è sbagliata perché sono un programmatore alle prime armi e in qualche modo nuovo alle espressioni regolari.


Deve essere codificato - non sarebbe un modo semplice (in Excel o simile) di creare una nuova colonna con l'etichetta formata nel modo desiderato - tutto ciò che dovresti usare è qualche comando concatenato.
Andrew Tice,

Sì, sarebbe un modo per risolvere il problema, tuttavia sto cercando di risolverlo da QGIS o con Python.
clhenrick,

@chrishenrick - la mia risposta l'ha risolta per te?
Stev_k,

@Stev_k non ha ancora avuto il tempo di provarlo, lo farà presto e ti farà sapere. Grazie per l'aiuto!
clhenrick,

Risposte:


8

Utilizzando due funzioni stringa nel calcolatore QGIS sulla versione 2.6, Mac OS XI è stato in grado di farlo. Ecco i passaggi:

  1. Utilizzando il calcolatore di campo, creare un nuovo campo di tipo stringa con una larghezza rilevante.

  2. Esegui la seguente espressione per impostare il valore del campo:
    concat( format_number( "Field_name" , 0) , '\'')

Questo ha creato una colonna con una stringa formattata come volevo, ad esempio il numero 2000sarebbe stato formattato 2,000'con il trascinamento 'che sta per piedi.


6

QGIS ha creato una funzione chiamata format_numberper risolvere questo problema. È sufficiente fare format_number(12345,0)per arrivare 12,345.


Questa è una buona notizia. Anche se parte della mia domanda riguarda l'aggiunta di un 'alla fine del numero per rappresentare "piedi". Saresti in grado di eseguire le seguenti operazioni in QGIS con questa funzione? format_number(12345,0) + "'"
clhenrick,

Credo che la risposta sarebbe concat(tostring(format_number(12345,0)), "'"). Dovresti prima trasformare il numero formattato in una stringa utilizzando la tostringfunzione e quindi utilizzare la concatfunzione per allegare "alla fine.
Minh Mai,

Ha senso, questo è quello che ho pubblicato nella mia risposta sopra e ha funzionato:concat( format_number( "Field_name" , 0) , '\'')
clhenrick,

3

Puoi eseguire facilmente il raggruppamento delle cifre in Python. Ecco una funzione che ho usato, che penso di aver trovato su 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]

grazie per il suggerimento, dmahr. tuttavia non sono chiaro su come implementare questa funzione in QGIS. Ho tentato di tagliare e incollare questa funzione nell'espressione del calcolatore di campo e impostare n sul nome del mio campo, ma senza fortuna. Esiste un modo per implementare lo scripting Python in QGIS al di fuori del calcolatore di campo?
clhenrick,

3

Per le persone le cui impostazioni locali non si adattano al display di formattazione desiderato, format_numbernon è una soluzione adeguata. Ad esempio, sul mio sistema francese, format_number(2000)viene sempre visualizzato 2 000(con uno spazio come migliaia di separatori) indipendentemente dalle impostazioni della lingua QGIS, anche se a volte ho bisogno di un display "in stile inglese" - ad es. 2,000.

In questi casi, funziona il seguente (e piuttosto ingombrante) approccio (almeno su QGIS 2.18):

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

Ovviamente puoi sostituirlo ','con qualunque separatore di migliaia desideri. Nota che questa espressione funziona solo con numeri inferiori a 1.000.000.


2

In QGIS, la funzione "format_number" nel menu stringa nel calcolatore di campo riformatta i numeri in separatori specifici locali e posizioni decimali.


vedi il mio commento nella risposta di Minh Mai.
clhenrick,

1

È un po 'più complicato di quello in QGis. Come da questo articolo , devi creare la tua definizione di funzione in Python, quindi importarla in QGis (questo può essere fatto automaticamente all'avvio). Questo può sembrare complicato, ma devi farlo solo una volta e sarà sempre lì!

Questa è la funzione che ho usato, basandomi su quelle di Dmahr sopra. Non sono sicuro di come gestisca le stringhe, poiché ho modificato un po 'il codice.

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]

Quindi lo salvi in ​​.qgis / python, importa il file in QGis usando la console, quindi comparirà nelle funzioni "Python" nello strumento etichetta.

L'espressione che ho usato è: migliaia_comma ("[nome_campo]", ',')


Inoltre, non ho visto quale versione stavi utilizzando - dovresti eseguire l'aggiornamento alla 2.0 per farlo funzionare
Stev_k

ciao, grazie e scusa per la risposta tardiva. Sono su v2.6 Mac OS X 10.9.5 Dove posiziono esattamente il file python? Presumo da qualche parte in /Applications/QGIS.app/Contents/Resources/python/?
Clhenrick,

Vedi la mia risposta di seguito per una soluzione molto più semplice. Tuttavia, non so quale versione è necessaria per farlo funzionare.
Forkandwait,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.