Estoy tratando de crear un mapa para imprimir y el tamaño de mis polígonos varía mucho. Como este será un mapa de referencia, necesito etiquetar cada polígono, pero algunos de los nombres no caben en el polígono. En esos casos, me gustaría utilizar la identificación de la función y luego hacer que una tabla de atributos vincule la identificación con el nombre.
Lo que me gustaría hacer es tener algún tipo de expresión que pueda usar para seleccionar qué etiqueta usar en el mapa y qué filas incluir en la tabla de atributos. Algo así isLabelled
podría tener en cuenta la escala del mapa, la longitud de la etiqueta, el tamaño de la fuente, etc.
qgis
labeling
print-composer
qgis-custom-function
Ian Turton
fuente
fuente
Respuestas:
Aquí hay una forma aproximada (pero con suerte efectiva) de hacerlo.
Primero algo de matemática. Necesitamos averiguar cuántos caracteres en un determinado tamaño de fuente puede contener una característica. Aquí cosas / supuestos para saber:
Para saber cuánto tiempo está un elemento en la pantalla / impresión, podemos usar su dimensión más larga (longitud o altura, o solo longitud si sus etiquetas son solo horizontales) / escala * 100 (para ir de M a CM)
Entonces podemos ver si nuestra etiqueta encajaría.
Podría hacerlo todo en el motor de expresión, pero una expresión personalizada de Python sería más eficiente. Aquí hay un tutorial sobre cómo crear uno.
Mi expresion personalizada:
Luego solo usa esa expresión en la etiqueta:
Necesitará conectar cualquier atributo que esté usando, por supuesto, y cambiar el tamaño de fuente de 8 a lo que esté usando. Además, dado que las fuentes varían bastante, es posible que deba modificarlas un poco hasta que se vean bien.
También puede usar esa expresión para hacer cosas como cambiar el color en función de si la etiqueta se ajusta o no.
Para usar esta expresión fuera del lienzo del mapa (es decir, en una etiqueta de compositor o en una tabla de atributos) necesitamos una forma de obtener mediante programación la escala de un elemento de mapa dado. He publicado código para lograr eso en otra respuesta aquí. El método allí nos da una expresión getScale ('nombre del compositor', 'nombre del mapa') para incorporarlo a nuestra expresión:
fuente
Duplique la capa, una sin simbología, y establezca diferentes niveles de zoom / configuración de obstáculos para las etiquetas para cada una.
fuente
Tuve una situación similar con la obligación de etiquetar cada carretera en una capa de carretera. Mi solución fue crear el lienzo en un tamaño más grande, exportar a PDF y luego imprimir el PDF al tamaño requerido.
Por ejemplo, el producto terminado debía ser A3. En el lienzo en A3 no pude colocar todas las etiquetas. Así que hice el lienzo A2 y eso permitió ver todas las etiquetas. Cree un PDF del mapa de tamaño A2 e imprímalo como A3.
fuente