숫자 필드에서 "1,000 '"과 같은 형식의 레이블을 작성 하시겠습니까?


9

이 질문은 gis.stackexchange : 정규 표현식을 사용하여 속성 데이터를 쉽게 편집하는 방법 에서 접했던 이전 질문을 바탕으로합니다 .

누군가가 올바른 방향으로 나를 가리킬 수 있습니까?

등고선의 벡터 shapefile이 있습니다. 속성 테이블에서 고도 값을 포함하는 정수 데이터로 구성된 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 을 보았지만 이것을 알아낼 수 없었습니다. 어쩌면 내가 시도하는 것은 Mac OSX의 QGIS 1.8의 필드 계산기 에서이 기능으로 아직 가능하지 않을 수 있습니다. 또는 초보자 프로그래머이므로 정규 표현식에 익숙하지 않기 때문에 구문이 잘못되었을 가능성이 큽니다.


코드를 작성해야합니까-Excel에서 또는 이와 유사한 방식으로 원하는 방식으로 레이블이있는 새 열을 만드는 간단한 방법은 아닙니다. 사용해야 할 것은 몇 가지 명령입니다.
Andrew Tice

예, 문제를 해결하는 한 가지 방법이지만 QGIS 내에서 또는 파이썬으로 문제를 해결하려고합니다.
clhenrick

@ chrishenrick-내 대답이 당신을 위해 그것을 해결 했습니까?
Stev_k

@Stev_k은 (는) 아직 시도 할 시간이 없었습니다. 조만간 알려 드리겠습니다. 당신의 도움을 주셔서 감사합니다!
clhenrick

답변:


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있습니다.


좋은 소식입니다. 내 질문의 일부 '는 "발"을 나타내는 숫자 끝에 a 를 추가하는 것과 관련이 있습니다. 이 기능으로 QGIS에서 다음을 수행 할 수 있습니까? format_number(12345,0) + "'"
clhenrick

나는 대답이 될 것이라고 믿는다 concat(tostring(format_number(12345,0)), "'"). 먼저 tostring함수를 사용 하여 형식이 지정된 숫자를 문자열로 바꾸고 함수를 사용 concat하여 끝에 '를 첨부해야합니다.
Minh Mai

이해가 concat( format_number( "Field_name" , 0) , '\'')
되겠습니다

3

파이썬에서 숫자 그룹화를 쉽게 할 수 있습니다. 내가 사용한 함수는 다음과 같습니다.

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에서 파이썬 스크립팅을 구현하는 방법이 있습니까?
clhenrick

3

로케일이 원하는 형식 표시에 맞지 않는 사람들 format_number에게는 적절한 해결책이 아닙니다. 예를 들어, 프랑스어 시스템에서는 "영어 스타일"디스플레이가 필요할 때도 있지만 QGIS 언어 설정과 독립적으로 format_number(2000)항상 2 000공백 (천 단위 구분 기호)을 표시합니다 (예 : 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

1

QGis보다 약간 더 복잡합니다. 에 따라 이 문서 , 당신은 그 (이 시작할 때 자동으로 수행 할 수 있습니다) 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"기능에 표시됩니다.

내가 사용한 표현은 다음과 같습니다. thousand_comma ( "[field_name]", ',')


또한 어떤 버전을 사용하고 있는지 보지 못했습니다.이 작업을 수행하려면 2.0으로 업그레이드해야합니다.
Stev_k

안녕하세요, 늦은 답변에 감사드립니다. v2.6 Mac OS X 10.9.5를 사용하고 있습니다. 파이썬 파일을 정확히 어디에 배치합니까? 나는 어딘가에 있다고 가정 /Applications/QGIS.app/Contents/Resources/python/합니까?
clhenrick

훨씬 간단한 수정 방법은 아래 답변을 참조하십시오. 그래도 작동하려면 어떤 버전이 필요한지 모르겠습니다.
forkandwait
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.