สร้างป้ายกำกับที่จัดรูปแบบเช่น“ 1,000 '” จากฟิลด์ตัวเลขหรือไม่


9

คำถามนี้สร้างจากคำถามก่อนหน้านี้ที่พบใน gis.stackexchange: วิธีแก้ไขข้อมูลแอตทริบิวต์อย่างง่ายดายโดยใช้นิพจน์ปกติ

บางทีใครบางคนสามารถชี้ให้ฉันในทิศทางที่ถูกต้อง?

ฉันมีไฟล์รูปร่างเวกเตอร์ของเส้นชั้นความสูง ในตารางคุณลักษณะฉันได้แปลงเขตข้อมูลที่ชื่อว่า 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 ในพารามิเตอร์ที่ 3 ของฟังก์ชัน

ฉันดูที่http://docs.python.org/2/library/re.htmlเนื่องจากเครื่องคำนวณภาคสนามนั้นมาจากสิ่งที่ฉันเข้าใจตามการใช้ regex ของไพ ธ อน แต่ก็ไม่สามารถเข้าใจได้ บางทีสิ่งที่ฉันพยายามจะทำยังไม่สามารถทำได้ด้วยฟังก์ชั่นนี้ในเครื่องคิดเลขภาคสนามใน QGIS 1.8 บน mac OSX หรือน่าจะเป็นไวยากรณ์ของฉันผิดเพราะฉันเป็นโปรแกรมเมอร์สามเณรและค่อนข้างใหม่ในการแสดงออกปกติ


จำเป็นต้องมีการเข้ารหัสหรือไม่ - ไม่ใช่วิธีง่ายๆในการ (ใน Excel หรือที่คล้ายกัน) สร้างคอลัมน์ใหม่ซึ่งมีป้ายกำกับอยู่ในรูปแบบที่คุณต้องการ - ทั้งหมดที่คุณต้องใช้คือคำสั่งที่เชื่อมโยงกันสองสามข้อ
Andrew Tice

ใช่ว่าจะเป็นวิธีหนึ่งในการแก้ปัญหา แต่ฉันพยายามที่จะแก้ปัญหาจากภายใน QGIS หรือกับงูหลาม
clhenrick

@chrishenrick - คำตอบของฉันแก้ให้คุณได้ไหม?
Stev_k

@Stev_k ยังไม่มีเวลาลองเลยจะทำในไม่ช้าและแจ้งให้คุณทราบ ขอบคุณสำหรับความช่วยเหลือของคุณ!
clhenrick

คำตอบ:


8

การใช้ฟังก์ชันสตริงสองฟังก์ชันในเครื่องคิดเลข QGIS ในเวอร์ชัน 2.6 Mac OS XI นั้นสามารถทำได้ นี่คือขั้นตอน:

  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

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 เป็นชื่อฟิลด์ของฉัน แต่ไม่มีโชค มีวิธีการนำ python scripting ไปใช้ใน QGIS นอกเครื่องคิดเลขหรือไม่?
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

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" ในเครื่องมือป้ายกำกับ

นิพจน์ที่ฉันใช้คือ: 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.