Sử dụng ánh xạ từ trường đến RGB cho hệ thống ký hiệu trong QGIS?


10

Sử dụng phiên bản QGIS 1.7.

Tôi có một tệp văn bản đơn giản liệt kê một tập hợp các giá trị rgb theo mã. Tôi muốn sử dụng bảng màu này để tô màu một lớp đa giác bằng cách ánh xạ một trong các trường thuộc tính của nó ('map_symb') thành một mã trong tệp văn bản.

Bảng màu rất dài và trông như thế này:

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

Tôi muốn khớp thuộc tính 'map_symb' của mình với một giá trị trong MAPCODE và sử dụng các giá trị RGB tương ứng để tô màu cho đa giác.

Có một cách gui để làm điều này?


1
Tôi đã đệ đơn yêu cầu tính năng cho việc này: hub.qgis.org/issues/4339
Underdark

Xem câu hỏi và câu trả lời này cho các giải pháp: gis.stackexchange.com/questions/15185/iêu
một ben khác

Điều này được triển khai từ QGIS 2.0 trở đi dưới dạng ký hiệu dữ liệu được xác định: gis.stackexchange.com/questions/60450/ trộm
AndreJ

Câu trả lời:


10

Bạn có thể sử dụng Python với mô-đun 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()

Tệp kiểu được tạo bởi tập lệnh này là (và nó hoạt động):

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

Bạn cũng có thể sử dụng mô-đun shapefile ([shapefile]) 1 cho các shapefile với các cột 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

và vì thế...


14

Trên phiên bản sau của QGIS dễ thực hiện tác vụ được yêu cầu hơn.

Chỉ cần mở Thuộc tính lớp, Tab kiểu và đảm bảo Biểu tượng đơn được chọn. Nhấp vào hộp bên cạnh màu "Điền" và chọn "Chỉnh sửa.

Bạn sẽ chỉnh sửa màu cơ sở của các cơ sở đa giác của mình trên các màu RGB có trên bảng dữ liệu, với màu đường viền không đổi (bạn có thể áp dụng các tiêu chí tương tự nếu cần).

Sau khi nhấn "Chỉnh sửa", chỉ cần đặt 3 tên cột RGB của bảng bằng biểu thức sau:

color_rgb ("cột R", "cột G", "cột B")

Ok, áp dụng và thực hiện của bạn.

Nếu bạn cần gắn nhãn và mô tả dữ liệu theo cùng một cách (ví dụ: để tạo chú giải), chỉ cần sử dụng tùy chọn Phân loại và áp dụng cùng một biểu thức cho Biểu tượng và cho Cột, được xác định trong hình ảnh dưới đây.

nhập mô tả hình ảnh ở đây


5

Nếu bạn muốn phân loại một số dữ liệu vectơ theo cách lặp lại thì đây là những gì bạn có thể làm:

  • Tải vector của bạn vào QGIS.
  • Nhấp chuột phải vào lớp trong ngăn "Lớp" ở bên trái màn hình.
  • Nhấp vào "Thuộc tính" trong menu xuất hiện.
  • Nhấp vào tab "Kiểu" trong cửa sổ xuất hiện.
  • Cần có một mục danh sách thả xuống trên màn hình có chữ "Biểu tượng đơn". Nhấp vào nó và thay đổi giá trị của nó thành "Phân loại".
  • Bố cục giao diện sẽ thay đổi, cung cấp cho bạn một tùy chọn mới có nhãn "Cột". Nhấp vào nó và chọn trường "map_symb".
  • Nhấp vào nút "Phân loại" bên dưới trường trống lớn. Trường trống sẽ được điền với nội dung của cột "map_symb" trong tập dữ liệu của bạn.
  • Nhấp đúp vào biểu tượng bạn muốn thay đổi. Trong cửa sổ xuất hiện, nhấp vào nút có nhãn "Thay đổi".
  • Điều này cho phép bạn thay đổi màu cho giá trị thuộc tính đã cho.
  • Tiếp tục làm điều này cho đến khi bạn thay đổi màu sắc theo yêu cầu.
  • Khi bạn hoàn tất, bạn có thể muốn lưu kiểu bằng cách nhấp vào nút "Lưu kiểu ...". Điều này sẽ cho phép bạn áp dụng cùng một kiểu cho bất kỳ tập dữ liệu nào khác, chỉ bằng cách nhấp vào "Tải kiểu ..." khi ở cùng cửa sổ này. Đây có thể là những gì bạn đã cố gắng đạt được bằng cách liên kết tệp văn bản với tập dữ liệu, điều này không thể thực hiện được AFAIK. Tuy nhiên, khi bạn đã lưu kiểu, bạn sẽ có thể sử dụng nó trên bất kỳ bộ dữ liệu nào sau đây (giả sử chúng có cùng giá trị thuộc tính). Nếu bạn mở tệp lưu của kiểu, bạn sẽ thấy đó chỉ là văn bản thuần túy, bạn có thể chỉnh sửa nếu muốn. Tất nhiên có thể chỉ cần tự viết tệp này trong bất kỳ trình soạn thảo văn bản nào, nhưng thực hiện nhanh hơn và dễ dàng hơn thông qua GUI.
  • Nhấp vào "Áp dụng" để xem các thay đổi của bạn và "OK" để đóng cửa sổ Thuộc tính lớp.

1
Điều đó có vẻ như rất nhiều công việc khủng khiếp khi OP đã có một bảng các màu mong muốn. Có cách nào để đi từ bảng gốc đến định dạng "Lưu kiểu" trực tiếp không?
Andy W

1
Thật ra nó rất dễ. Đó là cách bạn thường phân loại dữ liệu vectơ trong bất kỳ GIS nào. Tôi đang bắt đầu với một khung vẽ trống và mô tả mỗi lần nhấp chuột, chỉ để tránh nhầm lẫn. Tất nhiên, bạn có thể viết đặc tả màu của mình ở định dạng Kiểu từ khi đi. Nó đơn giản và khá dễ đọc. Nhưng điều đó không dễ mang theo và sẽ không hoạt động nếu bạn mắc lỗi đánh máy. Chỉ cần làm điều đó với GUI. Khi bạn đã lưu tệp Kiểu, bạn có thể sửa đổi nó trong trình soạn thảo văn bản và tự cứu mình khỏi việc điều hướng GUI.
R Thiede

1
Andy có nó bởi những quả bóng; có hàng trăm MAPCODE. Và vâng, tôi biết làm thế nào để làm nó bằng tay.
một ben khác

Ah tôi thấy. Chà, trong trường hợp đó, bạn có thể chỉ muốn phân loại một phần nhỏ MAPCODE của mình, giống như ba trong số chúng. Sau đó lưu lại phong cách. Sau đó mở tệp kiểu và xem cách nó được định dạng. Sau đó, chỉ cần viết một tập lệnh (in, giả sử, Python) để lặp lại từng dòng tệp MAPCODE của bạn và chuyển đổi nó thành định dạng của tệp kiểu, sau đó bạn có thể áp dụng cho bản đồ của mình. Tôi không biết về một kịch bản hiện có thực hiện điều này và thật không may, tôi đang ở giữa một dự án, vì vậy không có thời gian để tự thực hiện nó ngay bây giờ. Nhưng nếu ai đó có thể lấy nó ra, thật tuyệt khi được đăng lên đây như một câu trả lời :)
R Thiede
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.