Vous créez une étiquette au format «1 000» à partir d'un champ numérique?

9

Cette question s'appuie sur une question précédente que j'ai rencontrée sur gis.stackexchange: Comment modifier facilement les données d'attribut à l'aide d'expressions régulières?

Peut-être que quelqu'un peut me diriger dans la bonne direction?

J'ai un fichier vectoriel de courbes de niveau. Dans la table d'attributs, j'ai déjà converti un champ appelé FEET composé de données entières contenant des valeurs d'élévation en un champ de chaîne appelé Label. De plus, j'ai correctement ajouté un 'à la fin de la chaîne de sorte que lorsque les données sont étiquetées, elles seront lues comme des pieds.

La prochaine chose que j'essaie de faire est d'insérer une virgule entre les deux premières valeurs de la chaîne uniquement si la longueur de la chaîne est supérieure à 4, ou pour qu'une virgule n'apparaisse qu'entre les milliers et les centaines de chiffres dans le champ Étiquette. La longueur doit être supérieure à 4 car je compte également le '

Jusqu'à présent, mon code est:

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

cependant la fonction regexp_replace ne semble pas accepter les variables de groupe $ 1 $ 2 dans le 3ème paramètre de la fonction.

J'ai regardé http://docs.python.org/2/library/re.html car l'expression rationnelle de la calculatrice de champ provient de ce que je comprends basée sur l'utilisation de l'expression rationnelle par python mais je n'ai pas été en mesure de le comprendre. Peut-être que ce que j'essaie de faire n'est pas encore possible avec cette fonction dans la calculatrice de champ dans QGIS 1.8 sur mac OSX. Ou plus probablement ma syntaxe est erronée car je suis un programmeur débutant et quelque peu nouveau pour les expressions régulières.

clhenrick
la source
Doit-il être codé - ne serait-ce pas une manière simple de créer (dans Excel ou similaire) une nouvelle colonne qui avait le libellé formulé comme vous le vouliez - tout ce que vous auriez à utiliser est quelques commandes concaténées.
Andrew Tice
Oui, ce serait une façon de résoudre le problème, mais j'essaie de le résoudre à partir de QGIS ou avec python.
clhenrick
@chrishenrick - ma réponse l'a-t-elle résolu pour vous?
Stev_k
@Stev_k n'a pas encore eu le temps de l'essayer, le fera bientôt et vous le fera savoir. Merci de votre aide!
clhenrick

Réponses:

8

À l'aide de deux fonctions de chaîne dans la calculatrice QGIS sur la version 2.6 Mac OS XI a pu accomplir cela. Voici les étapes:

  1. À l'aide de la calculatrice de champ, créez un nouveau champ qui est un type de chaîne avec une largeur appropriée.

  2. Exécutez l'expression suivante pour définir la valeur du champ:
    concat( format_number( "Field_name" , 0) , '\'')

Cela a créé une colonne avec une chaîne formatée comme je le souhaitais, par exemple, le nombre 2000serait formaté 2,000'avec la fin 'qui représente les pieds.

clhenrick
la source
6

QGIS a créé une fonction appelée format_numberpour résoudre ce problème. Vous n'avez format_number(12345,0)qu'à l'obtenir 12,345.

Minh Mai
la source
C'est une bonne nouvelle. Bien qu'une partie de ma question consiste à ajouter un 'à la fin du nombre pour représenter les "pieds". Pourriez-vous effectuer les opérations suivantes dans QGIS avec cette fonction? format_number(12345,0) + "'"
clhenrick
Je pense que la réponse serait concat(tostring(format_number(12345,0)), "'"). Vous devez d'abord transformer le nombre formaté en une chaîne à l'aide de la tostringfonction, puis utiliser la concatfonction pour attacher le 'à la fin.
Minh Mai
C'est logique, c'est ce que j'ai posté dans ma réponse ci-dessus et travaillé:concat( format_number( "Field_name" , 0) , '\'')
clhenrick
3

Vous pouvez facilement regrouper les chiffres en Python. Voici une fonction que j'ai utilisée, que je pense avoir trouvée sur 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
la source
merci pour la suggestion, dmahr. cependant, je ne sais pas comment implémenter cette fonction dans QGIS. J'ai tenté de couper et de coller cette fonction dans l'expression de la calculatrice de champ et de définir n sur mon nom de champ, mais sans succès. Existe-t-il un moyen d'implémenter des scripts python dans QGIS en dehors de la calculatrice de champ?
clhenrick
3

Pour les personnes dont les paramètres régionaux ne correspondent pas à l'affichage de mise en forme souhaité, ce format_numbern'est pas une solution adéquate. Par exemple, sur mon système français, format_number(2000)affiche toujours 2 000(avec un espace comme séparateur de milliers) indépendamment des paramètres de langue QGIS, même si j'ai parfois besoin d'un affichage "à l'anglaise" - par exemple. 2,000.

Dans de tels cas, l'approche suivante (et quelque peu lourde) fonctionne (au moins sur QGIS 2.18):

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

Vous pouvez bien sûr remplacer ','par le séparateur de milliers que vous souhaitez. Notez que cette expression ne fonctionne qu'avec des nombres inférieurs à 1 000 000.

ArMoraer
la source
2

Dans QGIS, la fonction "format_number" sous le menu chaîne dans la calculatrice de champ reformate les nombres en séparateurs et décimales spécifiques aux paramètres régionaux.

forkandwait
la source
voir mon commentaire dans la réponse de Minh Mai.
clhenrick
1

C'est un peu plus compliqué que cela dans QGis. Selon cet article , vous devez créer votre propre définition de fonction en Python, puis l'importer dans QGis (cela peut être fait automatiquement au démarrage). Cela peut sembler délicat, mais vous ne devez le faire qu'une seule fois et il sera toujours là!

C'est la fonction que j'ai utilisée, basée sur dmahr ci-dessus. Je ne sais pas comment il traite les chaînes, car j'ai un peu modifié le code.

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]

Vous enregistrez ensuite cela dans .qgis / python, importez le fichier dans QGis à l'aide de la console, puis il apparaîtra dans les fonctions "Python" de l'outil d'étiquetage.

L'expression que j'ai utilisée est: milliers_comma ("[field_name]", ',')

Stev_k
la source
De plus, je n'ai pas vu la version que vous utilisiez - vous devriez passer à la version 2.0 pour que cela fonctionne
Stev_k
salut, merci et désolé pour la réponse tardive. Je suis sur v2.6 Mac OS X 10.9.5 Où dois-je placer exactement le fichier python? Je suppose quelque part /Applications/QGIS.app/Contents/Resources/python/?
clhenrick
Voir ma réponse ci-dessous pour une solution beaucoup plus simple. Je ne sais pas quelle version est nécessaire pour le faire fonctionner.
forkandwait