Membuat label yang diformat seperti "1.000 '" dari bidang angka?

9

Pertanyaan ini dibangun berdasarkan pertanyaan sebelumnya yang saya temui di gis.stackexchange: Bagaimana cara mengedit data atribut dengan menggunakan Regular Expressions?

Mungkin seseorang bisa mengarahkan saya ke arah yang benar?

Saya memiliki shapefile vektor garis kontur. Dalam tabel atribut saya sudah mengonversi bidang yang disebut KAKI yang terdiri dari data integer yang berisi nilai ketinggian ke bidang string yang disebut Label. Selain itu saya berhasil menambahkan 'ke akhir string sehingga ketika data diberi label akan dibaca sebagai kaki.

Hal berikutnya yang saya coba lakukan adalah memasukkan koma antara dua nilai pertama string hanya jika panjang string lebih besar dari 4, atau sehingga koma hanya akan muncul di antara ribuan dan ratusan digit di bidang Label. Panjangnya harus lebih besar dari 4 karena saya juga menghitung '

Kode saya sejauh ini adalah:

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

namun fungsi regexp_replace tampaknya tidak menerima variabel grup $ 1 $ 2 pada parameter ke-3 fungsi.

Saya telah melihat http://docs.python.org/2/library/re.html karena regex bidang-kalkulator berasal dari apa yang saya pahami berdasarkan penggunaan regex python tetapi belum bisa mengetahuinya. Mungkin yang saya coba lakukan belum memungkinkan dengan fungsi ini di bidang kalkulator di QGIS 1.8 di mac OSX. Atau lebih tepatnya sintaksis saya salah karena saya seorang programmer pemula dan agak baru untuk ekspresi reguler.

clhenrick
sumber
Apakah harus dikodekan - bukankah cara sederhana adalah (dalam Excel, atau serupa) membuat kolom baru yang memiliki label di dalamnya yang diformulasikan sesuai keinginan Anda - yang harus Anda gunakan hanyalah beberapa perintah gabungan.
Andrew Tice
Ya itu akan menjadi salah satu cara menyelesaikan masalah, namun saya mencoba menyelesaikannya dari dalam QGIS atau dengan python.
clhenrick
@ chrishenrick - apakah jawaban saya menyelesaikannya untuk Anda?
Stev_k
@Stev_k belum sempat mencobanya, akan segera melakukannya dan beri tahu Anda. Terima kasih atas bantuan Anda!
clhenrick

Jawaban:

8

Menggunakan dua fungsi string dalam kalkulator QGIS pada versi 2.6 Mac OS XI dapat mencapai ini. Berikut langkah-langkahnya:

  1. Menggunakan bidang kalkulator membuat bidang baru yang merupakan tipe string dengan lebar yang relevan.

  2. Jalankan ekspresi berikut untuk mengatur nilai bidang:
    concat( format_number( "Field_name" , 0) , '\'')

Ini menciptakan kolom dengan string yang diformat seperti yang saya inginkan jadi misalnya nomor 2000akan diformat 2,000'dengan trailing 'yang berarti kaki.

clhenrick
sumber
6

QGIS telah membuat fungsi yang dipanggil format_numberuntuk mengatasi hal ini. Anda cukup lakukan format_number(12345,0)untuk mendapatkan 12,345.

Minh Mai
sumber
Itu kabar baik. Meskipun bagian dari pertanyaan saya melibatkan menambahkan 'ke akhir nomor untuk mewakili "kaki". Apakah Anda dapat melakukan hal berikut dalam QGIS dengan fungsi ini? format_number(12345,0) + "'"
clhenrick
Saya yakin jawabannya adalah concat(tostring(format_number(12345,0)), "'"). Anda harus terlebih dahulu mengubah angka yang diformat menjadi string menggunakan tostringfungsi dan kemudian menggunakan concatfungsi untuk melampirkan 'di akhir.
Minh Mai
Masuk akal, inilah yang saya posting dalam jawaban saya di atas dan bekerja:concat( format_number( "Field_name" , 0) , '\'')
clhenrick
3

Anda dapat melakukan pengelompokan digit dengan mudah di Python. Inilah fungsi yang saya gunakan, yang saya pikir saya temukan di 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
sumber
terima kasih atas sarannya, dmahr. namun saya tidak jelas tentang bagaimana mengimplementasikan fungsi ini di QGIS. Saya mencoba memotong dan menempelkan fungsi ini ke dalam ekspresi kalkulator bidang dan mengatur n pada nama bidang saya tetapi tidak berhasil. Apakah ada cara untuk mengimplementasikan skrip python di QGIS di luar kalkulator lapangan?
clhenrick
3

Untuk orang-orang yang lokalnya tidak sesuai dengan tampilan format yang diinginkan, format_numberbukan solusi yang memadai. Sebagai contoh, pada sistem Perancis saya, format_number(2000)selalu menampilkan 2 000(dengan spasi sebagai pemisah ribuan) secara terpisah dari pengaturan bahasa QGIS, meskipun saya kadang-kadang membutuhkan tampilan "gaya Inggris" - mis. 2,000.

Dalam kasus seperti itu, pendekatan berikut (dan agak rumit) bekerja (setidaknya pada QGIS 2.18):

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

Tentu saja Anda dapat mengganti ','dengan pemisah ribuan apa pun yang Anda inginkan. Perhatikan bahwa ungkapan ini hanya berfungsi dengan angka di bawah 1.000.000.

ArMoraer
sumber
2

Dalam QGIS, fungsi "format_number" di bawah menu string dalam kalkulator bidang memformat ulang angka untuk mencari pemisah spesifik dan tempat desimal.

forkandunggu
sumber
lihat komentar saya dalam jawaban Minh Mai.
clhenrick
1

Ini sedikit lebih rumit dari itu di QGis. Sesuai artikel ini , Anda harus membuat definisi fungsi Anda sendiri dengan Python, lalu mengimpornya ke QGis (ini dapat dilakukan secara otomatis saat startup). Ini mungkin terlihat rumit, tetapi Anda hanya perlu melakukannya sekali dan itu akan selalu ada!

Ini adalah fungsi yang saya gunakan, berdasarkan dmahr di atas. Tidak yakin bagaimana ini berkaitan dengan string, karena saya sedikit mengubah kode.

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]

Anda kemudian menyimpannya di .qgis / python, mengimpor file ke QGis menggunakan konsol, maka itu akan muncul dalam fungsi "Python" di alat label.

Ekspresi yang saya gunakan adalah: ribuan_comma ("[field_name]", ',')

Stev_k
sumber
Juga, saya tidak melihat versi apa yang Anda gunakan - Anda harus meningkatkan ke 2.0 untuk membuat pekerjaan ini
Stev_k
hai, terima kasih dan maaf atas tanggapan yang terlambat. Saya menggunakan v2.6 Mac OS X 10.9.5 Di mana tepatnya saya menempatkan file python? Saya berasumsi di suatu tempat di /Applications/QGIS.app/Contents/Resources/python/?
clhenrick
Lihat jawaban saya di bawah ini untuk perbaikan yang lebih sederhana. Saya tidak tahu versi apa yang diperlukan untuk membuatnya bekerja.
forkandunggu