Estou tentando criar um mapa para imprimir e o tamanho dos meus polígonos varia muito. Como esse será um mapa de referência, preciso rotular todos os polígonos, mas alguns dos nomes não cabem no polígono. Nesses casos, eu gostaria de usar o ID do recurso e, em seguida, fazer com que uma tabela de atributos vincule o ID ao nome.
O que eu gostaria de fazer é ter algum tipo de expressão que eu possa usar para selecionar qual rótulo usar no mapa e quais linhas incluir na tabela de atributos. Algo assim isLabelled
seria capaz de levar em consideração a escala do mapa, o tamanho da etiqueta, o tamanho da fonte etc.
qgis
labeling
print-composer
qgis-custom-function
Ian Turton
fonte
fonte
Respostas:
Aqui está uma maneira aproximada (mas espero que eficaz) de fazer isso.
Primeiro um pouco de matemática. Precisamos descobrir quantos caracteres em um determinado tamanho de fonte um recurso pode conter. Aqui, coisas / suposições a saber:
Para descobrir quanto tempo um item está na tela / impressão, podemos usar a sua dimensão mais longa (comprimento ou altura, ou apenas se as etiquetas forem horizontais) / escala * 100 (para passar de M para CM)
Então podemos ver se nosso rótulo se encaixaria.
Você pode fazer tudo isso no mecanismo de expressão, mas uma expressão python personalizada seria mais eficiente. Aqui está um tutorial sobre como criar um.
Minha expressão personalizada:
Em seguida, basta usar essa expressão no rótulo:
Você precisará conectar qualquer atributo que esteja usando, é claro, e alterar o tamanho da fonte de 8 para o que estiver usando. Além disso, como as fontes variam bastante, talvez você precise ajustá-las um pouco até que pareça correta.
Você também pode usar essa expressão para fazer coisas como mudar a cor com base se o rótulo se encaixa ou não.
Para usar essa expressão fora da tela do mapa (ou seja, em um rótulo do compositor ou em uma tabela de atributos), precisamos de uma maneira de obter programaticamente a escala de um determinado item do mapa. Eu publiquei o código para fazer isso em outra resposta aqui. O método nos fornece uma expressão getScale ('composername', 'mapname') para incorporá-lo à nossa expressão:
fonte
Duplique a camada, uma sem simbologia, e defina diferentes níveis de zoom / configurações de obstáculos para os rótulos de cada uma.
fonte
Eu tive uma situação semelhante com a obrigação de rotular todas as estradas em uma camada de estrada. Minha solução foi criar a tela em um tamanho maior, exportar para PDF e depois imprimi-lo no tamanho necessário.
Por exemplo, era necessário que o produto final fosse A3. Na tela do A3, eu não conseguia encaixar todas as etiquetas. Então eu fiz a tela A2 e isso permitiu que todos os rótulos fossem vistos. Crie um PDF do mapa de tamanho A2 e imprima-o como A3.
fonte