संख्यात्मक क्षेत्र से "1,000 '" की तरह स्वरूपित लेबल बनाना?


9

यह प्रश्न एक पिछले प्रश्न पर बनाता है जो मुझे gis.stackexchange पर आया था: नियमित एक्सप्रेशन का उपयोग करके आसानी से विशेषता डेटा को कैसे संपादित किया जाए?

शायद कोई मुझे सही दिशा में इंगित कर सकता है?

मेरे पास समोच्च लाइनों की एक वेक्टर आकृति है। विशेषता तालिका में मैंने पहले से ही एक फ़ील्ड को कनवर्ट किया है जिसे FEET कहा जाता है जिसमें पूर्णांक मानों से युक्त एक स्ट्रिंग फ़ील्ड में लेबल नामक डेटा होता है। इसके अतिरिक्त मैंने स्ट्रिंग के अंत में 'a' जोड़ दिया ताकि डेटा लेबल होने पर इसे पैरों के रूप में पढ़ा जा सके।

अगली बात जो मैं करने का प्रयास कर रहा हूं वह यह है कि स्ट्रिंग के पहले दो मानों के बीच केवल कॉमा डालना है यदि स्ट्रिंग की लंबाई 4 से अधिक है, या इसलिए कि अल्पविराम केवल लेबल फ़ील्ड में हजारों और सैकड़ों अंकों के बीच दिखाई देगा। लंबाई 4 से अधिक होनी चाहिए क्योंकि मैं भी गिनती कर रहा हूं '

मेरा अब तक का कोड है:

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

हालाँकि, regexp_replace फ़ंक्शन फ़ंक्शन के 3 पैरामीटर में समूह चर $ 1 $ 2 को स्वीकार नहीं करता है।

मैंने http://docs.python.org/2/library/re.html को देखा है क्योंकि फ़ील्ड-कैलकुलेटर रेगेक्स है जो मैं समझता हूं कि मैं अजगर के रेगेक्स के उपयोग के आधार पर समझता हूं लेकिन यह पता लगाने में सक्षम नहीं है। हो सकता है कि मैं जो करने का प्रयास कर रहा हूं वह अभी तक मैक ओएसएक्स पर क्यूजीआईएस 1.8 में फ़ील्ड कैलकुलेटर में इस फ़ंक्शन के साथ संभव नहीं है। या अधिक संभावना है कि मेरा वाक्यविन्यास गलत है क्योंकि मैं नौसिखिया प्रोग्रामर हूं और कुछ हद तक नियमित अभिव्यक्ति के लिए नया हूं।


क्या इसे कोडित किया जाना है - (एक्सेल में, या इसी तरह का) एक सरल तरीका नहीं होगा, एक नया कॉलम बनाएं, जिसमें यह लेबल लगा हो कि आप इसे कैसे चाहते हैं - आपको इसका उपयोग करना होगा कुछ संक्षिप्त आदेश है।
एंड्रयू टाइस

हां यह समस्या को हल करने का एक तरीका होगा, हालांकि मैं इसे क्यूजीआईएस के भीतर से या अजगर के साथ हल करने की कोशिश कर रहा हूं।
क्लेनिक्रिक

@chrishenrick - क्या मेरे जवाब ने इसे आपके लिए हल कर दिया है?
Stev_k

@Stev_k के पास अभी तक इसे आज़माने का समय नहीं है, जल्द ही ऐसा करेंगे और आपको बताएंगे। आपकी सहायताके लिए धन्यवाद!
क्लेनिक्रिक

जवाबों:


8

संस्करण 2.6 मैक ओएस एक्सआई पर क्यूजीआईएस कैलकुलेटर में दो स्ट्रिंग फ़ंक्शन का उपयोग करके यह पूरा करने में सक्षम था। यहाँ कदम हैं:

  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) + "'"
क्लेरिक जूल

मुझे विश्वास है कि उत्तर होगा concat(tostring(format_number(12345,0)), "'")। आपको tostringफ़ंक्शन का उपयोग करके पहले स्वरूपित संख्या को एक स्ट्रिंग में बदलना होगा और फिर concatफ़ंक्शन को अंत में 'संलग्न करने के लिए उपयोग करना होगा।
मिन्ह माई

समझ में आता है, यह वही है जो मैंने अपने उत्तर में पोस्ट किया था और काम किया:concat( format_number( "Field_name" , 0) , '\'')
क्लेरिक जूल

3

आप पायथन में आसानी से अंकों का समूहन कर सकते हैं। यहाँ एक फ़ंक्शन है जिसका मैंने उपयोग किया है, जो मुझे लगता है कि मुझे 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 को मेरे फ़ील्ड नाम पर सेट किया लेकिन कोई भाग्य नहीं। वहाँ क्षेत्र कैलकुलेटर के बाहर QGIS में अजगर स्क्रिप्टिंग को लागू करने का एक तरीका है?
क्लेरिक्रिक

3

उन लोगों के लिए जिनका स्थानीय वांछित प्रारूपण प्रदर्शन के लायक नहीं है, format_numberएक पर्याप्त समाधान नहीं है। उदाहरण के लिए, मेरी फ्रांसीसी प्रणाली पर, format_number(2000)हमेशा 2 000QGIS भाषा सेटिंग्स से स्वतंत्र रूप से (हजारों विभाजक के रूप में एक स्थान के साथ) प्रदर्शित होता है , हालांकि मुझे कभी-कभी "अंग्रेजी-शैली" प्रदर्शन की आवश्यकता होती है - उदा। 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" फ़ंक्शन विशिष्ट विभाजक और दशमलव स्थानों को स्थान देता है।


मेरी माई के जवाब में मेरी टिप्पणी देखें।
क्लेरिक जूल 30'15

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 में आयात करते हैं, फिर यह लेबल टूल में "पायथन" फ़ंक्शन में दिखाई देगा।

मैंने जो अभिव्यक्ति की है वह है: हजारों_कोमा ("[field_name]", ',')


इसके अलावा, मैंने यह नहीं देखा कि आप किस संस्करण का उपयोग कर रहे हैं - आपको यह काम करने के लिए 2.0 में अपग्रेड करना चाहिए
Stev_k

नमस्ते, धन्यवाद और देर से प्रतिक्रिया के लिए खेद है। मैं v2.6 मैक ओएस एक्स 10.9.5 पर हूं। वास्तव में मैं अजगर फाइल कहां रखूं? में कहीं मान लेता हूँ /Applications/QGIS.app/Contents/Resources/python/?
क्लेरिक्रिक

बहुत आसान तय करने के लिए नीचे मेरा जवाब देखें। मुझे नहीं पता कि इसे बनाने के लिए किस संस्करण की आवश्यकता है, हालांकि।
forkandwait
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.