Використовуючи картографічне поле RGB для символіки в QGIS?


10

Використання QGIS версії 1.7.

У мене є звичайний текстовий файл, який містить список значень rgb проти коду. Я хочу використовувати цю таблицю кольорів для фарбування шару багатокутника, зіставивши одне з полів його атрибутів ('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
.... 

Я хочу відповідати атрибуту 'map_symb' зі значенням у MAPCODE і використовувати відповідні значення RGB для забарвлення полігонів.

Чи існує спосіб, як це зробити?


1
Я подав запит на особливості для цього: hub.qgis.org/isissue/4339
underdark

Дивіться це запитання та відповіді на рішення: gis.stackexchange.com/questions/15185/…
інший бен

Це реалізовується від QGIS 2.0 далі як символи, визначені даними: gis.stackexchange.com/questions/60450/…
AndreJ

Відповіді:


10

Ви можете використовувати Python з модулем 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>

Ви також можете використовувати модуль shapefile ([shapefile]) 1 для форм-файлів із стовпцями 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

і так ...


14

У пізнішій версії QGIS простіше виконати задане завдання.

Просто відкрийте Властивості шару, вкладку Стиль і переконайтесь, що вибрано Один символ. Клацніть на полі поруч із кольором "Заливка" та виберіть "Редагувати.

Ви будете редагувати базовий колір бази полігонів на кольорах RGB, присутніх у таблиці даних, з постійним кольором рамки (при необхідності можна застосувати ті самі критерії).

Після натискання кнопки "Редагувати" просто введіть назви 3 стовпців RGB таблиці, використовуючи таке вираження:

color_rgb ("R-стовпчик", "G-стовпець", "B-стовпець")

Гаразд, застосувати і готово.

Якщо вам потрібно позначити та охарактеризувати дані однаковим чином (наприклад, для створення легенди), просто скористайтеся опцією "Категоризовано" та застосуйте те саме вираження до символу та до стовпця, визначеного нижче.

введіть тут опис зображення


5

Якщо ви хочете класифікувати деякі векторні дані повторно, то ось що ви можете зробити:

  • Завантажте вектор в QGIS.
  • Клацніть правою кнопкою миші на шарі на панелі "Шари" зліва на екрані.
  • Клацніть на "Властивості" у меню, яке з'явиться.
  • Клацніть на вкладку «Стиль» у вікні, що з’явиться.
  • На екрані має бути пункт випадаючого списку з написом "Єдиний символ". Клацніть на ньому та змініть його значення на "Категоризоване".
  • Макет інтерфейсу зміниться, і ви отримаєте новий параметр з написом "Стовпець". Клацніть на ньому та виберіть поле "map_symb".
  • Натисніть кнопку «Класифікувати» під великим порожнім полем. Порожнє поле буде заповнене вмістом стовпця "map_symb" у вашому наборі даних.
  • Двічі клацніть на символах, які ви хочете змінити. У вікні, що з'явиться, натисніть кнопку з написом "Змінити".
  • Це дозволяє змінити колір для заданого значення атрибута.
  • Продовжуйте робити це, поки не змінили кольори, як потрібно.
  • Закінчивши, ви можете зберегти стиль, натиснувши кнопку "Зберегти стиль ...". Це дозволить вам застосувати той самий стиль до будь-якого іншого набору даних, просто натиснувши "Завантажити стиль ...", коли ви знаходитесь у цьому ж вікні. Це можливо ви намагалися досягти, зв’язавши текстовий файл із набором даних, що неможливо AFAIK. Після збереження стилю, однак, ви зможете використовувати його в будь-яких наступних наборах даних (при умові, що вони мають однакові значення атрибутів). Якщо ви відкриєте файл збереження стилю, ви побачите, що це просто звичайний текст, який ви можете редагувати, якщо хочете. Звичайно, можна просто записати цей файл самостійно в будь-який текстовий редактор, але зробити це швидше і простіше через GUI.
  • Клацніть «Застосувати», щоб побачити зміни, і «ОК», щоб закрити вікно властивостей шару.

1
Це здається дуже багато роботи, коли в ОП вже є таблиця потрібних кольорів. Чи варто все-таки перейти від початкової таблиці до того, на що безпосередньо знаходиться формат "Зберегти стиль"?
Енді Ш

1
Насправді це просто. Це те, як ви зазвичай класифікуєте векторні дані в будь-якому ГІС. Я починаю з чистого полотна і описую кожен клацання миші, просто щоб запобігти плутанині. Звичайно, ви можете написати специфікацію свого кольору у форматі «Стиль» з початку роботи. Це просто і досить по-людськи читабельно. Але це не дуже портативно, і це не спрацює, якщо ви робите друк. Просто зробіть це з графічним інтерфейсом. Після збереження файлу Style ви можете змінити його в текстовому редакторі та зберегти головний біль навігації по графічному інтерфейсу.
R Thiede

1
Енді це за кулями; є сотні MAPCODE. І так, я знаю, як це зробити вручну.
інший бен

А, бачу. Ну, у такому випадку ви можете класифікувати лише невелику частину своїх MAPCODE, як-от три. Потім збережіть стиль. Потім відкрийте файл стилів і подивіться, як він відформатований. Потім просто напишіть сценарій (наприклад, Python), щоб повторити через файл MAPCODE рядок за рядком, і конвертуйте його у формат файлу стилів, який ви можете застосувати до своєї карти. Мені невідомий існуючий сценарій, який робить це, і, на жаль, я перебуваю в середині проекту, тому не маю часу зробити це сам зараз. Але якщо хтось міг би зняти це, було б непогано розмістити його тут як відповідь :)
R Thiede
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.