QGIS viene con una gran cantidad de marcadores para poder usarlos en nuestros mapas pero siempre hay casos en los que ninguno de estos símbolos se ajustan a la temática de nuestro mapa y una opción es crear un marcador SVG personalizado en Inkscape o en cualquier otro software de diseño gráfico preferido. En QGIS es sencillo añadir los nuevos símbolos a la biblioteca de marcadores.
Pero ¿qué pasa si necesitamos diferentes versiones de un mismo símbolo en el que hay variaciones en el color o en el texto que lleva el marcador? Realizar en Inkscape numerosas variantes del mismo símbolo sería una opción pero si son muchas no sería la más lógica.
Afortunadamente, el SVG dinámico resuelve todo esto.
SVG dinámicos: personalizar gráficos vectoriales a partir de datos
Para afrontar esta situación podemos crear marcadores SVG parametrizables que QGIS reemplazará por valores de color de relleno, contorno, y texto que definamos a posteriori de forma dinámica. Es decir, QGIS hará todo el trabajo por nosotros evitando el engorro de crear un montón de cambios de una misma simbología: podremos personalizar cualquier parte de un SVG con los atributos de una capa.
Para ello vamos a utilizar Inkscape, un editor profesional de gráficos vectoriales gratuito y de código abierto que puedes aprender a utilizar en nuestro curso. Inkscape tiene todas las funciones y herramientas requeridas para crear cualquier simbología que necesitamos para nuestros mapas. Veremos cómo a crear y editar estos marcadores personalizables con Inkscape y cómo importarlos y representarlos de forma dinámica en QGIS.
Creación de simbología en Inkscape
Para este ejemplo tengo la intención de realizar una simbología utilizando los modelos de placa que se utilizan en las señales de hitos kilométricos de la red de carreteras en España. Utilizaré un único modelo de gráfico SVG creado en Inkscape al que aplicaré una parametrización que me permita realizar en QGIS infinitas combinaciones de color y texto en la señal. Para que el ejemplo no se haga largo me centraré solo en la señalización para carreteras nacionales y autonómicas.

Abrimos Inkscape y dibujamos el símbolo de una única señal usando las herramientas de dibujo que nos proporciona Inkscape. No te preocupes por el tamaño de tu dibujo pero sí es importante asegurarse de alinear al centro de la página.
Con Inkscape no es necesario indicar antes el tamaño de la página en las propiedades del documento ya que existe una forma rápida que ajusta las dimensiones de esta a la selección que tenemos hecha en nuestro lienzo. Para ello, seleccionamos todas las formas y textos que componen nuestro símbolo y vamos al menú Edición > Ajustar la página a la selección.

Hemos creado una plantilla del símbolo con textos, colores y formas de ejemplo y se ha ajustado la página al tamaño del marcador de mapa. El siguiente paso será guardar el dibujo en un archivo SVG.
SVG es la abreviatura de Simple Vector Graphics, un formato abierto y estándar para guardar y compartir gráficos vectoriales. Cuando guardamos nuestra composición en Inkscape el programa por defecto lo hace en una versión de SVG con propiedades añadidas por Inskcape que amplían las capacidades del formato. No obstante, estas propiedades ampliadas al formato SVG aún no forman parte oficialmente del estándar por lo que en nuestro caso es más recomendable guardar la composición gráfica en el formato «SVG plano» que también ofrece el programa.
Convirtiendo a un SVG dinámico
Ya tenemos nuestro marcador listo para usarlo en QGIS. Sin embargo, hay un ‘pero’: QGIS no puede editar el color de relleno y el color del trazo ni puede leer el ancho del trazo que queda guardado en nuestro archivo SVG. Tampoco podemos modificar los texto que hemos incluido en la simbología. Por lo tanto, estamos trabajando con una simbología estática ya que QGIS aún no nos da la opción de editar ninguna de las propiedades anteriores en el símbolo.
Lo que queremos evitar es repetir todos los pasos anteriores cada vez que queramos cambiar el tamaño, el color o texto del símbolo. Esto puede ser una tarea tediosa si hay muchas variantes de nuestro símbolo y por lo tanto no es una opción.
Para que el marcador SVG sea editable de forma dinámica en QGIS debemos modificar algo el código del archivo SVG. Lo podemos realizar en un editor de texto como Notepad ++ o incluso dentro del propio Inkscape. Porque si no lo sabías con Inkscape tenemos la capacidad de navegar por el árbol de nodos que compone nuestro archivo SVG y editar las propiedades de los parámetros.

Podemos cambiar los atributos de un marcador SVG que hayamos creado y si añadimos los marcadores de posición param(fill) modificaremos el color de relleno, con param(outline) cambiaremos el color del trazo y con param(outline-width) el ancho del trazo. Estos marcadores de posición pueden ir seguidos opcionalmente de un valor por defecto. Observa en el ejemplo cómo se ha modificado el atributo fill (color de relleno), donde se añadió param(fill) seguido de un código hexadecimal de color que he incluido de forma predeterminada (#ff0000):
<path
id="rect4804"
fill="param(fill) #ff0000"
stroke="#fe870a"
stroke-width="0.4688"
d="M -327.17737,375.807 H 30.024632 c 23.936,0 43.203,19.27 43.203,43.203 v 602.372 c 0,23.936 -19.269,43.203 -43.203,43.203 H -327.17737 c -23.936,0 -43.203,-19.269 -43.203,-43.203 V 419.01 c 0,-23.935 19.269,-43.203 43.203,-43.203 z"
style="display:inline" />
Configuración de la simbología en QGIS
De esta manera he parametrizado el SVG para que QGIS cambie el color de la placa de señalización según el código de color que está almacenado en la columna «color_placa» de la tabla de atributos de la capa. En la configuración de simbología de QGIS señalamos que el color de relleno se establezca de acuerdo al valor almacenado en la columna.

Además, desde la versión 3.22 de QGIS ya podemos parametrizar el SVG de una forma aún más libre usando param(nombre del parámetro). ‘Nombre del parámetro’ hará referencia a un atributo de la capa o una expresión definida en la columna ‘Expresión’ de la tabla de la sección Dynamic SVG parameters que encontramos dentro de las opciones de configuración de simbología. En este código de ejemplo modificamos un texto en el SVG para que con param(text1) se muestre la referencia de la carretera a la que pertenece la señal y además con param(color_texto) que cambie el color del texto según la normativa establecida para cada tipo de placa.
style="fill:param(color_texto) #000000;fill-opacity:1;">param(text1)
Lo mismo podemos hacer para cambiar el texto según el valor de punto kilométrico guardado.
Con todo esto, ya podemos tener en QGIS una representación dinámica de la simbología a partir de un solo marcador SVG creado en Inkscape.

Muchas gracias por el excelente aporte. Tengo un problema con el Qfield y es que, por más que hago símbolos geológicos personalizados en SVG y se muestran correctamente en QGIS, a la hora de sincronizarlos o subirlos a la nube de QField y mostrarlos en el celular, estos aparecen como signos de interrogación «?». ¿QField es incompatible con la simbología basada en SVG o hay alguna forma de solucionar ese problema?
Muchas gracias.
Buenas tardes, ¿podrían indicarme cómo añadir símbolos SVG a través del programa QGIS? Me refiero a unos distintos a los que ya trae instalados; me gustaría incluir en mi proyecto símbolos numéricos dentro de un círculo pues se trata de un mapa con fines turísticos. Gracias de antemano,
Un saludo
María Jesús, en tu caso y por lo que entiendo en tu mensaje es posible que te interese más aplicar un etiquetado con un círculo de fondo.
En las propiedades de la capa selecciona «Etiquetas» y en «Fondo» elije la forma «Círculo». En la configuración del fondo introduce el tamaño fijo del círculo y el color.
Poemos hacer que el símbolo rote en función de la posición de una línea? Tengo una red eléctrica y necesito que el símbolo sea siempre perpendicular a dicha linea
Ricardo lo pudiste solucionar ?. Tengo casi el mismo problema.
Desde la calculadora de campos puedes utilizar la función «azimuth»:
degrees(azimuth(start_point($geometry), end_point($geometry)))
Con ella obtienes el ángulo de la línea con respecto al norte. Después puedes calcular el grado de rotación que debería tener cada símbolo para que se muestre en una posición perpendicular a la línea.