Створення мітки, відформатованої як "1000" з числового поля?


9

Це питання ґрунтується на попередньому питанні, на яке я натрапив на gis.stackexchange: Як легко редагувати дані атрибутів за допомогою регулярних виразів?

Можливо, хтось може вказати мені в правильному напрямку?

У мене векторний профіль форми контурних ліній. У таблиці атрибутів я вже перетворив поле під назвою FEET, що складається з цілих даних, що містять значення висоти, у рядкове поле під назвою Label. Крім того, я успішно додав "до кінця рядка", щоб, коли дані позначені міткою, вони будуть читатися як ноги.

Наступне, що я намагаюся зробити, - це вставити кому між першими двома значеннями рядка, лише якщо довжина рядка перевищує 4, або так, що кома з’явиться лише між тисячами і сотнями цифр у полі Мітка. Довжина повинна бути більше 4, тому що я також рахую '

Мій код поки що:

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

однак функція regexp_replace, схоже, не приймає змінних групи $ 1 $ 2 у третьому параметрі функції.

Я дивився на http://docs.python.org/2/library/re.html, як регекс польового калькулятора - це те, що я розумію, на основі використання регулярного виразу python, але не зміг цього зрозуміти. Можливо, те, що я намагаюся зробити, поки що неможливо за допомогою цієї функції в польовому калькуляторі в QGIS 1.8 на mac OSX. Або, швидше за все, мій синтаксис неправильний, оскільки я початківець програміст і дещо новачок у регулярних виразах.


Чи потрібно це кодувати - чи не простим способом було б (в Excel або подібному) створити новий стовпчик, який би міткував у ньому форму, як ви цього хотіли, - все, що вам потрібно буде використовувати, - це декілька об'єднаних команд.
Ендрю Тіс

Так, це був би один із способів вирішення проблеми, однак я намагаюся вирішити її з QGIS або з python.
clhenrick

@chrishenrick - моя відповідь вирішила це за тебе?
Stev_k

@Stev_k ще не встигли спробувати це, зробимо це незабаром і повідомимо вам. Спасибі за вашу допомогу!
clhenrick

Відповіді:


8

Використовуючи дві рядкові функції в калькуляторі QGIS версії 2.6 Mac OS XI змогла це досягти. Ось такі кроки:

  1. Використовуючи калькулятор поля, створіть нове поле, яке є рядком типу відповідної ширини.

  2. Виконайте наступне вираження, щоб встановити значення поля:
    concat( format_number( "Field_name" , 0) , '\'')

Це створило стовпець із форматированим рядком, як я хотів, так, наприклад, число 2000було б відформатоване 2,000'з заднім числом, 'що означає ноги.


6

QGIS створив функцію, яка викликається format_numberдля вирішення цього питання. Ви просто зробити , format_number(12345,0)щоб отримати 12,345.


Це гарна новина. Хоча частина мого питання стосується додавання 'до кінця числа, щоб зобразити "стопи". Чи зможете ви виконати наступне в QGIS за допомогою цієї функції? format_number(12345,0) + "'"
clhenrick

Я вірю, що відповідь буде concat(tostring(format_number(12345,0)), "'"). Вам слід спочатку перетворити відформатований номер у рядок за допомогою tostringфункції, а потім скористатися concatфункцією, щоб прикріпити 'в кінці.
Мінь Май

Має сенс, ось що я опублікував у своїй відповіді вище і працював:concat( format_number( "Field_name" , 0) , '\'')
clhenrick

3

Ви можете легко згрупувати цифри в Python. Ось функція, яку я використав, і яку, на мою думку, знайшов у 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. однак мені незрозуміло, як реалізувати цю функцію в QGIS. Я спробував вирізати та вставити цю функцію у вираз калькулятора поля та встановити n до свого імені поля, але не пощастило. Чи є спосіб реалізувати сценарій python в QGIS поза полевим калькулятором?
clhenrick

3

Для людей, чий локал не відповідає бажаному дисплею форматування, format_numberне є адекватним рішенням. Наприклад, у моїй французькій системі format_number(2000)завжди відображається 2 000(з пробілом як роздільник тисяч) незалежно від мовних настройок QGIS, хоча мені іноді потрібен дисплей "англійського стилю" - наприклад. 2,000.

У таких випадках працює наступний (і дещо громіздкий) підхід (принаймні, на QGIS 2.18):

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

Звичайно, ви можете замінити ','будь-який роздільник тисяч, який ви хочете. Зауважте, що цей вираз працює лише з числами меншими за 1 000 000.


2

У QGIS функція "format_number" у рядковому меню в польовому калькуляторі переформатує номери для локалізації конкретних роздільників і десяткових знаків.


дивіться мій коментар у відповіді Мінь Май.
clhenrick

1

Це трохи складніше, ніж у QGis. Відповідно до цієї статті , ви повинні створити своє власне визначення функції в Python, а потім імпортувати його в QGis (це можна зробити автоматично при запуску). Це може здатися складним, але вам потрібно зробити це лише один раз, і це завжди буде!

Це функція, яку я використав, грунтуючись на вищезгаданому dmahr. Не знаю, як це стосується рядків, оскільки я трохи змінив код.

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]

Потім ви зберігаєте це у .qgis / python, імпортуєте файл у QGis за допомогою консолі, тоді він відображатиметься у функціях "Python" у інструменті міток.

Я використовував вираз: хиляди_кома ("[ім'я поля]", ',')


Крім того, я не бачив, яку версію ви використовуєте - вам слід оновити до 2.0, щоб зробити цю роботу
Stev_k

привіт, дякую і вибачте за пізню відповідь. Я перебуваю на v2.6 Mac OS X 10.9.5 Де саме я розміщую файл python? Я припускаю, що десь /Applications/QGIS.app/Contents/Resources/python/?
clhenrick

Дивіться мою відповідь нижче для більш простого виправлення. Я не знаю, яка версія потрібна, щоб вона працювала.
forkandwait
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.