Solución:
No creo que haya una forma de hacer esto en el lienzo del mapa en sí. Las etiquetas siempre estarán en la parte superior al menos en QGIS 2.x.
Pero para el compositor de impresión, puede trabajar con dos mapas. Deben estar en el mismo lugar y colocarse uno encima del otro. La de abajo tendría las etiquetas y no tendría características visibles y las de arriba las características de vector sin etiquetas.
Un ejemplo de similar se puede ver a continuación. Donde la parte inferior del mapa tiene las etiquetas sobre el cuadro de inserción del mapa (que siempre estará en la parte superior). Esto se hizo teniendo el mapa con el cuadro debajo de un mapa con las etiquetas:
Aquí hay un enfoque que podría ser útil, pero de alguna manera carece de la gran flexibilidad de diseñar etiquetas directamente en QGIS.
Este enfoque hace uso de
- la capacidad de hacer scripts personalizados de QGIS y
- la capacidad de ‘anular los datos definidos’ todo en QGIS
Realice los siguientes pasos:
Diseñe las etiquetas que desee en Inkscape.
Si solo tiene una (muy) pequeña cantidad de valores de atributo para etiquetar, puede considerar diseñar una etiqueta para cada valor [DN 100
, DN 200
, … in my example]. De lo contrario, para algunas decenas o cientos de valores de atributo en las etiquetas, o si estos cambian con frecuencia, no sería un gran desafío escribir un script de Python personalizado, que cree un archivo * .svg para cada valor de atributo simplemente reemplazando la ocurrencia de texto para los valores de los atributos directamente en el archivo svg:
Fragmento de código de ejemplo (observe la última línea):
[...]
<text
xml:space="preserve"
style="font-size:74.06057739px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#333333;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
x="184.23111"
y="255.53072"
id="text3755"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3757"
x="184.23111"
y="255.53072">DN 300</tspan></text>
[...]
En mi ejemplo, el ancho del rectángulo de fondo blanco también debe ajustarse, teniendo en cuenta la longitud variable del texto del atributo.
Tenga en cuenta que los archivos svg resultantes deben nombrarse de acuerdo con los valores de los atributos, algo así como 300.svg
, 200.svg
o 80.svg
en mi ejemplo.
En los estilos de QGIS, agrego una línea de marcador a los estilos de mi capa y la configuro como se muestra a continuación (tenga en cuenta el botón ‘expresión’ justo al lado de la ruta svg):
Una expresión que depende del valor del atributo permite a QGIS seleccionar el archivo svg correcto para cada valor (creo que incluso es posible ejecutar una función personalizada que crea los archivos svg directamente desde el editor de expresiones, pero no jugué con ese…):
El resultado se muestra en la captura de pantalla a continuación, observe la ‘etiqueta’ cerca del centro del mapa: