Czy tworzysz etykietę sformatowaną jak „1000” z pola numerycznego?

9

To pytanie opiera się na poprzednim pytaniu, na które natknąłem się na gis.stackexchange: jak łatwo edytować dane atrybutów za pomocą wyrażeń regularnych?

Być może ktoś może skierować mnie w dobrym kierunku?

Mam wektorowy plik kształtu linii konturowych. W tabeli atrybutów przekonwertowałem już pole o nazwie FEET składające się z danych liczb całkowitych zawierających wartości wysokości na pole łańcuchowe o nazwie Label. Dodatkowo z powodzeniem dodałem „na końcu łańcucha”, aby po oznaczeniu danych odczytać je jako stopy.

Następną rzeczą, którą próbuję zrobić, jest wstawienie przecinka między dwiema pierwszymi wartościami ciągu tylko wtedy, gdy długość łańcucha jest większa niż 4, lub tak, aby przecinek pojawił się tylko między tysiącami a setkami cyfr w polu Etykieta. Długość musi być większa niż 4, ponieważ liczę też „

Mój kod do tej pory to:

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

jednak funkcja regexp_replace nie wydaje się akceptować zmiennych grupowych $ 1 $ 2 w 3. parametrze funkcji.

Patrzyłem na http://docs.python.org/2/library/re.html, ponieważ regex kalkulatora polowego pochodzi z tego, co rozumiem na podstawie użycia regexu przez Pythona, ale nie byłem w stanie tego zrozumieć. Być może to, co próbuję zrobić, nie jest jeszcze możliwe dzięki tej funkcji w kalkulatorze polowym w QGIS 1.8 na Mac OSX. Lub bardziej prawdopodobne, że moja składnia jest nieprawidłowa, ponieważ jestem początkującym programistą i nieco nowy w wyrażeniach regularnych.

Clhenrick
źródło
Czy trzeba go zakodować - czy nie byłoby prostym sposobem (w programie Excel lub podobnym) utworzenie nowej kolumny, w której etykieta była sformatowana tak, jak tego chciałeś - wystarczy użyć kilku konkatenowanych poleceń.
Andrew Tice
Tak, byłby to jeden ze sposobów rozwiązania problemu, jednak próbuję go rozwiązać z poziomu QGIS lub za pomocą Pythona.
Clhenrick
@chrishenrick - czy moja odpowiedź go rozwiązała?
Stev_k
@Stev_k nie miał jeszcze czasu, aby go wypróbować, zrobi to wkrótce i powiadomi Cię o tym. Dzięki za pomoc!
clhenrick

Odpowiedzi:

8

Udało się to za pomocą dwóch funkcji łańcuchowych w kalkulatorze QGIS w wersji 2.6 Mac OS XI. Oto kroki:

  1. Za pomocą kalkulatora pola utwórz nowe pole, które jest typem ciągu o odpowiedniej szerokości.

  2. Uruchom następujące wyrażenie, aby ustawić wartość pola:
    concat( format_number( "Field_name" , 0) , '\'')

Utworzyło to kolumnę ze sznurkiem sformatowanym tak, jak chciałem, więc na przykład liczba 2000zostanie sformatowana 2,000'za pomocą znaku końca 'dla stóp.

Clhenrick
źródło
6

QGIS stworzył funkcję wywoływaną w format_numbercelu rozwiązania tego problemu. Po prostu zrobić format_number(12345,0), aby dostać 12,345.

Minh Mai
źródło
To dobra wiadomość. Chociaż część mojego pytania dotyczy dopisania 'na końcu numeru reprezentującego „stopy”. Czy za pomocą tej funkcji można wykonać następujące czynności w QGIS? format_number(12345,0) + "'"
clhenrick
Wierzę, że odpowiedź będzie concat(tostring(format_number(12345,0)), "'"). Trzeba najpierw przekształcić sformatowaną liczbę w ciąg znaków za pomocą tostringfunkcji, a następnie użyć concatfunkcji do dołączenia „na końcu”.
Minh Mai
Ma to sens, oto, co napisałem w mojej odpowiedzi powyżej i działało:concat( format_number( "Field_name" , 0) , '\'')
clhenrick
3

Możesz łatwo grupować cyfry w Pythonie. Oto funkcja, której użyłem, i myślę, że znalazłem ją na 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
źródło
dzięki za sugestię, dmahr. jednak nie jestem pewien, jak zaimplementować tę funkcję w QGIS. Próbowałem wyciąć i wkleić tę funkcję do wyrażenia pola kalkulatora i ustawić n na nazwę mojego pola, ale bez powodzenia. Czy istnieje sposób na implementację skryptów Python w QGIS poza kalkulatorem polowym?
clhenrick
3

Dla osób, których ustawienia regionalne nie mieszczą się w pożądanym format_numberformacie, nie jest to odpowiednie rozwiązanie. Na przykład w moim francuskim systemie format_number(2000)zawsze wyświetla 2 000(z odstępem jako separator tysięcy) niezależnie od ustawień języka QGIS, chociaż czasami potrzebuję wyświetlacza w stylu angielskim - np. 2,000.

W takich przypadkach działa następujące (i nieco kłopotliwe) podejście (przynajmniej w QGIS 2.18):

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

Możesz oczywiście zastąpić ','dowolnym separatorem tysięcy. Pamiętaj, że to wyrażenie działa tylko z liczbami niższymi niż 1 000 000.

ArMoraer
źródło
2

W QGIS funkcja „numer_formatu” w menu napisów w kalkulatorze pola formatuje liczby, aby lokalizować określone separatory i miejsca dziesiętne.

forkandwait
źródło
zobacz mój komentarz w odpowiedzi Minh Mai.
clhenrick
1

Jest to trochę bardziej skomplikowane niż w QGis. Zgodnie z tym artykułem musisz utworzyć własną definicję funkcji w Pythonie, a następnie zaimportować ją do QGis (można to zrobić automatycznie przy uruchomieniu). To może wydawać się trudne, ale musisz to zrobić tylko raz i zawsze będzie tam!

Jest to funkcja, której użyłem, w oparciu o powyższe dmahr. Nie jestem pewien, jak radzi sobie z łańcuchami, ponieważ nieco zmodyfikowałem kod.

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]

Następnie zapisz go w .qgis / python, zaimportuj plik do QGis za pomocą konsoli, a następnie pojawi się w funkcjach „Python” w narzędziu do etykiet.

Użyłem wyrażenia: tysiące_comma („[nazwa_pola]”, „,”)

Stev_k
źródło
Poza tym nie widziałem, której wersji używasz - powinieneś zaktualizować do wersji 2.0, aby ta
funkcja
cześć, dziękuję i przepraszam za spóźnioną odpowiedź. Korzystam z wersji 2.2 Mac OS X 10.9.5 Gdzie dokładnie umieścić plik python? Zakładam, że gdzieś /Applications/QGIS.app/Contents/Resources/python/?
clhenrick,
Zobacz moją odpowiedź poniżej, aby uzyskać znacznie prostszą poprawkę. Nie wiem jednak, jaka wersja jest potrzebna, aby działała.
forkandwait