7 votos

¿Cómo crear un archivo de estilo para QGIS a partir de un archivo de texto plano?

Utilizando QGIS 1.7.

Tengo un archivo de texto plano, que enumera 115 valores rgb contra un código de mapa para un mapa geológico. Viz.:

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

¿Existe alguna herramienta para generar un archivo de estilo QGIS a partir de esto? ¿Qué parte de la declaración de estilo completa se requiere? Tengo muy poco conocimiento de scripting.

Aquí hay una sección de un archivo de estilo con opciones de relleno de color al azar:

<symbol>
  <lowervalue>Daw</lowervalue>
  <uppervalue>Daw</uppervalue>
  <label></label>
  <pointsymbol>hard:circle</pointsymbol>
  <pointsize>2</pointsize>
  <pointsizeunits>pixels</pointsizeunits>
  <rotationclassificationfieldname></rotationclassificationfieldname>
  <scaleclassificationfieldname></scaleclassificationfieldname>
  <symbolfieldname></symbolfieldname>
  <outlinecolor red="0" blue="0" green="0"/>
  <outlinestyle>SolidLine</outlinestyle>
  <outlinewidth>0.26</outlinewidth>
  <fillcolor red="215" blue="97" green="224"/>
  <fillpattern>SolidPattern</fillpattern>
  <texturepath></texturepath>
</symbol>

Si puedo salirme con la mía

<symbol>
  <lowervalue>Daw</lowervalue>
  <uppervalue>Daw</uppervalue>
  <fillcolor red="215" blue="97" green="224"/>
</symbol>

y de alguna manera fusionar el resto, entonces probablemente pueda hacerlo en una hoja de cálculo.

Ben.

2voto

axk Puntos 2147

Una solución sería (no tengo ni idea de cómo se podría lograr esto con herramientas GUI):

cat gsv1Msymbology.txt | grep -v MAPPCODE | while read line
do
echo $line | awk -F" " '{print "<symbol>\n\t<lowervalue>" $1 "</lowervalue>\n\t<uppervalue> " $1 "</uppervalue>\n\t<fillcolor red=\"" $2 "\" blue=\"" $3 "\" green=\"" $4 "\"/>\n</symbol>"}'
done

Esto produce:

diciu$ cat gsv1Msymbology.txt | grep -v MAPPCODE | while read line
> do
> echo $line | awk -F" " '{print "<symbol>\n\t<lowervalue>" $1 "</lowervalue>\n\t<uppervalue> " $1 "</uppervalue>\n\t<fillcolor red=\"" $2 "\" blue=\"" $3 "\" green=\"" $4 "\"/>\n</symbol>"}'
> done
<symbol>
    <lowervalue>Oc</lowervalue>
    <uppervalue> Oc</uppervalue>
    <fillcolor red="143" blue="255" green="255"/>
</symbol>
<symbol>
    <lowervalue>WAT</lowervalue>
    <uppervalue> WAT</uppervalue>
    <fillcolor red="255" blue="255" green="255"/>
</symbol>

La lógica detrás de esto es:

  • eliminar la línea de cabecera (grep -v)
  • para todas las demás líneas, léalas de una en una
  • ejecute awk en cada línea con el separador de campos establecido en " " -> esto significa que su primer campo (valor) es $1, the second is the red component ($ 2), y así sucesivamente.
  • imprimir el fragmento XML sustituyendo los marcadores de posición por los valores reales

El resto de la sección de estilo va como texto plano en la línea awk, igual que el resto (no es muy legible, lo sé):

diciu$ cat gsv1Msymbology.txt | grep -v MAPPCODE | while read line; do echo $line | awk -F" " '{print "<symbol>\n\t<lowervalue>" $1 "</lowervalue>\n\t<uppervalue> " $1 "</uppervalue>\n\t<label></label>\n\t<pointsymbol>hard:circle</pointsymbol>\n\t<pointsize>2</pointsize>\n\t<pointsizeunits>pixels</pointsizeunits>\n\t<rotationclassificationfieldname></rotationclassificationfieldname>\n\t<scaleclassificationfieldname>\n\t</scaleclassificationfieldname>\n\t<symbolfieldname></symbolfieldname>\n\t<outlinecolor red=\"" $2 "\" blue=\"" $3 "\" green=\"" $4 "\"/>\n\t<outlinestyle>SolidLine</outlinestyle>\n\t<outlinewidth>0.26</outlinewidth>\n\t<fillcolor red=\"" $2 "\" blue=\"" $3 "\" green=\"" $4 "\"/>\n\t<fillpattern>SolidPattern</fillpattern>\n\t<texturepath></texturepath>\n</symbol>"}'; done | head -n 18
<symbol>
    <lowervalue>Oc</lowervalue>
    <uppervalue> Oc</uppervalue>
    <label></label>
    <pointsymbol>hard:circle</pointsymbol>
    <pointsize>2</pointsize>
    <pointsizeunits>pixels</pointsizeunits>
    <rotationclassificationfieldname></rotationclassificationfieldname>
    <scaleclassificationfieldname>
    </scaleclassificationfieldname>
    <symbolfieldname></symbolfieldname>
    <outlinecolor red="143" blue="255" green="255"/>
    <outlinestyle>SolidLine</outlinestyle>
    <outlinewidth>0.26</outlinewidth>
    <fillcolor red="143" blue="255" green="255"/>
    <fillpattern>SolidPattern</fillpattern>
    <texturepath></texturepath>
</symbol>

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X