¿Usa el mapeo de campo a RGB para simbología en QGIS?

10

Usando QGIS versión 1.7.

Tengo un archivo de texto sin formato que enumera un conjunto de valores rgb contra un código. Quiero usar esta tabla de colores para colorear una capa de polígono asignando uno de sus campos de atributos ('map_symb') a un código en el archivo de texto.

la tabla de colores es muy larga y se ve así:

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

Quiero hacer coincidir mi atributo 'map_symb' con un valor en MAPCODE, y usar los valores RGB correspondientes para colorear los polígonos.

¿Hay una manera gui de hacer esto?

un ben diferente
fuente
1
He presentado una solicitud de función para esto: hub.qgis.org/issues/4339
underdark
Vea esta pregunta y respuestas para obtener soluciones: gis.stackexchange.com/questions/15185/…
a ben diferente el
Esto se implementa a partir de QGIS 2.0 en adelante como simbología de datos definidos: gis.stackexchange.com/questions/60450/…
AndreJ

Respuestas:

10

Puede usar Python con el módulo 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()

El archivo de estilo generado por este script es (y funciona):

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

También puede usar el módulo shapefile ([shapefile]) 1 para shapefiles con columnas 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

y entonces...

gene
fuente
14

En una versión posterior de QGIS es más fácil realizar la tarea solicitada.

Simplemente abra Propiedades de capa, pestaña Estilo y asegúrese de que esté seleccionado Símbolo único. Haga clic en el cuadro junto al color "Relleno" y elija "Editar".

Editará el color base de sus bases poligonales en colores RGB presentes en la tabla de datos, con un color de borde constante (puede aplicar el mismo criterio si es necesario).

Después de presionar "Editar" simplemente ponga los 3 nombres de columnas RGB de su tabla usando la siguiente expresión:

color_rgb ("columna R", "columna G", "columna B")

Ok, aplica y listo.

Si necesita etiquetar y caracterizar los datos de la misma manera (por ejemplo, para construir una leyenda), simplemente use la opción Categorizada y aplique la misma expresión al Símbolo y a la Columna, identificados en la imagen de abajo.

ingrese la descripción de la imagen aquí

zemigl
fuente
5

Si desea clasificar algunos datos vectoriales de forma repetible, esto es lo que puede hacer:

  • Cargue su vector en QGIS.
  • Haga clic derecho en la capa en el panel "Capas" en el lado izquierdo de la pantalla.
  • Haga clic en "Propiedades" en el menú que aparece.
  • Haga clic en la pestaña "Estilo" en la ventana que aparece.
  • Debería haber un elemento de la lista desplegable en la pantalla que diga "Símbolo único". Haga clic en él y cambie su valor a "Categorizado".
  • El diseño de la interfaz cambiará, ofreciéndole una nueva opción denominada "Columna". Haga clic en él y seleccione el campo "map_symb".
  • Haga clic en el botón "Clasificar" debajo del campo vacío grande. El campo vacío se completará con el contenido de la columna "map_symb" en su conjunto de datos.
  • Haga doble clic en los símbolos que desea cambiar. En la ventana que aparece, haga clic en el botón "Cambiar".
  • Esto le permite cambiar el color para el valor de atributo dado.
  • Siga haciendo esto hasta que haya cambiado los colores según sea necesario.
  • Cuando haya terminado, puede guardar el estilo haciendo clic en el botón "Guardar estilo ...". Esto le permitirá aplicar el mismo estilo a cualquier otro conjunto de datos, simplemente haciendo clic en "Cargar estilo ..." cuando se encuentre en esta misma ventana. Esto puede ser lo que estaba tratando de lograr al vincular el archivo de texto con el conjunto de datos, lo que no es posible AFAIK. Sin embargo, una vez que haya guardado el estilo, podrá usarlo en los siguientes conjuntos de datos (suponiendo que tengan los mismos valores de atributo). Si abre el archivo de guardar el estilo, verá que es solo texto sin formato, que puede editar si lo desea. Por supuesto, es posible escribir este archivo usted mismo en cualquier editor de texto, pero es más rápido y fácil hacerlo a través de la GUI.
  • Haga clic en "Aplicar" para ver los cambios y en "Aceptar" para cerrar la ventana Propiedades de capa.
R Thiede
fuente
1
Parece mucho trabajo cuando el OP ya tiene una tabla de los colores deseados. ¿Hay alguna forma de pasar de la tabla original a cuál es el formato "Guardar estilo" directamente?
Andy W
1
En realidad es fácil. Así es como normalmente clasifica los datos vectoriales en cualquier SIG. Estoy comenzando con un lienzo en blanco y describiendo cada clic del mouse, solo para evitar confusiones. Por supuesto, puede escribir su especificación de color en el formato Estilo desde el principio. Es simple y bastante legible para los humanos. Pero eso no es muy portátil, y no funcionará si haces un error tipográfico. Solo hazlo con la GUI. Una vez que haya guardado el archivo de Estilo, puede modificarlo en un editor de texto y ahorrarse el dolor de cabeza de navegar por una GUI.
R Thiede
1
Andy lo tiene por las bolas; Hay cientos de MAPCODE. Y sí, sé cómo hacerlo manualmente.
un ben diferente
Ah, ya veo. Bueno, en ese caso, es posible que desee clasificar solo una pequeña parte de sus MAPCODE, como tres de ellos. Luego guarda el estilo. Luego abra el archivo de estilo y observe cómo está formateado. Luego, simplemente escriba un script (en, digamos, Python) para iterar a través de su archivo MAPCODE línea por línea, y conviértalo al formato del archivo de estilo, que luego puede aplicar a su mapa. No conozco un script existente que haga esto y desafortunadamente estoy en medio de un proyecto, así que no tengo tiempo para hacerlo yo mismo ahora. Pero si alguien pudiera lograrlo, sería bueno publicarlo aquí como respuesta :)
R Thiede