Posición de etiqueta definida por datos para más de una escala en una capa

9

Estoy buscando una mejor solución de etiquetado para mis proyectos. Parece ser difícil, pero ¿tal vez solo soy ciego?

Mis proyectos: construyo libros impresos de bicicleta-caminata. La escala principal es 1: 75k y hay una escala de ciudad de 10k y una escala general de 200k. Como me gusta tener una calidad "cartográfica" de las ubicaciones de las etiquetas, toco cada etiqueta y la muevo a su mejor posición. Tengo que hacer esto para cada escala para que mis columnas de etiquetado para 3 escalas se vean así ('escala 1' significa 10k 'escala 2' para 75k y 'escala 3' para 200k):

ingrese la descripción de la imagen aquí

Pero antes de intentar explicarlo en detalle, construyo este proyecto de ejemplo simple donde puede ver y probar mi (antigua) solución de etiquetado para 3 escalas: http://www.map-site.de/tmp/LabelingExample.zip

Bueno, está funcionando pero:

  • Necesita columnas de etiquetado para cada escala
  • Necesitas una capa para cada escala

Estoy buscando una solución mucho mejor sin capas duplicadas y toneladas de columnas. ¡Cuento con tus mentes creativas!

EDITAR: agregué estos dos mapas muy densos como ejemplos:

ingrese la descripción de la imagen aquí

Solo hay una única posición posible para "St. Paulus Dom" y no es ningún cuadrante: ingrese la descripción de la imagen aquí

Cada etiqueta tiene que ser movida manualmente. Algunas de las etiquetas no están en un cuadrante.

MAPA
fuente
¿Las etiquetas deben cumplir algunos criterios específicos? No entiendo lo que quieres decir con "mejor posición".
mgri
1
Con "mejor posición" me refiero a una posición de acuerdo con las afirmaciones cartográficas. Es mas subjetivo.
MAPA
2
Descubrí que su ejemplo usa una fuente, 'Noto Sans', que no tengo, y supongo que ese será el caso para otros también. Puede descargar la fuente aquí google.com/get/noto Después de instalar las fuentes, debe reiniciar QGIS.
TJ Rockefeller
Gracias por agregar ese enlace: es la fuente estándar de mi instalación de Mint.
MAPA

Respuestas:

6

Tengo que decir que lo que está solicitando es un poco complicado porque desea que el etiquetado sea visible a pequeña escala claramente así como a gran escala (mejor ajuste). Entonces, la idea aquí es cómo colocar el punto que puede ser visible a diferentes escalas.

Después de varias pruebas, descubrí que en lugar de crear varias columnas para cada rango de escala y poner coordenadas para x e y en puntos fijos, puede crear solo una columna para posiciones de prioridad para cada punto para la mejor ubicación, como puede ver a continuación (I seguido las ubicaciones en su archivo):

ingrese la descripción de la imagen aquí

Luego, vas a Layer propoerties -> Labels -> Placement -> Offset from pointo Around point, ambos están bien, pero elegí Offset from point.

  1. En QuadrantSeleccionar Data defined override -> Edit, e ingrese la siguiente fórmula:

    ingrese la descripción de la imagen aquí

    CASE 
    WHEN  $scale >= 200000 THEN  "priority"  
    WHEN  $scale < 200000 and $scale >= 75000 THEN  "priority"   
    WHEN  $scale < 75000 and $scale >=10000 THEN  5
    WHEN  $scale < 10000 THEN 2 
    END
    

    Aquí "Priority"está la ubicación de los puntos definidos en el nombre del campo.Priority

  2. Necesita usar el desplazamiento para cambiar los puntos para una mejor visibilidad, y utilicé la siguiente fórmula:

    CASE
    WHEN  $scale >= 200000 THEN '0.001,0'
    WHEN  $scale < 200000 and $scale >= 75000 THEN '0.001,0'
    WHEN  $scale < 75000 and $scale >=10000 THEN '0.0005,0'
    WHEN  $scale < 10000 THEN '0.0001,0'
    END
    

Aquí está la salida a diferentes escalas:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Para ver qué representa cada número [0-8] en qué ubicación, eche un vistazo a la siguiente imagen:

ingrese la descripción de la imagen aquí

Puede controlar la posición de las etiquetas agregando el valor correspondiente a cada posición. Pero desafortunadamente, no puede hacerlo con el enfoque de "hacer clic y mover". Debe hacerlo en la tabla de atributos.

Actualizar:

Según su requisito de que 9 posiciones de cuadrante no son suficientes, descubrí que si selecciona en Cartographylugar de Offset from point, y selecciona prioridad, como en la imagen a continuación, tendrá 12 posiciones de prioridad en lugar de 9. Necesita crear un campo de Texttipo, luego ponga solo la abreviatura que desee para la mejor posición 'TL', 'TSL', 'T' ... etc. Además, puede ingresar una distancia para evitar que la etiqueta cubra el punto.

ingrese la descripción de la imagen aquí

ahmadhanb
fuente
Es un enfoque que no intenté hasta ahora. ¿Ves alguna forma de colocar la etiqueta en el cuadrante haciendo clic y moviéndote?
MAPA
Desafortunadamente, no puede hacerlo con el enfoque de "hacer clic y mover". Debe hacerlo en la tabla de atributos. Pero agregar 1 columna es mejor que 6 columnas para cada nivel de escala x, y. Actualicé mi respuesta.
ahmadhanb
1
En los últimos días, también traté de dar una solución, pero me di por vencido porque pensé que el problema era demasiado subjetivo para ofrecer una solución más general. En cambio, la solución de @ahmadhanb parece lo suficientemente creativa como para hacerlo (aunque no lo probé ). +1 para mí
mgri
Estoy de acuerdo contigo. La subjetividad aquí es alta. Es principalmente una opinión personal sobre cómo puede juzgar la ubicación de las etiquetas si son adecuadas o no.
ahmadhanb
1
No use la herramienta de identificación para editar las ubicaciones prioritarias, es mejor usar la herramienta de selección. Abra la tabla de atributos y elija solo mostrar los puntos seleccionados. Comience la sesión de edición, actualice la ubicación y guarde las ediciones. La ubicación de prioridad se actualizará directamente, si ya agregó la expresión en la anulación definida de datos.
ahmadhanb
2

Puedes deshacerte de las múltiples capas usando expresiones.

Por lo que pude ver en su ejemplo, la principal diferencia entre las capas son las Data defined Coordinate X Ydefiniciones que apuntan a los diferentes valores de escala x, y.

Puede lograr esto en una sola capa seleccionando los menús desplegables junto a X e Y y seleccionando editar ... lo que abrirá un generador de cadenas de expresión.

Para X puedes usar algo como

if(@map_scale <=10000, "scale1-x", if(@map_scale <=75000, "scale2-x", "scale3-x"))

Y para Y puedes usar algo como

if(@map_scale <=10000,  "scale1-y" , if(@map_scale <=75000, "scale2-y", "scale3-y"))

Esto debería usar valores scale1 x, y si la escala del mapa es menor o igual a 1: 10,000 y escala 2 x, y si la escala del mapa es menor o igual a 1: 75,000 y escala 3 x, y para cualquier cosa por encima de eso .

Si tiene que posicionarse manualmente para cada escala, no veo cómo puede alejarse de las columnas escala # -x y escala # -y para cada nivel que haya definido.

TJ Rockefeller
fuente
Tengo un alto destino de etiquetas con diferente peso. Tengo que colocarlos manualmente, ya que ningún automatismo puede hacerlo de una manera cartográfica 'real'. Y los mapas se imprimirán y actualizarán cada año, por lo que el etiquetado debe ser algo estático. en.wikipedia.org/wiki/Cartographic_labeling#Placement
MAPA
@MAP OK, para que sepa que tiene que colocar los elementos manualmente, solo quiere menos capas y columnas.
TJ Rockefeller
Esto ayuda a mostrar las etiquetas de 3 escalas con solo una capa. Pero QGIS no es capaz de "escribir" las coordenadas a través de la expresión. Entonces, si uso la expresión de escala como mencionaste, ya no puedo mover las etiquetas.
MAPA