QGIS'de semboloji için alandan RGB'ye eşleme mi kullanıyorsunuz?


10

QGIS sürüm 1.7 kullanma.

Bir koda karşı rgb değerleri kümesi listeleyen düz bir metin dosyası var. Bir çokgen katmanı nitelik alanlarından birini ('map_symb') metin dosyasındaki bir koda eşleyerek bu renk tablosunu kullanmak istiyorum.

renk tablosu çok uzun ve şöyle görünüyor:

$ 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
.... 

'Map_symb' özniteliğimi MAPCODE içindeki bir değerle eşleştirmek ve çokgenleri renklendirmek için karşılık gelen RGB değerlerini kullanmak istiyorum.

Bunu yapmanın gui yolu var mı?


1
Bunun için bir özellik isteği gönderdim
underdark

Çözüm için bu soruya ve yanıtlara bakın: gis.stackexchange.com/questions/15185/…
farklı bir ben

Bu, QGIS 2.0'dan itibaren veri tanımlı semboloji olarak uygulanır: gis.stackexchange.com/questions/60450/…
AndreJ

Yanıtlar:


10

Python'u ElementTree modülüyle kullanabilirsiniz:

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()

Bu komut dosyası tarafından oluşturulan stil dosyası (ve çalışıyor):

  <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>

RGB sütunları olan şekil dosyaları için şekil dosyası modülünü ([şekil dosyası]) 1 de kullanabilirsiniz

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

ve bu yüzden...


14

QGIS'in sonraki sürümlerinde istenen görevi gerçekleştirmek daha kolaydır.

Katman Özellikleri, Stil Sekmesi'ni açın ve Tek Sembol'ün seçili olduğundan emin olun. "Dolgu" renginin yanındaki kutuyu tıklayın ve "Düzenle" yi seçin.

Çokgen tabanlarınızın temel rengini, veri tablosunda bulunan RGB renklerine sabit kenarlık rengiyle düzenleyeceksiniz (gerekirse aynı ölçütleri uygulayabilirsiniz).

"Düzenle" tuşuna bastıktan sonra, aşağıdaki ifadeyi kullanarak tablonuzun 3 RGB sütun adını yazmanız yeterlidir:

color_rgb ( "R-kolon", "G-kolon", "B-sütunu")

Tamam, uygula ve bitti.

Verileri aynı şekilde etiketlemeniz ve karakterize etmeniz gerekiyorsa (örneğin, bir açıklama oluşturmak için), Kategorize seçeneğini kullanın ve aynı ifadeyi aşağıdaki görüntüde tanımlanan Sembol ve Sütun'a uygulayın.

resim açıklamasını buraya girin


5

Bazı vektör verilerini tekrarlanabilir bir şekilde sınıflandırmak istiyorsanız, şunları yapabilirsiniz:

  • Vektörünüzü QGIS'e yükleyin.
  • Ekranın sol tarafındaki "Katmanlar" bölmesinde katmanı sağ tıklayın.
  • Görüntülenen menüde "Özellikler" i tıklayın.
  • Görüntülenen pencerede "Stil" sekmesini tıklayın.
  • Ekranda "Tek Sembol" yazan bir açılır liste öğesi olmalıdır. Üzerine tıklayın ve değerini "Kategorize" olarak değiştirin.
  • Arayüz düzeni değişerek size "Sütun" etiketli yeni bir seçenek sunar. Üzerine tıklayın ve "map_symb" alanını seçin.
  • Geniş boş alanın altındaki "Sınıflandır" düğmesini tıklayın. Boş alan, veri kümenizdeki "map_symb" sütununun içeriğiyle doldurulur.
  • Değiştirmek istediğiniz sembolleri çift tıklayın. Görünen pencerede, "Değiştir" etiketli düğmeyi tıklayın.
  • Bu, verilen özellik değerinin rengini değiştirmenize olanak tanır.
  • Renkleri gerektiği gibi değiştirene kadar bunu yapmaya devam edin.
  • İşiniz bittiğinde, "Stili Kaydet ..." düğmesini tıklayarak stili kaydetmek isteyebilirsiniz. Bu, aynı stili diğer veri kümelerine uygulamanıza izin verir, yalnızca bu pencerede "Stili Yükle ..." seçeneğini tıklatarak. Bu, metin dosyasını AFAIK mümkün olmayan veri kümesine bağlayarak elde etmeye çalıştığınız şey olabilir. Stili kaydettikten sonra, aşağıdaki veri kümelerinde de kullanabilirsiniz (aynı özellik değerlerine sahip oldukları varsayılarak). Tarzın kaydetme dosyasını açarsanız, bunun yalnızca düz metin olduğunu görürsünüz. İsterseniz düzenleyebilirsiniz. Elbette bu dosyayı herhangi bir metin düzenleyicisine kendiniz yazmak mümkündür, ancak GUI aracılığıyla bunu yapmak daha hızlı ve daha kolaydır.
  • Değişikliklerinizi görmek için "Uygula" yı ve Katman Özellikleri penceresini kapatmak için "Tamam" ı tıklayın.

1
OP zaten istenen renklere sahip bir tabloya sahip olduğunda bu çok fazla iş gibi görünüyor. Orijinal tablodan "Stili Kaydet" biçiminin doğrudan ne olduğuna gitmek için yine de var mı?
Andy W

1
Aslında çok kolay. Normalde vektör verilerini herhangi bir CBS'de nasıl sınıflandırırsınız. Boş bir tuvalle başlıyorum ve karışıklığı önlemek için her fare tıklamasını açıklıyorum. Elbette, renk spesifikasyonunuzu en başından Stil biçiminde yazabilirsiniz. Basit ve oldukça insan tarafından okunabilir. Ancak bu çok taşınabilir değildir ve yazım hatası yaparsanız çalışmaz. Sadece GUI ile yapın. Stil dosyasını kaydettikten sonra, bir metin düzenleyicide değiştirebilir ve kendinize bir GUI'de gezinmenin baş ağrısını kaydedebilirsiniz.
R Thiede

1
Andy'nin topları var; yüzlerce MAPCODE var. Ve evet, elle nasıl yapacağımı biliyorum.
farklı bir ben

Ah, anlıyorum. Bu durumda, MAPCODE'larınızın sadece küçük bir bölümünü, üçü gibi sınıflandırmak isteyebilirsiniz. Sonra stili kaydedin. Ardından stil dosyasını açın ve nasıl biçimlendirildiğine bakın. Daha sonra, MAPCODE dosyanızdan satır satır yinelemek için bir komut dosyası (örneğin, Python) yazın ve daha sonra haritanıza uygulayabileceğiniz stil dosyasının biçimine dönüştürün. Bunu yapan mevcut bir komut dosyasının farkında değilim ve maalesef bir projenin ortasındayım, bu yüzden şu anda bunu kendim yapmak için zamanım yok. Ama eğer birisi onu kaldırabilseydi, burada bir cevap olarak yayınlanması güzel olurdu :)
R Thiede
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.