在QGIS中使用场到RGB映射进行符号学?


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值为多边形着色。

有没有GUI的方式来做到这一点?


1
我已为此提交了功能请求:hub.qgis.org/issues/4339
underdark

看到这个问题和答复解决办法: gis.stackexchange.com/questions/15185/...
不同的奔

:这是从2.0 QGIS起实现为数据定义符号gis.stackexchange.com/questions/60450/...
安德烈

Answers:


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列的shapefile

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中。
  • 右键单击屏幕左侧“图层”窗格中的图层。
  • 在出现的菜单中单击“属性”。
  • 在出现的窗口中单击“样式”选项卡。
  • 屏幕上应该有一个下拉列表项,显示“单个符号”。单击它,然后将其值更改为“ Categorized”。
  • 界面布局将发生变化,为您提供一个标记为“列”的新选项。单击它,然后选择“ map_symb”字段。
  • 单击大空白字段下方的“分类”按钮。空字段将填充数据集中“ map_symb”列的内容。
  • 双击要更改的符号。在出现的窗口中,单击标记为“更改”的按钮。
  • 这使您可以更改给定属性值的颜色。
  • 继续执行此操作,直到您根据需要更改了颜色。
  • 完成后,您可能需要通过单击“保存样式...”按钮来保存样式。这样,您只需在同一窗口中单击“加载样式...”,即可将相同样式应用于任何其他数据集。这可能是您试图通过将文本文件与数据集链接来实现的,而AFAIK则无法实现。但是,一旦保存了样式,就可以在以下任何数据集上使用它(假设它们具有相同的属性值)。如果打开样式的保存文件,则会看到它只是纯文本,可以根据需要进行编辑。当然,可以在任何文本编辑器中自己编写此文件,但是通过GUI进行操作更快,更轻松。
  • 单击“应用”查看更改,单击“确定”关闭“图层属性”窗口。

1
当OP已经具有所需颜色的表格时,这似乎需要进行大量工作。无论如何,从原始表到直接使用“保存样式”格式是什么?
Andy W

1
其实很简单。这是通常在任何GIS中对矢量数据进行分类的方式。我从一张空白的画布开始,描述每一次鼠标单击,只是为了防止混淆。当然,您可以从一开始就以样式格式编写颜色规范。它很简单,而且很容易阅读。但这不是很方便,如果您打错字也不行。只需使用GUI即可。保存样式文件后,可以在文本编辑器中对其进行修改,从而省去了浏览GUI的麻烦。
R Thiede

1
安迪(Andy)持球入球;有数百种MAPCODE。是的,我知道如何手动进行。
不同的本

知道了 好吧,在这种情况下,您可能只想对MAPCODE的一小部分进行分类,就像其中的三个一样。然后保存样式。然后打开样式文件,并查看其格式。然后,只需编写脚本(例如,使用Python)即可逐行遍历MAPCODE文件,然后将其转换为样式文件的格式,然后可以将其应用于地图。我不知道执行此操作的现有脚本,但不幸的是,我处于一个项目的中间,所以现在没有时间自己做。但是,如果有人可以提出,最好将其张贴在这里作为答案:)
R Thiede
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.