Создание метки в формате «1000» из числового поля?

9

Этот вопрос основан на предыдущем вопросе, с которым я столкнулся на gis.stackexchange: как легко редактировать данные атрибутов с помощью регулярных выражений?

Возможно, кто-то может указать мне правильное направление?

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

Следующее, что я пытаюсь сделать, это вставить запятую между первыми двумя значениями строки, только если длина строки больше 4, или так, что запятая будет появляться только между тысячами и сотнями цифр в поле Label. Длина должна быть больше 4, потому что я также считаю '

Мой код до сих пор:

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

однако функция regexp_replace, похоже, не принимает групповые переменные $ 1 $ 2 в 3-м параметре функции.

Я посмотрел на http://docs.python.org/2/library/re.html, поскольку регулярное выражение полевого калькулятора основано на том, что, как я понимаю, основано на использовании регулярных выражений в python, но я не смог понять это. Возможно, то, что я пытаюсь сделать, пока невозможно с этой функцией в полевом калькуляторе в QGIS 1.8 на Mac OSX. Или, скорее, мой синтаксис неправильный, так как я начинающий программист и немного новичок в регулярных выражениях.

clhenrick
источник
Должен ли он быть закодирован - не будет ли простым способом (в Excel или подобном) создать новый столбец, в котором метка была бы отформатирована так, как вы этого хотели - все, что вам нужно будет использовать, - это несколько объединенных команд.
Эндрю Тис
Да, это был бы один из способов решения проблемы, однако я пытаюсь решить ее из QGIS или с помощью Python.
clhenrick
@ chrishenrick - мой ответ решил для тебя?
Stev_k
@Stev_k еще не успел попробовать, скоро все расскажет. Спасибо за вашу помощь!
Кленрик

Ответы:

8

С помощью двух строковых функций в калькуляторе QGIS в версии 2.6 Mac OS XI смогла добиться этого. Вот шаги:

  1. С помощью калькулятора полей создайте новое поле строкового типа с соответствующей шириной.

  2. Запустите следующее выражение, чтобы установить значение поля:
    concat( format_number( "Field_name" , 0) , '\'')

Это создало столбец со строкой, отформатированной так, как я хотел, например, число 2000будет отформатировано 2,000'в конце, 'который обозначает ноги.

clhenrick
источник
6

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

Минь Май
источник
Это хорошие новости. Хотя часть моего вопроса включает в себя добавление 'к концу числа, чтобы обозначить «ноги». Сможете ли вы сделать следующее в QGIS с этой функцией? format_number(12345,0) + "'"
Кленрик
Я верю, что ответ будет 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 вне калькулятора поля?
Кленрик
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.

ArMoraer
источник
2

В QGIS функция «format_number» в строковом меню калькулятора полей переформатирует числа для локализации определенных разделителей и десятичных разрядов.

forkandwait
источник
см. мой комментарий в ответе Минь Май.
Кленрик
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» в инструменте метки.

Выражение, которое я использовал: тысяч_кома ("[field_name]", ',')

Stev_k
источник
Кроме того, я не видел, какую версию вы используете - вы должны обновить до 2.0, чтобы сделать эту работу
Stev_k
привет, спасибо и извините за поздний ответ. Я на v2.6 Mac OS X 10.9.5 Где именно я помещаю файл python? Я предполагаю где-то в /Applications/QGIS.app/Contents/Resources/python/?
Кленрик
Смотрите мой ответ ниже для гораздо более простого решения. Я не знаю, какая версия нужна, чтобы она работала.
форкэндвайт