Sayısal alandan “1.000” şeklinde biçimlendirilmiş etiket mi oluşturuyorsunuz?


9

Bu soru gis.stackexchange adresinde karşılaştığım bir önceki soru üzerine kuruludur: Düzenli İfadeler kullanarak özellik verilerini kolayca nasıl düzenleyebilirim?

Belki biri beni doğru yönde gösterebilir?

Kontur çizgilerinin bir vektör şekil dosyası var. Özellik tablosunda, yükseklik değerleri içeren tamsayı verilerden oluşan FEET adlı bir alanı zaten Label adlı bir dize alanına dönüştürdüm. Ayrıca, veri etiketlendiğinde ayak olarak okunacak şekilde başarıyla dizenin sonuna bir 'ekledi.

Yapmaya çalıştığım bir sonraki şey, yalnızca dize uzunluğu 4'ten büyükse dizenin ilk iki değeri arasına bir virgül eklemektir, ya da virgül yalnızca Etiket alanında binlerce ve yüzlerce basamak arasında görünecektir. Uzunluk 4'ten büyük olmalı çünkü ben de '

Kodum şu ana kadar:

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

ancak regexp_replace işlevi, işlevin 3. parametresinde $ 1 $ 2 grup değişkenlerini kabul etmez.

Http://docs.python.org/2/library/re.html adresine baktım, çünkü alan hesap makinesi regex'i python'un regex kullanımına dayalı olarak anladığım kadarıyla ama bunu anlayamadım. Belki de yapmaya çalıştığım, mac OSX'te QGIS 1.8'deki alan hesap makinesindeki bu işlevle henüz mümkün değil. Ya da acemi bir programcı olduğum ve düzenli ifadelerde biraz yeni olduğum için sözdizim yanlış olabilir.


Kodlanması gerekiyor mu - Excel'de veya benzerlerinde, etiketi nasıl istediğinizi belirten yeni bir sütun oluşturmak için basit bir yol olmaz mı - tek yapmanız gereken birkaç bitiştirme komutudur.
Andrew Tice

Evet, sorunu çözmenin bir yolu olurdu, ancak QGIS içinden veya python ile çözmeye çalışıyorum.
clhenrick

@chrishenrick - Cevabım sizin için çözdü mü?
Stev_k

@Stev_k henüz denemek için zamanım olmadı, yakında yapacak ve size haber verecek. Yardımın için teşekkürler!
clhenrick

Yanıtlar:


8

2.6 sürümünde QGIS hesap makinesinde iki dize işlevi kullanarak Mac OS XI bunu başardı. İşte adımlar:

  1. Alan hesaplayıcısını kullanarak, ilgili genişliğe sahip dize türü olan yeni bir alan oluşturun.

  2. Alanın değerini ayarlamak için aşağıdaki ifadeyi çalıştırın:
    concat( format_number( "Field_name" , 0) , '\'')

Bu, istediğim gibi biçimlendirilmiş bir dize ile bir sütun oluşturdu, örneğin numara 2000, ayak anlamına 2,000'gelen sondaki ile biçimlendirilecekti '.


6

QGIS format_numberbunu ele almak için bir fonksiyon yarattı . Sadece format_number(12345,0)almak için yaparsın 12,345.


Bu iyi haber. Benim sorum bir kısmı '"ayak" temsil etmek için sayının sonuna bir ekleme içerir . Bu işlevle QGIS'de aşağıdakileri yapabilir misiniz? format_number(12345,0) + "'"
clhenrick

Cevabın olacağına inanıyorum concat(tostring(format_number(12345,0)), "'"). Biçimlendirilmiş sayıyı önce tostringişlevi kullanarak bir dizeye dönüştürmeniz ve daha sonra concatişlevi 'sonuna' eklemek için kullanmanız gerekir .
Minh Mai

Mantıklı, yukarıdaki concat( format_number( "Field_name" , 0) , '\'')
cevabımda

3

Rakam gruplamasını Python'da kolayca yapabilirsiniz. İşte StackOverflow üzerinde bulduğumu düşünüyorum, kullandığım bir işlev:

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]

öneri için teşekkürler, dmahr. ancak bu fonksiyonun QGIS'de nasıl uygulanacağı konusunda net değilim. Ben kesme ve alan hesap makinesi ifade ve alan adıma n ayarı ama hiçbir şans olmadan bu işlevi yapıştırma girişiminde bulundu. QGIS'de alan hesap makinesi dışında python komut dosyası oluşturmanın bir yolu var mı?
clhenrick

3

Yerel ayarı istenen biçimlendirme ekranına uymayan insanlar format_numberiçin yeterli bir çözüm değildir. Örneğin, Fransız sistemimde, format_number(2000)her zaman 2 000QGIS dil ayarlarından bağımsız olarak (binlerce ayırıcı olarak boşlukla) görüntüler, ancak bazen "İngilizce tarzı" bir ekrana ihtiyacım olmasına rağmen - ör. 2,000.

Bu gibi durumlarda, aşağıdaki (ve biraz hantal) yaklaşım işe yarar (en azından QGIS 2.18'de):

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

Tabii ki ','istediğiniz binlerce ayırıcıyla değiştirebilirsiniz . Bu ifadenin yalnızca 1.000.000'dan küçük sayılarla çalıştığını unutmayın.


2

QGIS'de, alan hesaplayıcısında dize menüsünün altındaki "format_number" işlevi, sayıları yerel ayara özgü ayırıcılar ve ondalık basamaklara dönüştürür.


Minh Mai'nin cevabındaki yorumuma bakın.
clhenrick

1

QGis'tekinden biraz daha karmaşık. Gereğince bu makalede , daha sonra (bu Başlangıçta otomatik yapılabilir) QGIS içe, Python içinde kendi işlevi tanımı oluşturmak zorunda. Bu zor görünebilir, ancak sadece bir kez yapmanız gerekir ve her zaman orada olacaktır!

Yukarıdaki dmahr'a dayanarak kullandığım işlev budur. Kodu biraz değiştirdiğinden, dizelerle nasıl çalıştığından emin değilim.

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]

Daha sonra .qgis / python içine kaydedin, dosyayı konsolu kullanarak QGis'e aktarın, ardından etiket aracındaki "Python" işlevlerinde görünecektir.

Kullandığım ifade: binlerce_comma ("[alan_adı]", ',')


Ayrıca, hangi sürümü kullandığınızı
görmedim

merhaba, teşekkür ederim ve geç cevap verdiğim için üzgünüm. V2.6 kullanıyorum Mac OS X 10.9.5 Python dosyasını tam olarak nereye yerleştirebilirim? İçinde bir yerde olduğunu /Applications/QGIS.app/Contents/Resources/python/mu sanıyorum ?
clhenrick

Daha basit bir düzeltme için aşağıdaki cevabıma bakın. Yine de çalışmasını sağlamak için hangi sürüme ihtiyaç olduğunu bilmiyorum.
forkandwait
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.