QGISのシンボルにフィールドからRGBへのマッピングを使用していますか?


10

QGISバージョン1.7を使用します。

コードに対する一連のrgb値をリストするプレーンテキストファイルがあります。このカラーテーブルを使用して、属性フィールドの1つ( '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
アンダーダーク

:ソリューションのため、この質問&回答を参照してください gis.stackexchange.com/questions/15185/...
異なるベン

データシンボルを定義した通り、これは以降QGIS 2.0から実装されている:gis.stackexchange.com/questions/60450/...
アンドレイを

回答:


10

ElementTreeモジュールでPythonを使用できます。

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])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-column"、 "G-column"、 "B-column")

OK、Applyと完了です。

同じ方法でデータにラベルを付けて特徴付ける必要がある場合(たとえば、凡例を作成する場合)、[分類]オプションを使用して、同じ式をシンボルと列に適用します。

ここに画像の説明を入力してください


5

一部のベクターデータを繰り返し可能な方法で分類する場合は、次のことを実行できます。

  • ベクトルをQGISに読み込みます。
  • 画面左側の[レイヤー]ペインでレイヤーを右クリックします。
  • 表示されるメニューの「プロパティ」をクリックします。
  • 表示されるウィンドウの[スタイル]タブをクリックします。
  • 画面に「単一のシンボル」と表示されたドロップダウンリスト項目があるはずです。それをクリックして、値を「分類済み」に変更します。
  • インターフェイスのレイアウトが変更され、「列」という新しいオプションが表示されます。それをクリックして、「map_symb」フィールドを選択します。
  • 大きな空のフィールドの下にある[分類]ボタンをクリックします。空のフィールドには、データセットの「map_symb」列の内容が入力されます。
  • 変更するシンボルをダブルクリックします。表示されるウィンドウで、「変更」というラベルの付いたボタンをクリックします。
  • これにより、特定の属性値の色を変更できます。
  • 必要に応じて色を変更するまで、これを繰り返します。
  • 完了したら、[スタイルを保存...]ボタンをクリックしてスタイルを保存することができます。これにより、この同じウィンドウで[スタイルの読み込み...]をクリックするだけで、他のデータセットに同じスタイルを適用できます。これは、テキストファイルをデータセットにリンクすることで実現しようとしていた可能性がありますが、これはAFAIKでは不可能です。ただし、スタイルを保存すると、後続のすべてのデータセットで使用できるようになります(同じ属性値がある場合)。スタイルの保存ファイルを開くと、プレーンテキストであることがわかり、必要に応じて編集できます。もちろん、このファイルを任意のテキストエディターで自分で作成することも可能ですが、GUIを使用する方が速くて簡単です。
  • [適用]をクリックして変更を確認し、[OK]をクリックして[レイヤープロパティ]ウィンドウを閉じます。

1
OPがすでに目的の色のテーブルを持っている場合、それは大変な作業のようです。とにかく、元のテーブルから直接「保存スタイル」形式に移行する方法はありますか?
アンディW

1
実は簡単です。これは、通常、どのGISでもベクターデータを分類する方法です。混乱を避けるために、空白のキャンバスから始めて、マウスのクリックごとに説明します。もちろん、最初からカラー形式をスタイル形式で記述できます。シンプルで、かなり人間が読める形式です。しかし、これは移植性が低く、タイプミスをするとうまくいきません。GUIで実行するだけです。スタイルファイルを保存したら、テキストエディターで変更し、GUIをナビゲートする頭痛の種を省くことができます。
R Thiede 2011

1
アンディはボールでそれを持っています。何百ものMAPCODEがあります。そして、はい、私はそれを手動で行う方法を知っています。
別のベン

ああ、なるほど。その場合は、MAPCODEの3つなど、ごく一部のみを分類することをお勧めします。次に、スタイルを保存します。次に、スタイルファイルを開いて、それがどのようにフォーマットされているかを確認します。次に、スクリプト(Pythonなど)を記述して、MAPCODEファイルを1行ずつ繰り返し、それをスタイルファイルの形式に変換します。これをマップに適用できます。私はこれを実行する既存のスクリプトに気づいていないので、残念ながら私はプロジェクトの最中であるので、今自分でそれを行う時間はありません。しかし、誰かがそれを引き出すことができるならば、それを答えとしてここに投稿しておくといいでしょう:)
R Thiede
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.