숫자 필드에서 "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.