Tạo nhãn được định dạng giống như 1.000 1.000 từ trường số?


9

Câu hỏi này được xây dựng dựa trên câu hỏi trước đây tôi đã gặp tại gis.stackexchange: Làm thế nào để dễ dàng chỉnh sửa dữ liệu thuộc tính bằng Biểu thức chính quy?

Có lẽ ai đó có thể chỉ cho tôi đi đúng hướng?

Tôi có một shapefile vector của các đường viền. Trong bảng thuộc tính, tôi đã chuyển đổi một trường có tên FEET bao gồm dữ liệu số nguyên chứa các giá trị độ cao thành trường chuỗi có tên là Nhãn. Ngoài ra, tôi đã nối thành công 'vào cuối chuỗi để khi dữ liệu được dán nhãn, nó sẽ được đọc dưới dạng feet.

Điều tiếp theo tôi đang cố gắng là chèn một dấu phẩy giữa hai giá trị đầu tiên của chuỗi chỉ khi độ dài chuỗi lớn hơn 4 hoặc do đó dấu phẩy sẽ chỉ xuất hiện giữa hàng ngàn và hàng trăm chữ số trong trường Nhãn. Độ dài phải lớn hơn 4 vì tôi cũng đang đếm '

Mã của tôi cho đến nay là:

case when  length( "Label") >4  then regexp_replace( "Label", '^([0-9])+([0-9]{3}\')$','$1 , $2') else "Label" end

tuy nhiên, hàm regrec_Vplace dường như không chấp nhận các biến nhóm $ 1 $ 2 trong tham số thứ 3 của hàm.

Tôi đã xem http://docs.python.org/2/l Library / re.html vì regex máy tính trường là từ những gì tôi hiểu dựa trên việc sử dụng regex của python nhưng không thể hiểu được điều này. Có lẽ những gì tôi đang cố gắng thực hiện vẫn chưa thể thực hiện được với chức năng này trong máy tính trường trong QGIS 1.8 trên mac OSX. Hoặc nhiều khả năng cú pháp của tôi sai vì tôi là một lập trình viên mới và hơi mới đối với các biểu thức thông thường.


Liệu nó có phải được mã hóa không - một cách đơn giản là (trong Excel, hoặc tương tự) sẽ tạo một cột mới có nhãn trong đó hình thành theo cách bạn muốn - tất cả những gì bạn sẽ phải sử dụng là một vài lệnh ghép.
Andrew Tice

Vâng, đó sẽ là một cách giải quyết vấn đề, tuy nhiên tôi đang cố gắng giải quyết vấn đề từ bên trong QGIS hoặc với python.
clhenrick

@chrishenrick - câu trả lời của tôi đã giải quyết nó cho bạn chưa?
Stev_k

@Stev_k chưa có thời gian để thử nó, sẽ sớm thực hiện và cho bạn biết. Cảm ơn bạn đã giúp đỡ!
clhenrick

Câu trả lời:


8

Sử dụng hai hàm chuỗi trong máy tính QGIS trên phiên bản 2.6 Mac OS XI đã có thể thực hiện điều này. Dưới đây là các bước:

  1. Sử dụng máy tính trường tạo một trường mới là loại chuỗi có độ rộng phù hợp.

  2. Chạy biểu thức sau để đặt giá trị của trường:
    concat( format_number( "Field_name" , 0) , '\'')

Điều này đã tạo ra một cột với một chuỗi được định dạng như tôi muốn, ví dụ như số 2000sẽ được định dạng 2,000'bằng dấu ở 'đó là viết tắt của feet.


6

QGIS đã tạo ra một chức năng được gọi format_numberđể giải quyết vấn đề này. Bạn chỉ cần làm format_number(12345,0)để có được 12,345.


Đó là tin tốt. Mặc dù một phần câu hỏi của tôi liên quan đến việc nối thêm 'vào cuối số để biểu thị "feet". Bạn có thể thực hiện các thao tác sau trong QGIS với chức năng này không? format_number(12345,0) + "'"
clhenrick

Tôi tin rằng câu trả lời sẽ là concat(tostring(format_number(12345,0)), "'"). Trước tiên, bạn phải biến số được định dạng thành một chuỗi bằng cách sử dụng tostringhàm và sau đó sử dụng concathàm để đính kèm 'ở cuối.
Minh Mai

Có ý nghĩa, đây là những gì tôi đã đăng trong câu trả lời của mình ở trên và đã hoạt động:concat( format_number( "Field_name" , 0) , '\'')
clhenrick

3

Bạn có thể thực hiện nhóm chữ số dễ dàng trong Python. Đây là một chức năng mà tôi đã sử dụng, mà tôi nghĩ rằng tôi đã tìm thấy trên 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]

cảm ơn vì lời đề nghị, dmahr. tuy nhiên tôi không rõ về cách triển khai chức năng này trong QGIS. Tôi đã cố gắng cắt và dán chức năng này vào biểu thức máy tính trường và đặt n thành tên trường của tôi nhưng không có may mắn. Có cách nào để thực hiện kịch bản python trong QGIS ngoài máy tính trường không?
clhenrick

3

Đối với những người có ngôn ngữ không phù hợp với màn hình định dạng mong muốn, format_numberkhông phải là một giải pháp thích hợp. Ví dụ: trên hệ thống tiếng Pháp của tôi, format_number(2000)luôn hiển thị 2 000(với khoảng cách là hàng nghìn dấu phân cách) độc lập với cài đặt ngôn ngữ QGIS, mặc dù đôi khi tôi cần màn hình "kiểu Anh" - ví dụ: 2,000.

Trong các trường hợp như vậy, cách tiếp cận sau (và hơi cồng kềnh) hoạt động (ít nhất là trên QGIS 2.18):

if (your_field > 1000,
  concat(
    floor(your_field/1000),
    ',',
    your_field-1000*floor(your_field/1000)
  ),
  your_field
)

Tất nhiên bạn có thể thay thế ','bằng bất cứ thứ gì hàng ngàn dải phân cách bạn muốn. Lưu ý rằng biểu thức này chỉ hoạt động với các số thấp hơn 1.000.000.


2

Trong QGIS, hàm "format_number" trong menu chuỗi trong máy tính trường định dạng lại các số thành dấu phân cách cụ thể và vị trí thập phân.


xem bình luận của tôi trong câu trả lời của Minh Mai.
clhenrick

1

Nó phức tạp hơn một chút so với ở QGis. Theo bài viết này , bạn phải tạo định nghĩa hàm của riêng bạn trong Python, sau đó nhập nó vào QGis (điều này có thể được thực hiện tự động khi khởi động). Điều này có vẻ khó khăn, nhưng bạn chỉ cần làm một lần và nó sẽ luôn ở đó!

Đây là chức năng tôi đã sử dụng, dựa trên dmahr ở trên. Không chắc cách nó xử lý chuỗi, vì tôi đã sửa đổi mã một chút.

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]

Sau đó, bạn lưu nó trong .qgis / python, nhập tệp vào QGis bằng bàn điều khiển, sau đó nó sẽ hiển thị trong các hàm "Python" trong công cụ nhãn.

Biểu thức tôi đã sử dụng là: nghìn_comma ("[field_name]", ',')


Ngoài ra, tôi không thấy phiên bản nào bạn đang sử dụng - bạn nên nâng cấp lên 2.0 để thực hiện công việc này
Stev_k

xin chào, cảm ơn và xin lỗi vì phản hồi muộn Tôi đang dùng v2.6 Mac OS X 10.9.5 Tôi đặt tệp python chính xác ở đâu? Tôi giả sử ở đâu đó trong /Applications/QGIS.app/Contents/Resources/python/?
clhenrick

Xem câu trả lời của tôi dưới đây để sửa chữa đơn giản hơn nhiều. Tôi không biết phiên bản nào là cần thiết để làm cho nó hoạt động.
chờ đợi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.