从数字字段创建格式为“ 1,000'”的标签?


9

该问题基于我在gis.stackexchange上遇到的上一个问题: 如何使用正则表达式轻松编辑属性数据?

也许有人可以指出我正确的方向?

我有轮廓线的矢量shapefile。在属性表中,我已经将一个名为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函数似乎在函数的第3个参数中不接受组变量$ 1 $ 2。

我查看了http://docs.python.org/2/library/re.html,因为根据python对regex的使用,据我所知,字段计算器正则表达式是我所了解的,但一直无法弄清楚。使用Mac OSX上的QGIS 1.8中的字段计算器中的此功能,也许我要尝试执行的操作尚无法实现。或者更可能是我的语法错误,因为我是新手程序员,并且对正则表达式有些陌生。


它是否必须进行编码-不是一个简单的方法(在Excel或类似格式中)创建一个新列,该列中的标签具有所需格式的格式-您只需要使用几个连接命令即可。
Andrew Tice

是的,那将是解决问题的一种方法,但是我正在尝试从QGIS或python解决问题。
clhenrick

@chrishenrick-我的答案为您解决了吗?
Stev_k 2013年

@Stev_k还没来得及尝试,将尽快进行尝试,并告知您。谢谢你的帮助!
clhenrick

Answers:


8

在2.6版的Mac OS XI上的QGIS计算器中使用两个字符串函数可以实现此目的。步骤如下:

  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 2015年

我相信答案会是concat(tostring(format_number(12345,0)), "'")。您必须先使用tostring函数将格式化的数字转换为字符串,然后使用该concat函数在末尾附加'。
Minh Mai

有道理,这就是我在上面的答案中发布并工作的内容: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设置为我的字段名称,但是没有运气。有没有一种方法可以在现场计算器之外的QGIS中实现python脚本?
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”函数将数字重新格式化为特定于区域的分隔符和小数位。


在Minh Mai的答案中查看我的评论。
clhenrick 2015年

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”函数中。

我使用的表达式是:Millennium_comma(“ [field_name]”,',')


另外,我没有看到您使用的是哪个版本-您应该升级到2.0才能正常运行
Stev_k 2013年

嗨,谢谢你,很抱歉您的回复很晚。我使用的是v2.6 Mac OS X 10.9.5,我到底将python文件放在哪里?我假设在某处/Applications/QGIS.app/Contents/Resources/python/
clhenrick 2014年

请参阅下面的答案,以获取更简单的修复方法。我不知道需要什么版本才能使它工作。
forkandwait 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.