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
언더 다크

다음 질문에 대한 답변 및 솔루션보기 : gis.stackexchange.com/questions/15185/…
다른 벤

이것은 데이터 정의 심볼로 gigi.stackexchange.com/questions/60450/…
AndreJ

답변:


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>

RGB 열이 있는 shapefile에 shapefile 모듈 ([shapefile]) 1 을 사용할 수도 있습니다.

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
앤디는 공을 가지고있다. 수백 개의 MAPCODE가 있습니다. 그리고 네, 수동으로 수행하는 방법을 알고 있습니다.
다른 벤

아, 알겠습니다 이 경우 MAPCODE의 세 부분과 같이 작은 부분 만 분류 할 수 있습니다. 그런 다음 스타일을 저장하십시오. 그런 다음 스타일 파일을 열고 형식이 어떻게되어 있는지보십시오. 그런 다음 MAPCODE 파일을 한 줄씩 반복하여 스크립트를 작성하여 스타일 파일 형식으로 변환하면 맵에 적용 할 수 있습니다. 나는 이것을하는 기존의 스크립트를 알지 못하지만 불행히도 나는 프로젝트의 한가운데에 있으므로 지금 직접 할 시간이 없습니다. 그러나 누군가 그것을 뽑을 수 있다면, 여기에 답변으로 게시하는 것이 좋을 것입니다 :)
R Thiede
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.