ใช้การจับคู่แบบ Field-to-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 ที่สอดคล้องกันเพื่อกำหนดสีรูปหลายเหลี่ยม

มีวิธี gui ให้ทำเช่นนี้?


1
ฉันได้ส่งคำขอคุณสมบัติสำหรับสิ่งนี้: hub.qgis.org/issues/4339
underdark

ดูคำถามนี้และคำตอบสำหรับการแก้ปัญหา: gis.stackexchange.com/questions/15185/…
ben ben

สิ่งนี้ถูกนำมาใช้จาก 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 สำหรับ shapefiles ด้วยคอลัมน์ 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 3 อันในตารางของคุณโดยใช้นิพจน์ต่อไปนี้:

color_rgb ( "R-คอลัมน์", "G-คอลัมน์", "B-คอลัมน์")

ตกลงสมัครและเสร็จแล้ว

หากคุณต้องการติดป้ายกำกับและระบุลักษณะของข้อมูลในลักษณะเดียวกัน (เช่นเพื่อสร้างคำอธิบายแผนภูมิ) เพียงใช้ตัวเลือกการจัดหมวดหมู่และใช้นิพจน์เดียวกันกับสัญลักษณ์และคอลัมน์ที่ระบุในภาพด้านล่าง

ป้อนคำอธิบายรูปภาพที่นี่


5

หากคุณต้องการจัดประเภทข้อมูลเวกเตอร์ด้วยวิธีทำซ้ำได้นี่คือสิ่งที่คุณสามารถทำได้:

  • โหลดเวกเตอร์ของคุณลงใน QGIS
  • คลิกขวาที่เลเยอร์ในบานหน้าต่าง "เลเยอร์" ที่ด้านซ้ายของหน้าจอ
  • คลิกที่ "Properties" ในเมนูที่ปรากฏขึ้น
  • คลิกที่แท็บ "สไตล์" ในหน้าต่างที่ปรากฏขึ้น
  • ควรมีรายการแบบหล่นลงบนหน้าจอที่ระบุว่า "สัญลักษณ์เดียว" คลิกที่มันและเปลี่ยนค่าเป็น "จัดหมวดหมู่"
  • เลย์เอาต์ของอินเทอร์เฟซจะเปลี่ยนไปทำให้คุณมีตัวเลือกใหม่ชื่อว่า "คอลัมน์" คลิกที่มันและเลือกฟิลด์ "map_symb"
  • คลิกปุ่ม "จัดประเภท" ใต้ช่องว่างขนาดใหญ่ ฟิลด์ว่างจะถูกเติมด้วยเนื้อหาของคอลัมน์ "map_symb" ในชุดข้อมูลของคุณ
  • ดับเบิลคลิกที่สัญลักษณ์ที่คุณต้องการเปลี่ยน ในหน้าต่างที่ปรากฏขึ้นให้คลิกที่ปุ่ม "เปลี่ยนแปลง"
  • สิ่งนี้ช่วยให้คุณสามารถเปลี่ยนสีสำหรับค่าแอตทริบิวต์ที่กำหนด
  • ทำสิ่งนี้ต่อไปจนกว่าคุณจะเปลี่ยนสีตามต้องการ
  • เมื่อเสร็จแล้วคุณอาจต้องการบันทึกสไตล์โดยคลิกปุ่ม "บันทึกสไตล์ ... " สิ่งนี้จะช่วยให้คุณสามารถใช้สไตล์เดียวกันกับชุดข้อมูลอื่นเพียงแค่คลิก "โหลดสไตล์ ... " เมื่ออยู่ในหน้าต่างเดียวกันนี้ นี่อาจเป็นสิ่งที่คุณพยายามทำโดยเชื่อมโยงไฟล์ข้อความกับชุดข้อมูลซึ่งเป็นไปไม่ได้ AFAIK เมื่อคุณบันทึกสไตล์แล้วคุณจะสามารถใช้งานได้กับชุดข้อมูลต่อไปนี้ (สมมติว่าพวกเขามีค่าแอตทริบิวต์เดียวกัน) หากคุณเปิดไฟล์บันทึกสไตล์คุณจะเห็นว่าเป็นเพียงข้อความธรรมดาซึ่งคุณสามารถแก้ไขได้หากต้องการ เป็นไปได้แน่นอนที่จะเขียนไฟล์นี้ด้วยตัวคุณเองในโปรแกรมแก้ไขข้อความใด ๆ แต่ทำได้เร็วขึ้นและง่ายขึ้นผ่าน GUI
  • คลิก "ใช้" เพื่อดูการเปลี่ยนแปลงของคุณและ "ตกลง" เพื่อปิดหน้าต่างคุณสมบัติเลเยอร์

1
ดูเหมือนว่าจะทำงานได้แย่มากเมื่อ OP มีตารางสีที่ต้องการอยู่แล้ว อย่างไรก็ตามมีการเปลี่ยนจากตารางต้นฉบับเป็นรูปแบบ "บันทึกสไตล์" โดยตรงหรือไม่
Andy W

1
จริงๆแล้วมันง่าย เป็นวิธีที่คุณจำแนกข้อมูลเวกเตอร์ใน GIS ใด ๆ ตามปกติ ฉันเริ่มต้นด้วยผืนผ้าใบว่างเปล่าและอธิบายการคลิกเมาส์แต่ละครั้งเพียงเพื่อป้องกันความสับสน แน่นอนคุณสามารถเขียนข้อกำหนดสีของคุณในรูปแบบสไตล์จากการไป มันง่ายและมนุษย์อ่านง่าย แต่นั่นไม่ใช่แบบพกพามากและจะไม่ทำงานถ้าคุณพิมพ์ผิด เพียงแค่ทำกับ GUI เมื่อคุณบันทึกไฟล์สไตล์แล้วคุณสามารถแก้ไขได้ในโปรแกรมแก้ไขข้อความและช่วยให้คุณไม่ต้องกังวลเรื่องการนำทาง GUI
R Thiede

1
แอนดี้มีลูกบอล มี MAPCODE หลายร้อยรายการ และใช่ฉันรู้วิธีการทำด้วยตนเอง
ผลประโยชน์อื่น

อ่าฉันเข้าใจแล้ว ในกรณีนี้คุณอาจต้องการจำแนก MAPCODE ของคุณเพียงเล็กน้อยเช่นสามรายการ จากนั้นบันทึกสไตล์ จากนั้นเปิดไฟล์สไตล์และดูวิธีการจัดรูปแบบ จากนั้นเพียงเขียนสคริปต์ (ใน, พูด, Python) เพื่อวนซ้ำไฟล์ MAPCODE ของคุณทีละบรรทัดและแปลงเป็นรูปแบบของไฟล์สไตล์ซึ่งคุณสามารถนำไปใช้กับแผนที่ของคุณ ฉันไม่ทราบถึงสคริปต์ที่มีอยู่ซึ่งทำสิ่งนี้และน่าเสียดายที่ฉันอยู่ในระหว่างโครงการดังนั้นจึงไม่มีเวลาทำมันเองตอนนี้ แต่ถ้ามีคนสามารถดึงมันออกก็ต้องการจะดีที่จะมีมันโพสต์ที่นี่เป็นคำตอบ :)
R Thiede
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.