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.
źródło
Odpowiedzi:
Udało się to za pomocą dwóch funkcji łańcuchowych w kalkulatorze QGIS w wersji 2.6 Mac OS XI. Oto kroki:
Za pomocą kalkulatora pola utwórz nowe pole, które jest typem ciągu o odpowiedniej szerokości.
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
2000
zostanie sformatowana2,000'
za pomocą znaku końca'
dla stóp.źródło
QGIS stworzył funkcję wywoływaną w
format_number
celu rozwiązania tego problemu. Po prostu zrobićformat_number(12345,0)
, aby dostać12,345
.źródło
'
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) + "'"
concat(tostring(format_number(12345,0)), "'")
. Trzeba najpierw przekształcić sformatowaną liczbę w ciąg znaków za pomocątostring
funkcji, a następnie użyćconcat
funkcji do dołączenia „na końcu”.concat( format_number( "Field_name" , 0) , '\'')
Możesz łatwo grupować cyfry w Pythonie. Oto funkcja, której użyłem, i myślę, że znalazłem ją na StackOverflow:
źródło
Dla osób, których ustawienia regionalne nie mieszczą się w pożądanym
format_number
formacie, nie jest to odpowiednie rozwiązanie. Na przykład w moim francuskim systemieformat_number(2000)
zawsze wyświetla2 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):
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.źródło
W QGIS funkcja „numer_formatu” w menu napisów w kalkulatorze pola formatuje liczby, aby lokalizować określone separatory i miejsca dziesiętne.
źródło
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.
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]”, „,”)
źródło
/Applications/QGIS.app/Contents/Resources/python/
?