Używasz mapowania pola do RGB w symbolice w QGIS?

10

Korzystanie z QGIS w wersji 1.7.

Mam zwykły plik tekstowy, który zawiera zestaw wartości rgb względem kodu. Chcę użyć tej tabeli kolorów do pokolorowania warstwy wielokąta poprzez odwzorowanie jednego z jej pól atrybutów („map_symb”) na kod w pliku tekstowym.

tabela kolorów jest bardzo długa i wygląda następująco:

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

Chcę dopasować mój atrybut „map_symb” do wartości w MAPCODE i użyć odpowiednich wartości RGB do pokolorowania wielokątów.

Czy jest na to sposób GUI?

inny ben
źródło
1
Złożyłem
podmrok
Zobacz to pytanie i odpowiedzi na rozwiązania: gis.stackexchange.com/questions/15185/...
inny ben
Jest to realizowane od QGIS 2.0 jako symbolika danych: gis.stackexchange.com/questions/60450/…
AndreJ

Odpowiedzi:

10

Możesz używać Pythona z modułem 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()

Plik stylu wygenerowany przez ten skrypt to (i działa):

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

Możesz także użyć modułu shapefile ([shapefile]) 1 dla plików shapefile z kolumnami RGB

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

a więc...

gen
źródło
14

W późniejszej wersji QGIS łatwiej jest wykonać żądane zadanie.

Wystarczy otworzyć Właściwości warstwy, kartę Styl i upewnić się, że wybrany jest Pojedynczy symbol. Kliknij pole obok koloru „Wypełnienie” i wybierz „Edytuj.

Będziesz edytować kolor podstawowy baz wielokątów na podstawie kolorów RGB obecnych w tabeli danych, ze stałym kolorem obramowania (w razie potrzeby możesz zastosować te same kryteria).

Po wciśnięciu „Edytuj” wystarczy umieścić 3 nazwy kolumn RGB tabeli, używając następującego wyrażenia:

color_rgb („kolumna R”, „kolumna G”, „kolumna B”)

Ok, aplikuj i gotowe.

Jeśli chcesz oznaczyć i scharakteryzować dane w ten sam sposób (na przykład, aby zbudować legendę), po prostu skorzystaj z opcji Skategoryzowane i zastosuj to samo wyrażenie do Symbolu i do Kolumny, przedstawionych poniżej.

wprowadź opis zdjęcia tutaj

zemigl
źródło
5

Jeśli chcesz sklasyfikować niektóre dane wektorowe w powtarzalny sposób, oto co możesz zrobić:

  • Załaduj swój wektor do QGIS.
  • Kliknij warstwę prawym przyciskiem myszy w panelu „Warstwy” po lewej stronie ekranu.
  • Kliknij „Właściwości” w wyświetlonym menu.
  • Kliknij kartę „Styl” w wyświetlonym oknie.
  • Na ekranie powinna znajdować się rozwijana pozycja z napisem „Pojedynczy symbol”. Kliknij i zmień jego wartość na „Skategoryzowane”.
  • Układ interfejsu zmieni się, dając nową opcję o nazwie „Kolumna”. Kliknij i wybierz pole „map_symb”.
  • Kliknij przycisk „Klasyfikuj” pod dużym pustym polem. Puste pole zostanie wypełnione zawartością kolumny „map_symb” w zbiorze danych.
  • Kliknij dwukrotnie symbole, które chcesz zmienić. W wyświetlonym oknie kliknij przycisk „Zmień”.
  • Pozwala to zmienić kolor dla podanej wartości atrybutu.
  • Rób to, dopóki nie zmienisz kolorów zgodnie z wymaganiami.
  • Po zakończeniu możesz zapisać styl, klikając przycisk „Zapisz styl ...”. Umożliwi to zastosowanie tego samego stylu do dowolnego innego zestawu danych, po prostu klikając „Załaduj styl ...” w tym samym oknie. To może być to, co próbujesz osiągnąć, łącząc plik tekstowy ze zbiorem danych, co nie jest możliwe AFAIK. Jednak po zapisaniu stylu będzie można go używać w kolejnych zestawach danych (zakładając, że mają takie same wartości atrybutów). Jeśli otworzysz plik zapisu stylu, zobaczysz, że jest to zwykły tekst, który możesz edytować, jeśli chcesz. Oczywiście można samemu napisać ten plik w dowolnym edytorze tekstów, ale jest to szybsze i łatwiejsze dzięki GUI.
  • Kliknij „Zastosuj”, aby zobaczyć zmiany, i „OK”, aby zamknąć okno Właściwości warstwy.
R Thiede
źródło
1
To wydaje się okropnie dużo pracy, gdy OP ma już tabelę pożądanych kolorów. Czy w ogóle można przejść z oryginalnej tabeli do formatu „Zapisz styl” bezpośrednio?
Andy W
1
Właściwie to jest łatwe. W ten sposób normalnie klasyfikujesz dane wektorowe w dowolnym systemie GIS. Zaczynam od pustego płótna i opisuję każde kliknięcie myszą, aby uniknąć zamieszania. Możesz oczywiście napisać swoją specyfikację kolorów w formacie Style od samego początku. Jest prosty i dość czytelny dla człowieka. Ale to nie jest zbyt przenośne i nie zadziała, jeśli popełnisz literówkę. Po prostu zrób to za pomocą GUI. Po zapisaniu pliku stylu możesz go zmodyfikować w edytorze tekstu i zaoszczędzić sobie bólu głowy związanego z nawigacją w GUI.
R Thiede
1
Andy ma to za jaja; istnieją setki MAPCODE. I tak, wiem jak to zrobić ręcznie.
inny ben
O, rozumiem. Cóż, w takim przypadku możesz sklasyfikować tylko niewielką część swoich KODÓW MAP, na przykład trzy z nich. Następnie zapisz styl. Następnie otwórz plik stylu i sprawdź, jak jest sformatowany. Następnie po prostu napisz skrypt (powiedzmy w Pythonie), aby iterować plik MAPCODE wiersz po wierszu, i przekonwertuj go na format pliku stylu, który możesz następnie zastosować do mapy. Nie znam istniejącego skryptu, który to robi i niestety jestem w trakcie realizacji projektu, więc nie mam czasu, aby sam to zrobić. Ale jeśli ktoś mógłby to zrobić, byłoby miło, gdyby opublikowano ją tutaj jako odpowiedź :)
R Thiede