Posição de etiqueta definida por dados para mais de uma escala em uma camada

9

Estou procurando uma solução de rotulagem melhor para meus projetos. Parece ser difícil - mas talvez eu esteja apenas cego?

Meus projetos: construo livros impressos para caminhadas de bicicleta. A escala principal é 1: 75k e há uma escala da cidade de 10k e uma escala geral de 200k. Como gosto de ter uma qualidade "cartográfica" dos canais das etiquetas, toco em cada etiqueta e a movo para a melhor posição. Eu tenho que fazer isso para cada escala única, para que minhas colunas de rotulação para 3 escalas sejam assim ('escala 1' significa 10k 'escala 2' para 75k e 'escala 3' para 200k):

insira a descrição da imagem aqui

Porém, antes de tentar explicar em detalhes, construo este exemplo-projeto simples, no qual você pode ver e testar minha solução de rotulação (antiga) para três escalas: http://www.map-site.de/tmp/LabelingExample.zip

Bem, está funcionando, mas:

  • Você precisa rotular colunas para todas as escalas
  • Você precisa de uma camada para todas as escalas

Estou procurando uma solução muito melhor sem camadas duplicadas e toneladas de colunas. Conto com suas mentes criativas!

EDIT: Adicionei este mapa muito denso como exemplos:

insira a descrição da imagem aqui

Existe apenas uma única posição possível para "St. Paulus Dom" e não é nenhum quadrante: insira a descrição da imagem aqui

Cada etiqueta deve ser movida manualmente. Alguns dos rótulos não estão no quadrante.

MAPA
fonte
Os rótulos precisam cumprir alguns critérios específicos? Não entendo o que você quer dizer com "melhor posição".
Mgri
11
Com "melhor posição", quero dizer uma posição de acordo com reivindicações cartográficas. É mais subjetivo.
MAP
2
Descobri que seu exemplo usa uma fonte, 'Noto Sans', que não tenho, e acho que será o caso de outras pessoas também. Você pode fazer o download da fonte aqui google.com/get/noto Depois de instalar as fontes, você deve reiniciar o QGIS.
TJ Rockefeller
Obrigado por adicionar esse link - é a fonte padrão da minha instalação do Mint.
MAP

Respostas:

6

Devo dizer que o que você está solicitando é um pouco complicado, porque você deseja que a rotulagem seja visível em pequena escala de forma clara e em larga escala (melhor ajuste). Então, a idéia aqui é como colocar o ponto que pode ser visível em diferentes escalas.

Após vários testes, descobri que, em vez de criar várias colunas para cada intervalo de escala e colocar coordenadas para x e y em pontos fixos, você pode criar apenas uma coluna para posições prioritárias para cada ponto para obter a melhor localização, como você pode ver abaixo (I seguiram os locais no seu arquivo):

insira a descrição da imagem aqui

Então você vai para Layer propoerties -> Labels -> Placement -> Offset from pointou Around point, ambos estão bem, mas eu escolhi Offset from point.

  1. Em QuadrantSelecionar Data defined override -> Edite insira a seguinte fórmula:

    insira a descrição da imagem aqui

    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
    

    Aqui "Priority"está a localização dos pontos definidos no nome do campoPriority

  2. Você precisa usar o deslocamento para mudar os pontos para obter melhor visibilidade, e eu usei a seguinte 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
    

Aqui está a saída em diferentes escalas:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Para ver o que cada número [0-8] representa em qual local, dê uma olhada na seguinte imagem:

insira a descrição da imagem aqui

Você pode controlar a posição dos rótulos adicionando o valor correspondente a cada posição. Infelizmente, você não pode fazê-lo usando a abordagem "clique e mova". Você precisa fazer isso na tabela de atributos.

Atualizar:

Com base em sua exigência de que 9 posições no quadrante não sejam suficientes, descobri que se você selecionar em Cartographyvez de Offset from pointe selecionar prioridade, como na imagem abaixo, você terá 12 posições prioritárias em vez de 9. Você precisa criar um campo do Texttipo coloque apenas a abreviação que você deseja para a melhor posição 'TL', 'TSL', 'T' ... etc. Além disso, você pode inserir uma distância para evitar que a etiqueta cubra o ponto.

insira a descrição da imagem aqui

ahmadhanb
fonte
Essa é uma abordagem que eu não tentei até agora. Você vê alguma maneira de colocar o rótulo no quadrante por 'clicar e mover'?
MAP
Infelizmente, você não pode fazer isso usando a abordagem "clique e mova". Você precisa fazer isso na tabela de atributos. Mas adicionar 1 coluna é melhor que 6 colunas para cada nível de escala x, y. Eu atualizei minha resposta.
ahmadhanb 28/02
11
Nos últimos dias, também tentei dar uma solução, mas desisti porque achava que o problema era subjetivo demais para oferecer uma solução mais geral. Em vez disso, a solução de @ahmadhanb parece criativa o suficiente para fazê-lo (embora eu não testei). +1 para mim.
MGRI
Eu concordo com você. A subjetividade aqui é alta. É principalmente uma opinião pessoal sobre como você pode julgar os locais dos rótulos, se eles são adequados ou não.
21417 ahmadhanb
11
Não use a ferramenta de identificação para editar os locais prioritários, é melhor usar a ferramenta de seleção. Abra a tabela de atributos e escolha apenas mostrar os pontos selecionados. Comece a editar a sessão, atualize o local e salve as edições. O local da prioridade será atualizado diretamente, se você já tiver adicionado a expressão na substituição Dados definida.
precisa saber é
2

Você pode se livrar das várias camadas usando expressões.

Pelo que pude ver no seu exemplo, a principal diferença entre as camadas são as Data defined Coordinate X Ydefinições que apontam para os diferentes valores de escala x, y.

Você pode fazer isso em uma única camada, selecionando as listas suspensas ao lado de X e Y e selecionando editar ..., o que exibirá um construtor de cadeias de expressão.

Para o X, você pode usar algo como

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

E para Y você pode usar algo como

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

Isso deve usar os valores de scale1 x, y se a escala do mapa for menor ou igual a 1: 10.000 e a escala 2 x, y se a escala do mapa for menor ou igual a 1: 75.000 e a escala 3 x, y para qualquer coisa acima .

Se você precisar posicionar manualmente para cada escala, não vejo como você pode se afastar das colunas da escala # -x e da escala # -y para cada nível que você definiu.

TJ Rockefeller
fonte
Eu tenho um alto destino de etiquetas com peso diferente. Eu tenho que colocá-los manualmente, pois nenhum automatismo é capaz de fazê-lo de maneira cartográfica 'real'. E os mapas serão impressos e atualizados todos os anos, para que a rotulagem seja um pouco estática. pt.wikipedia.org/wiki/Cartographic_labeling#Placement
MAP
@ MAP OK, para que você saiba que precisa posicionar itens manualmente, você quer apenas menos camadas e colunas.
TJ Rockefeller
Isso ajuda a exibir os rótulos de 3 escalas com apenas uma camada. Mas o QGIS não é capaz de "gravar de volta" as coordenadas via expressão. Portanto, se eu usar a expressão de escala como você mencionou, não posso mais mover os rótulos.
MAP