数値フィールドから「1,000」のような形式のラベルを作成しますか?


9

この質問は、gis.stackexchange: 正規表現を使用して属性データを簡単に編集するにはどうすればよいですか?

おそらく誰かが私を正しい方向に向けることができますか?

輪郭線のベクトルシェープファイルがあります。属性テーブルでは、標高値を含む整数データで構成されるFEETというフィールドを、Labelという文字列フィールドに既に変換しています。さらに、データにラベルが付けられたときにフィートとして読み取られるように、文字列の最後に 'を追加しました。

次に行うことは、文字列の長さが4より大きい場合にのみ、文字列の最初の2つの値の間にコンマを挿入することです。つまり、コンマが[ラベル]フィールドの数千から数百桁の間にのみ表示されるようにします。長さは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の正規表現の使用に基づいて理解したものですが、これを理解することができなかったためです。Mac OSX上のQGIS 1.8のフィールド計算機でこの関数を使用して、私がやろうとしていることはまだできないかもしれません。あるいは、私は初心者のプログラマーであり、正規表現はやや新しいため、構文が間違っている可能性があります。


それをコード化する必要はありますか-(Excelなどで)ラベルがその中に希望どおりにフォーマットされた新しい列を作成する簡単な方法ではありません-使用する必要があるのは、いくつかの連結コマンドだけです。
Andrew Tice 2013

はい、それは問題を解決する1つの方法になるでしょうが、私はQGIS内から、またはpythonを使用して解決しようとしています。
clhenrick 2013

@chrishenrick-私の答えはあなたのためにそれを解決しましたか?
Stev_k 2013年

@Stev_kにはまだ試す時間がないので、すぐにやってみてお知らせします。ご協力いただきありがとうございます!
clhenrick 2013年

回答:


8

バージョン2.6 Mac OS XIのQGIS計算機で2つの文字列関数を使用すると、これを実現できました。手順は次のとおりです。

  1. フィールド計算機を使用して、適切な幅の文字列型である新しいフィールドを作成します。

  2. 次の式を実行して、フィールドの値を設定します。
    concat( format_number( "Field_name" , 0) , '\'')

これにより、希望どおりに書式設定された文字列で列が作成されたので、たとえば、数値2000はフィートを表す2,000'トレーリング'で書式設定されます。


6

QGISはformat_numberこれに対処するために呼び出される関数を作成しました。あなたは単にformat_number(12345,0)取得するために行います12,345


それは朗報です。私の質問の一部は、'「足」を表すために番号の最後にa を追加することを含みます この機能を使用して、QGISで次のことを実行できますか?format_number(12345,0) + "'"
clhenrick 2015

答えはだと思います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をフィールド名に設定しようとしましたが、うまくいきませんでした。フィールド電卓の外でQGISにPythonスクリプトを実装する方法はありますか?
clhenrick 2013年

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 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」関数に表示されます。

私が使用した式は次のとおりです。


また、私はあなたが使用していたバージョンを確認しませんでした-あなたはこの仕事をするために2.0にアップグレードする必要があります
Stev_k

こんにちは、ご返信ありがとうございます。私はv2.6 Mac OS X 10.9.5を使用しています。Pythonファイルを正確にどこに配置しますか?私はどこかにいると/Applications/QGIS.app/Contents/Resources/python/思いますか?
clhenrick 2014

より簡単な修正については、以下の私の回答を参照してください。ただし、それを機能させるために必要なバージョンはわかりません。
forkandwait 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.