Erstellen eines Etiketts, das wie "1.000" formatiert ist, aus einem numerischen Feld?

9

Diese Frage baut auf einer früheren Frage auf, die ich bei gis.stackexchange gestellt habe: Wie kann man Attributdaten einfach mit regulären Ausdrücken bearbeiten?

Vielleicht kann mich jemand in die richtige Richtung weisen?

Ich habe ein Vektor-Shapefile mit Konturlinien. In der Attributtabelle habe ich bereits ein Feld namens FEET, das aus ganzzahligen Daten mit Höhenwerten besteht, in ein Zeichenfolgenfeld namens Label konvertiert. Zusätzlich habe ich erfolgreich ein 'an das Ende der Zeichenfolge angehängt, damit die Daten, wenn sie beschriftet sind, als Fuß gelesen werden.

Als nächstes versuche ich, nur dann ein Komma zwischen die ersten beiden Werte der Zeichenfolge einzufügen, wenn die Zeichenfolgenlänge größer als 4 ist, oder damit ein Komma nur zwischen den Tausend- und Hunderterstellen im Feld Beschriftung angezeigt wird. Die Länge muss größer als 4 sein, weil ich auch die '

Mein bisheriger Code lautet:

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

Die Funktion regexp_replace scheint jedoch die Gruppenvariablen $ 1 $ 2 im 3. Parameter der Funktion nicht zu akzeptieren.

Ich habe mir http://docs.python.org/2/library/re.html angesehen, da der Regex des Feldrechners nach meinem Verständnis auf der Verwendung von Regex durch Python basiert, dies aber nicht herausfinden konnte. Vielleicht ist das, was ich versuche, mit dieser Funktion im Feldrechner in QGIS 1.8 unter Mac OSX noch nicht möglich. Oder eher ist meine Syntax falsch, da ich ein unerfahrener Programmierer bin und für reguläre Ausdrücke etwas neu bin.

Clhenrick
quelle
Muss es codiert werden? Wäre es nicht einfach, (in Excel oder ähnlichem) eine neue Spalte zu erstellen, in der die Beschriftung so formatiert ist, wie Sie es möchten? Sie müssten lediglich ein paar Verkettungsbefehle verwenden.
Andrew Tice
Ja, das wäre eine Möglichkeit, das Problem zu lösen. Ich versuche jedoch, es in QGIS oder mit Python zu lösen.
Clhenrick
@chrishenrick - hat meine Antwort es für Sie gelöst?
Stev_k
@Stev_k hatte noch keine Zeit, es zu versuchen, werde es bald tun und dich wissen lassen. Danke für Ihre Hilfe!
Clhenrick

Antworten:

8

Die Verwendung von zwei Zeichenfolgenfunktionen im QGIS-Rechner unter Version 2.6 Mac OS XI konnte dies erreichen. Hier sind die Schritte:

  1. Erstellen Sie mit dem Feldrechner ein neues Feld, das ein Zeichenfolgentyp mit einer relevanten Breite ist.

  2. Führen Sie den folgenden Ausdruck aus, um den Wert des Felds festzulegen:
    concat( format_number( "Field_name" , 0) , '\'')

Dadurch wurde eine Spalte mit einer Zeichenfolge erstellt, die wie gewünscht formatiert wurde. So wurde beispielsweise die Zahl mit dem nachgestellten 2000Zeichen formatiert, das für Fuß steht.2,000''

Clhenrick
quelle
6

QGIS hat eine Funktion erstellt, die aufgerufen wird format_number, um dies zu beheben. Sie tun format_number(12345,0)es einfach, um zu bekommen 12,345.

Minh Mai
quelle
Das sind gute Neuigkeiten. Obwohl ein Teil meiner Frage darin besteht, ein 'an das Ende der Zahl anzuhängen , um "Füße" darzustellen. Könnten Sie mit dieser Funktion in QGIS Folgendes tun? format_number(12345,0) + "'"
Clhenrick
Ich glaube die Antwort wäre concat(tostring(format_number(12345,0)), "'"). Sie müssten zuerst die formatierte Zahl mit der tostringFunktion in eine Zeichenfolge umwandeln und dann mit der concatFunktion das 'am Ende anhängen.
Minh Mai
Sinnvoll, das habe ich oben in meiner Antwort gepostet und gearbeitet:concat( format_number( "Field_name" , 0) , '\'')
Clhenrick
3

Sie können die Zifferngruppierung in Python einfach durchführen. Hier ist eine Funktion, die ich verwendet habe und die ich bei StackOverflow gefunden habe:

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
quelle
danke für den vorschlag, dmahr. Ich bin mir jedoch nicht sicher, wie diese Funktion in QGIS implementiert werden soll. Ich habe versucht, diese Funktion auszuschneiden und in den Feldrechnerausdruck einzufügen und n auf meinen Feldnamen zu setzen, aber ohne Glück. Gibt es eine Möglichkeit, Python-Scripting in QGIS außerhalb des Feldrechners zu implementieren?
Clhenrick
3

Für Personen, deren Gebietsschema nicht zur gewünschten Formatierungsanzeige passt, format_numberist dies keine adäquate Lösung. Beispielsweise werden auf meinem französischen System format_number(2000)immer Anzeigen 2 000(mit einem Leerzeichen als Tausendertrennzeichen) unabhängig von den QGIS-Spracheinstellungen angezeigt, obwohl ich manchmal eine Anzeige im "englischen Stil" benötige - z. 2,000.

In solchen Fällen funktioniert der folgende (und etwas umständliche) Ansatz (zumindest unter QGIS 2.18):

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

Sie können natürlich durch ','jedes gewünschte Tausendertrennzeichen ersetzen . Beachten Sie, dass dieser Ausdruck nur mit Zahlen unter 1.000.000 funktioniert.

ArMoraer
quelle
2

In QGIS formatiert die Funktion "format_number" unter dem Zeichenfolgenmenü im Feldrechner Zahlen neu, um bestimmte Trennzeichen und Dezimalstellen zu lokalisieren.

Gabel und warten
quelle
siehe meinen Kommentar in der Antwort von Minh Mai.
Clhenrick
1

Es ist etwas komplizierter als das in QGis. Gemäß diesem Artikel haben Sie Ihre eigene Funktionsdefinition in Python erstellen, dann importieren Sie es in qgis (dies automatisch beim Start durchgeführt werden kann). Dies mag schwierig erscheinen, aber Sie müssen es nur einmal tun und es wird immer da sein!

Dies ist die Funktion, die ich basierend auf der obigen Beschreibung von dmahr verwendet habe. Ich bin mir nicht sicher, wie es mit Strings umgeht, da ich den Code ein wenig geändert habe.

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]

Sie speichern das dann in .qgis / python, importieren die Datei über die Konsole in QGis und werden dann in den "Python" -Funktionen des Beschriftungstools angezeigt.

Der Ausdruck, den ich verwendet habe, ist: Tausende_Komma ("[Feldname]", ',')

Stev_k
quelle
Außerdem habe ich nicht gesehen, welche Version Sie verwendet haben - Sie sollten auf 2.0 aktualisieren, damit dies funktioniert
Stev_k
Hallo, danke und Entschuldigung für die späte Antwort. Ich bin auf v2.6 Mac OS X 10.9.5. Wo genau platziere ich die Python-Datei? Ich nehme irgendwo in an /Applications/QGIS.app/Contents/Resources/python/?
Clhenrick
Siehe meine Antwort unten für eine viel einfachere Lösung. Ich weiß allerdings nicht, welche Version benötigt wird, damit es funktioniert.
Forkandwait