Menggunakan pemetaan lapangan-ke-RGB untuk simbologi di QGIS?

10

Menggunakan QGIS versi 1.7.

Saya memiliki file teks biasa yang berisi daftar nilai rgb terhadap kode. Saya ingin menggunakan tabel warna ini untuk mewarnai lapisan poligon dengan memetakan salah satu bidang atributnya ('map_symb') ke kode dalam file teks.

tabel warna sangat panjang, dan terlihat seperti ini:

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

Saya ingin mencocokkan atribut 'map_symb' saya dengan nilai di MAPCODE, dan menggunakan nilai RGB yang sesuai untuk mewarnai poligon.

Apakah ada cara gui untuk melakukan ini?

ben yang berbeda
sumber
1
Saya telah mengajukan permintaan fitur untuk ini: hub.qgis.org/issues/4339
underdark
Lihat pertanyaan & tanggapan ini untuk solusi: gis.stackexchange.com/questions/15185/…
a berbeda ben
Ini diimplementasikan mulai QGIS 2.0 dan seterusnya sebagai simbologi yang ditentukan data: gis.stackexchange.com/questions/60450/…
AndreJ

Jawaban:

10

Anda bisa menggunakan Python dengan modul 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()

File gaya yang dihasilkan oleh skrip ini adalah (dan berfungsi):

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

Anda juga dapat menggunakan modul shapefile ([shapefile]) 1 untuk shapefile dengan kolom 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

dan sebagainya...

gen
sumber
14

Pada versi selanjutnya, QGIS lebih mudah melakukan tugas yang diminta.

Cukup buka Layer Properties, Style Tab, dan pastikan Single Symbol dipilih. Klik kotak di sebelah warna "Isi" dan pilih "Edit.

Anda akan mengedit warna dasar dari basis poligon Anda pada warna RGB yang ada di tabel data, dengan warna batas konstan (Anda dapat menerapkan kriteria yang sama jika diperlukan).

Setelah menekan "Edit" cukup letakkan 3 kolom RGB nama tabel Anda menggunakan ekspresi berikut:

color_rgb ("R-kolom", "G-kolom", "B-kolom")

Oke, Daftar dan selesai.

Jika Anda perlu memberi label dan mengkarakterisasi data dengan cara yang sama (misalnya, untuk membangun legenda), cukup gunakan opsi Dikategorikan dan terapkan ekspresi yang sama ke Simbol dan ke Kolom, yang diidentifikasi dalam gambar di bawah.

masukkan deskripsi gambar di sini

zemigl
sumber
5

Jika Anda ingin mengklasifikasikan beberapa data vektor dengan cara yang berulang maka inilah yang dapat Anda lakukan:

  • Muat vektor Anda ke QGIS.
  • Klik kanan pada layer di panel "Layers" di sisi kiri layar.
  • Klik pada "Properties" di menu yang muncul.
  • Klik pada tab "Gaya" di jendela yang muncul.
  • Seharusnya ada item daftar drop-down di layar yang bertuliskan "Single Symbol". Klik di atasnya, dan ubah nilainya menjadi "Dikategorikan".
  • Tata letak antarmuka akan berubah, memberi Anda opsi baru berlabel "Kolom". Klik di atasnya dan pilih bidang "map_symb".
  • Klik tombol "Klasifikasi" di bawah bidang kosong yang besar. Bidang kosong akan diisi dengan isi kolom "map_symb" di dataset Anda.
  • Klik dua kali pada simbol yang ingin Anda ubah. Di jendela yang muncul, klik tombol berlabel "Ubah".
  • Ini memungkinkan Anda untuk mengubah warna untuk nilai atribut yang diberikan.
  • Terus lakukan ini sampai Anda telah mengubah warna sesuai kebutuhan.
  • Setelah selesai, Anda mungkin ingin menyimpan gaya dengan mengklik tombol "Simpan Gaya ...". Ini memungkinkan Anda untuk menerapkan gaya yang sama ke dataset lain, hanya dengan mengeklik "Muat Gaya ..." saat berada di jendela yang sama. Ini mungkin yang ingin Anda capai dengan menautkan file teks dengan dataset, yang tidak mungkin AFAIK. Namun, setelah Anda menyimpan style, Anda akan dapat menggunakannya pada set data berikut (dengan asumsi mereka memiliki nilai atribut yang sama). Jika Anda membuka file simpanan gaya, Anda akan melihat bahwa itu hanya teks biasa, yang dapat Anda edit jika Anda mau. Tentu saja mungkin untuk menulis file ini sendiri di editor teks apa pun, tetapi lebih cepat dan lebih mudah melakukannya melalui GUI.
  • Klik "Terapkan" untuk melihat perubahan Anda dan "OK" untuk menutup jendela Layer Properties.
R Thiede
sumber
1
Itu tampak seperti banyak pekerjaan ketika OP sudah memiliki tabel warna yang diinginkan. Apakah ada cara untuk beralih dari tabel asli ke format "Save Style" secara langsung?
Andy W
1
Sebenarnya itu mudah. Begitulah cara Anda biasanya mengklasifikasikan data vektor dalam GIS apa pun. Saya mulai dengan kanvas kosong dan menjelaskan setiap klik mouse, hanya untuk mencegah kebingungan. Anda dapat, tentu saja, menulis spesifikasi warna Anda dalam format Style dari awal. Sederhana dan mudah dibaca oleh manusia. Tapi itu tidak terlalu portabel, dan tidak akan berfungsi jika Anda membuat kesalahan ketik. Lakukan saja dengan GUI. Setelah Anda menyimpan file Style, Anda dapat memodifikasinya dalam editor teks dan menyelamatkan diri Anda dari sakit menavigasi GUI.
R Thiede
1
Andy memilikinya oleh bola; ada ratusan MAPCODE. Dan ya, saya tahu cara melakukannya secara manual.
ben yang berbeda
Ah, begitu. Nah, dalam hal ini, Anda mungkin ingin mengklasifikasikan hanya sebagian kecil dari MAPCODE Anda, seperti tiga dari mereka. Kemudian simpan gayanya. Kemudian buka file gaya dan lihat bagaimana itu diformat. Kemudian cukup tulis skrip (in, misalkan, Python) untuk beralih melalui file MAPCODE Anda baris demi baris, dan mengonversinya menjadi format file style, yang kemudian dapat Anda terapkan ke peta Anda. Saya tidak mengetahui skrip yang ada yang melakukan ini dan sayangnya saya berada di tengah-tengah proyek, jadi tidak punya waktu untuk melakukannya sendiri sekarang. Tetapi jika seseorang dapat melakukannya, alangkah baiknya jika itu diposting di sini sebagai jawaban :)
R Thiede