Использование отображения поля в 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/issues/4339
Подземье
См. Этот вопрос и ответы для решения: 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, представленных в таблице данных, с постоянным цветом границы (при необходимости вы можете применять те же критерии).

После нажатия «Изменить» просто поместите имена трех столбцов RGB вашей таблицы, используя следующее выражение:

color_rgb ( "Р-столбец", "G-колонка", "В-столбец")

Хорошо, подайте заявку и все готово.

Если вам нужно пометить и охарактеризовать данные таким же образом (например, чтобы создать легенду), просто используйте параметр Категоризованный и примените одно и то же выражение к символу и столбцу, указанному на изображении ниже.

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

zemigl
источник
5

Если вы хотите классифицировать некоторые векторные данные повторяющимся образом, то вот что вы можете сделать:

  • Загрузите ваш вектор в QGIS.
  • Щелкните правой кнопкой мыши слой на панели «Слои» в левой части экрана.
  • Нажмите «Свойства» в появившемся меню.
  • Нажмите на вкладку «Стиль» в открывшемся окне.
  • На экране должен быть элемент раскрывающегося списка с надписью «Единый символ». Нажмите на него и измените его значение на «Категоризованный».
  • Интерфейс интерфейса изменится, предоставив вам новую опцию с надписью «Столбец». Нажмите на него и выберите поле «map_symb».
  • Нажмите кнопку «Классифицировать» под большим пустым полем. Пустое поле будет заполнено содержимым столбца «map_symb» в вашем наборе данных.
  • Дважды щелкните по символам, которые вы хотите изменить. В появившемся окне нажмите кнопку с надписью «Изменить».
  • Это позволяет изменить цвет для данного значения атрибута.
  • Продолжайте делать это, пока не измените цвета по мере необходимости.
  • Когда вы закончите, вы можете сохранить стиль, нажав кнопку «Сохранить стиль ...». Это позволит вам применить тот же стиль к любому другому набору данных, просто нажав «Загрузить стиль ...» в этом же окне. Возможно, это то, чего вы пытались достичь, связав текстовый файл с набором данных, что невозможно, AFAIK. После сохранения стиля вы сможете использовать его в любых следующих наборах данных (при условии, что они имеют одинаковые значения атрибутов). Если вы откроете файл сохранения стиля, вы увидите, что это просто текст, который вы можете редактировать, если хотите. Конечно, можно просто написать этот файл в любом текстовом редакторе, но это проще и быстрее сделать через графический интерфейс.
  • Нажмите «Применить», чтобы увидеть изменения, и «ОК», чтобы закрыть окно «Свойства слоя».
R Thiede
источник
1
Это кажется ужасной работой, когда у ОП уже есть таблица желаемых цветов. Есть ли какой-то путь от исходной таблицы к формату «Сохранить стиль»?
Энди W
1
На самом деле это легко. Так вы обычно классифицируете векторные данные в любой ГИС. Я начинаю с пустого холста и описываю каждый щелчок мышью, чтобы избежать путаницы. Вы можете, конечно, написать свою цветовую спецификацию в формате Style с самого начала. Это просто и довольно читабельно. Но это не очень переносимо, и не будет работать, если вы сделаете опечатку. Просто сделайте это с помощью графического интерфейса. После сохранения файла стиля вы можете изменить его в текстовом редакторе и избавить себя от головной боли при навигации по графическому интерфейсу.
R Thiede
1
У Энди есть это по яйцам; Есть сотни MAPCODE. И да, я знаю, как это сделать вручную.
другой бен
Ах я вижу. Что ж, в этом случае вы можете классифицировать только небольшую часть ваших MAPCODE, например три из них. Затем сохраните стиль. Затем откройте файл стиля и посмотрите, как он отформатирован. Затем просто напишите скрипт (скажем, в Python), чтобы построчно проходить по файлу MAPCODE, и конвертируйте его в формат файла стиля, который затем можно применить к вашей карте. Я не знаю о существующем сценарии, который делает это, и, к сожалению, я нахожусь в середине проекта, поэтому у меня нет времени, чтобы сделать это самому сейчас. Но если бы кто-то смог это осуществить, было бы неплохо опубликовать это здесь в качестве ответа :)
R Thiede