QGIS में सहजीवन के लिए फ़ील्ड-टू-RGB मानचित्रण का उपयोग करना?


10

QGIS संस्करण 1.7 का उपयोग करना।

मेरे पास एक सादा पाठ फ़ाइल है जो एक कोड के खिलाफ आरजीबी मूल्यों के एक सेट को सूचीबद्ध करता है। मैं इस रंग तालिका का उपयोग बहुभुज परत को रंग देने के लिए करना चाहता हूं ताकि इसकी एक विशेषता फ़ील्ड ('map_symb') को टेक्स्ट फ़ाइल में एक कोड मैप कर सके।

रंग तालिका बहुत लंबी है, और इस तरह दिखता है:

$ head gsv1Msymbology.txt
MAPCODE RED GREEN   BLUE
Oc  143 255 255
WAT 255 255 255
Qa  244 250 202
Qdl 195 239 218
Na  248 255 238
Qd2 227 255 190
Qxw 248 255 238
Qns 255 148 83
Qn  255 202 190
.... 

मैं MAPCODE में एक मूल्य के लिए अपने 'map_symb' विशेषता से मेल खाना चाहता हूं, और बहुभुज को रंगने के लिए संबंधित RGB मान का उपयोग करता हूं।

क्या ऐसा करने के लिए कोई गुई रास्ता है?


1
: मैं इस के लिए एक सुविधा का अनुरोध दायर किया है hub.qgis.org/issues/4339
UnderDark

समाधान के लिए इस प्रश्न और प्रतिक्रियाओं को देखें: gis.stackexchange.com/questions/15185/…
एक अलग बेन

इसे QGIS 2.0 से डेटा परिभाषित सिम्बोलॉजी के
AndreJ

जवाबों:


10

आप ElementTree मॉड्यूल के साथ पायथन का उपयोग कर सकते हैं:

from string import *
from xml.etree import cElementTree as ET

class symbol:
    def __init__(self,b=[]):
            self.typec= typec
            self.b = b
            self.key = ['MAPCODE','R','G','B']
            self.data = dict(zip(self.key,self.b))
            self.symb = ET.SubElement(typec,"symbol")
            self.lower = ET.SubElement(self.symb, "lowervalue")
            self.upper = ET.SubElement(self.symb, "uppervalue")
            self.outline = ET.SubElement(self.symb,"outlinecolor")
            self.outsty = ET.SubElement(self.symb, "outlinestyle")
            self.outtail = ET.SubElement(self.symb, "outlinewidth")
            self.fillc = ET.SubElement(self.symb,"fillcolor")
            self.fillp = ET.SubElement(self.symb,"fillpattern")

    def creation(self):
            self.lower.text = self.data['MAPCODE']
            self.upper.text = self.data['MAPCODE']
            self.outsty.text="SolidLine"
            self.outtail.text="0.26"
            self.outline.set("red",str(self.data['R']))
            self.outline.set("green",str(self.data['G']))
            self.outline.set("blue",str(self.data['B']))
            self.fillc.set("red",str(self.data['R']))
            self.fillc.set("green",str(self.data['G']))
            self.fillc.set("blue",str(self.data['B']))
            self.fillp.text = "SolidPattern"

# QML file creation
intro = ET.Element("qgis")
transp = ET.SubElement(intro,"transparencyLevelInt")
transp.text = '255'
classatr = ET.SubElement(intro, "classificationattribute")
classatr.text= "MAPCODE"
typec = ET.SubElement(intro,"uniquevalue")
classif = ET.SubElement(typec,"classificationfield")
classif.text="MAPCODE"

# RGB file processing              
def main():
    file = "RGB.txt"
    f= open(file,"r")
    while 1 :
        line = f.readline()
        if not line :
            break
        elem = split(line,',') #or tab, or space, or
        symboltag = symbol(elem)
        symboltag.creation()
     result = ET.ElementTree(intro)
     result.write("RGB.qml")

if __name__ == '__main__':
    main()

इस स्क्रिप्ट द्वारा बनाई गई शैली फ़ाइल है (और यह काम करता है):

  <qgis>
  <transparencyLevelInt>255</transparencyLevelInt>
   <classificationattribute>MAPCODE</classificationattribute>
   <uniquevalue>
      <classificationfield>MAPCODE</classificationfield>
         <symbol>
             <lowervalue>Oc</lowervalue>
             <uppervalue>Oc</uppervalue>
             <outlinecolor blue="143" green="255" red="255" />
             <outlinestyle>SolidLine</outlinestyle>
             <outlinewidth>0.26</outlinewidth>
             <fillcolor blue="143" green="255" red="255"/>
             <fillpattern>SolidPattern</fillpattern>
          </symbol>
          <symbol>
             <lowervalue>WAT</lowervalue>
             <uppervalue>WAT</uppervalue>
             <outlinecolor blue="255" green="255" red="255" />
             <outlinestyle>SolidLine</outlinestyle>
             <outlinewidth>0.26</outlinewidth>
             <fillcolor blue="255" green="255" red="255" /> 
             <fillpattern>SolidPattern</fillpattern>
          </symbol>
              and so...
   </uniquevalue>
</qgis>

आरजीबी कॉलम के साथ शेपफाइल्स के लिए आप शेपफाइल मॉड्यूल ([आकार आकृति]) 1 का भी उपयोग कर सकते हैं

import shapefile ....
[....]
noduplicates = []

def main():
sf = shapefile.Reader("RGBshape")
for rec in enumerate(sf.records()):
    if rec[1][0] not in noduplicates:
        noduplicates.append(rec[1][0])
        symboltag = symbol(rec[1])
        symboltag.creation()      
    else:
        continue

इसलिए...


14

QGIS के बाद के संस्करण में अनुरोधित कार्य करना आसान है।

बस लेयर प्रॉपर्टीज, स्टाइल टैब खोलें, और सुनिश्चित करें कि सिंगल सिंबल चुना गया है। "भरें" रंग के बगल में स्थित बॉक्स पर क्लिक करें और "संपादित करें" चुनें।

आप डेटा टेबल पर मौजूद RGB रंगों पर अपने बहुभुज आधारों के आधार रंग का संपादन कर रहे होंगे, एक निरंतर सीमा रंग के साथ (यदि आवश्यक हो तो आप समान मानदंड लागू कर सकते हैं)।

"एडिट" को हिट करने के बाद, निम्नलिखित अभिव्यक्ति का उपयोग करके अपनी तालिका के 3 RGB कॉलम नाम रखें:

color_rgb ( "आर-स्तंभ", "जी-स्तंभ ',' बी-स्तंभ")

ठीक है, लागू करें और अपना किया।

यदि आपको डेटा को एक ही तरीके से लेबल करने और चिह्नित करने की आवश्यकता है (उदाहरण के लिए, एक किंवदंती बनाने के लिए), तो बस वर्गीकृत विकल्प का उपयोग करें और प्रतीक के समान और स्तंभ पर लागू करें, छवि बॉलो में पहचाना गया।

यहां छवि विवरण दर्ज करें


5

यदि आप कुछ वेक्टर डेटा को एक रिपीटेबल तरीके से वर्गीकृत करना चाहते हैं तो यहाँ है कि आप क्या कर सकते हैं:

  • अपने वेक्टर को QGIS में लोड करें।
  • स्क्रीन के बाईं ओर "परत" फलक में परत पर राइट-क्लिक करें।
  • दिखाई देने वाले मेनू में "गुण" पर क्लिक करें।
  • दिखाई देने वाली विंडो में "स्टाइल" टैब पर क्लिक करें।
  • स्क्रीन पर एक ड्रॉप-डाउन सूची आइटम होना चाहिए जो "सिंगल सिंबल" कहता है। उस पर क्लिक करें, और इसके मान को "वर्गीकृत" में बदलें।
  • इंटरफ़ेस लेआउट बदल जाएगा, जिससे आपको "कॉलम" नामक एक नया विकल्प मिलेगा। उस पर क्लिक करें और "map_symb" फ़ील्ड चुनें।
  • बड़े खाली क्षेत्र के नीचे "वर्गीकृत" बटन पर क्लिक करें। खाली क्षेत्र आपके डेटासेट में "map_symb" कॉलम की सामग्री से आबाद होगा।
  • उन प्रतीकों पर डबल-क्लिक करें जिन्हें आप बदलना चाहते हैं। दिखाई देने वाली विंडो में, "बदलें" लेबल वाले बटन पर क्लिक करें।
  • यह आपको दिए गए विशेषता मान के लिए रंग बदलने की अनुमति देता है।
  • ऐसा तब तक करते रहें जब तक कि आपने आवश्यकतानुसार रंग नहीं बदल लिया हो।
  • जब आप पूरी हो जाएं, तो आप "सेव स्टाइल ..." बटन पर क्लिक करके स्टाइल को सहेजना चाह सकते हैं। यह आपको किसी भी अन्य डेटासेट में उसी शैली को लागू करने की अनुमति देगा, केवल "लोड स्टाइल ..." पर क्लिक करके जब यह उसी विंडो में हो। यह वही हो सकता है जिसे आप टेक्स्ट फ़ाइल को डेटासेट के साथ जोड़कर हासिल करना चाह रहे थे, जो AFAIK संभव नहीं है। एक बार जब आप शैली को बचा लेते हैं, हालांकि, आप इसे किसी भी निम्नलिखित डेटासेट पर उपयोग करने में सक्षम होंगे (यह मानते हुए कि उनके पास समान गुण मान हैं)। यदि आप शैली की सेव फ़ाइल खोलते हैं, तो आप देखेंगे कि यह केवल सादा पाठ है, जिसे आप चाहें तो संपादित कर सकते हैं। इस फ़ाइल को किसी भी टेक्स्ट एडिटर में लिखना संभव है, लेकिन यह GUI के माध्यम से करना अधिक तेज़ और आसान है।
  • अपने गुणों को देखने के लिए "लागू करें" पर क्लिक करें और परत गुण विंडो को बंद करने के लिए "ठीक है"।

1
जब ओपी के पास पहले से ही वांछित रंगों की एक मेज है, तो यह बहुत ही भयानक काम लगता है। वैसे भी मूल तालिका से जाने के लिए "सेव स्टाइल" प्रारूप क्या है?
एंडी डब्ल्यू।

1
वास्तव में यह आसान है। यह है कि आप सामान्य रूप से किसी जीआईएस में वेक्टर डेटा को कैसे वर्गीकृत करते हैं। मैं एक रिक्त कैनवास के साथ शुरू कर रहा हूं और प्रत्येक माउस क्लिक का वर्णन कर रहा हूं, बस भ्रम को रोकने के लिए। आप निश्चित रूप से, गेट-गो से स्टाइल प्रारूप में अपना रंग विनिर्देश लिख सकते हैं। यह सरल और काफी मानवीय पठनीय है। लेकिन यह बहुत पोर्टेबल नहीं है, और यदि आप टाइपो बनाते हैं तो यह काम नहीं करेगा। बस जीयूआई के साथ करते हैं। स्टाइल फ़ाइल सहेज लेने के बाद, आप इसे एक टेक्स्ट एडिटर में संशोधित कर सकते हैं और अपने आप को एक GUI नेविगेट करने के सिरदर्द से बचा सकते हैं।
आर थिएडे

1
एंडी के पास गेंदों से है; सैकड़ों MAPCODEs हैं। और हां, मुझे पता है कि इसे मैन्युअल रूप से कैसे करना है।
एक अलग बेन

ओह समझा। ठीक है, उस स्थिति में, आप अपने MAPCODE के केवल एक छोटे से हिस्से को वर्गीकृत करना चाह सकते हैं, उनमें से तीन की तरह। फिर स्टाइल को सेव करें। फिर स्टाइल फ़ाइल खोलें और यह देखें कि यह कैसे स्वरूपित है। फिर बस अपनी MAPCODE फाइल लाइन को लाइन में लगाने के लिए एक स्क्रिप्ट (, कहते हैं, पायथन) लिखें और इसे स्टाइल फाइल के फॉर्मेट में कन्वर्ट करें, जिसे आप अपने मैप पर लागू कर सकते हैं। मुझे ऐसी मौजूदा स्क्रिप्ट के बारे में पता नहीं है जो ऐसा करती है और दुर्भाग्य से मैं किसी प्रोजेक्ट के बीच में हूं, इसलिए इसे अभी खुद करने का समय नहीं है। लेकिन अगर कोई इसे खींच सकता है, तो यह अच्छा होगा कि इसे यहां एक उत्तर के रूप में पोस्ट किया जाए :)
R Thiede
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.