Evitar recursos de rotulagem se sobreposto por outra camada no QGIS?

16

Com o QGIS 2.12.2, como posso configurar a etiquetagem de camadas para evitar a colocação de etiquetas onde já existem recursos de outra camada?

Por exemplo, se eu tiver uma camada de polilinha de córrego / rio que contenha " linhas de centro" do lago e colocar uma camada de polígono de "lago" acima dela na ordem do desenho, não quero que a camada de rio coloque um rótulo dentro do lago . Em vez disso, prefiro rotular o rio fora do lago (conforme necessário). Dessa forma, posso colocar rótulos da camada de lagos e não encontro colisões de rótulos.

Aqui está um exemplo em que (intencionalmente coloquei as linhas no topo para fins visuais) o que espero alcançar é que nenhum rótulo de linha central do rio seja mostrado dentro do polígono do lago: As linhas são rotuladas dentro do polígono

RyanKDalton
fonte
4
Como seus dados são armazenados e veiculados? Trabalhando com o PostGIS, ficaria tentado a definir meus rios com uma visão, onde as partes dos rios que cruzam os lagos são totalmente cortadas. Uma boa etiquetagem automatizada é um problema difícil, menos a geometria.
alphabetasoup
Esses eram shapefiles, mas sua ideia de mudar para o PostGIS e gerenciar os problemas de dados em tempo real é realmente boa. Sugiro que você mova seu comentário para uma resposta, já que eu poderia argumentar bastante válido que essa é uma boa resolução.
precisa saber é o seguinte

Respostas:

9

A etiquetagem automatizada é um problema muito difícil, mas a geometria dos recursos não é tão ruim.

Mesmo que você consiga que a veiculação funcione adequadamente na maior parte do tempo, é provável que haja exceções. Alguns deles você notará e poderá resolver. Outros que você não notará ao criar um mapa grande ou conjunto de peças, porque você não pode derramar cada centímetro do mapa em uma variedade de escalas. Quase sempre, você tem vontade de mover manualmente algumas etiquetas colocadas automaticamente, de uma perspectiva cartográfica.

Como sugeri no meu comentário, facilitaria o problema para o mecanismo de rotulagem. Nesse caso, eu faria isso definindo meus rios como uma visualização de tabela *, com as geometrias dos rios cortadas para respeitar os limites do lago. Dessa forma, não há características do rio dentro dos lagos a serem rotuladas, nem colisões de rótulos.

* Assumo o uso de um RDBMS aqui, como o PostgreSQL / PostGIS, por conveniência e a capacidade de atualizar apenas sua fonte de dados autorizada e fazer com que a visualização funcione sem a sua intervenção. Mas você também pode trabalhar antecipadamente com arquivos estáticos para recortar e excluir recursos, mas eu não recomendo isso se você planeja revisitar um mapa.

Exemplo:

Começando com dois shapefiles (podem ser tabelas de banco de dados) de rios e lagos, com rios cruzando lagos e causando problemas de rotulagem difíceis de resolver de maneira completa e confiável:

insira a descrição da imagem aqui

Traga-os para o Postgres, se necessário, com o shp2pgsql :

shp2pgsql -s 4326 /data/lake public.lakes | psql -d mydb

shp2pgsql -s 4326 /data/river public.rivers | psql -d mydb

Em seguida, defina uma visualização com ST_Difference :

CREATE OR REPLACE VIEW rivers_clipped AS
SELECT r.id, ST_Difference(r.geom, l.geom) AS geom, r.name
FROM public.rivers AS r, public.lakes AS l;

Adicione a visualização ao seu layout:

insira a descrição da imagem aqui

Embora o problema no meu exemplo seja deliberadamente fabricado, os estilos nas duas camadas do rio (original e vista) são os mesmos e são colocados no topo do lago na ordem do desenho. Ao atualizar as geometrias de lagos ou rios, você não precisará fazer muito mais do que atualizar a renderização.

insira a descrição da imagem aqui

alphabetasoup
fonte
2
Embora eu não estivesse trabalhando diretamente com uma camada de banco de dados, essa solução fazia mais sentido para mim, pois não exigia a edição da geometria das fontes de dados iniciais (além de carregá-las no banco de dados). Este é um ótimo exemplo de pensar fora da caixa de shapefiles e limitações de aplicativos e encontrar uma solução criativa para o problema combinando a lógica do aplicativo e do banco de dados.
precisa saber é o seguinte
13

No QGIS> = 2.12, você pode definir a camada de polígono "lago" como um obstáculo ao rótulo. Isso é feito através das propriedades da camada "lago", na seção "Etiquetas". Altere a caixa de combinação na parte superior de " Sem etiquetas " para " Desencorajar outras etiquetas de cobrir os recursos desta camada ".

ndawson
fonte
1
Obrigado. Eu estava procurando por algo assim e não havia percebido essa opção suspensa antes. No entanto, eu diria que isso foi apenas moderadamente bem-sucedido. 1) Apenas "tipo-de-tipo-de" rótulos desencorajados da camada River (eles ainda aparecem dentro do lago, mas menos) e 2) agora não tenho meus rótulos com o nome Lake :( Também tentei definir os rótulos do rio> Obstáculos "Desencorajar os rótulos dos recursos de cobertura" (sem êxito) e definir pesos Baixo e Alto (sem sucesso) e definir Posicionamento> Prioridade = Baixo e Alto (sem êxito).
RyanKDalton
Ah, talvez eu tenha entendido errado. Se você tiver etiquetas na camada do lago, verifique se a caixa de seleção "desencorajar etiquetas de recursos de cobertura" na guia de renderização está marcada. Pode ser necessário jogar com o controle deslizante "peso" e outras opções deste grupo para obter os resultados desejados.
Ndawson 6/01/16
1
Não, você estava definitivamente no caminho certo. Eu brinquei com os pesos (alto peso nos polígonos do lago + "minimizando a colocação de etiquetas sobre o interior das feições, baixo peso nos rios) e me aproximei, mas nunca cheguei ao ponto em que as etiquetas do rio não estavam no lago. parece estar associada com linhas que estão dentro e fora do polígono.
RyanKDalton
4
por que você não remove (ou divide) essas linhas quando se trata de rotular? Eles não são úteis para o seu mapa de qualquer maneira.
radouxju
4

Acho a rotulagem em geral bastante difícil, pelo menos para gerar etiquetas que agradam os sentidos do meu cartógrafo. Embora o recurso de rotulagem automática funcione bem 80% das vezes, há casos como o problema de rotulagem de rios / lagos em que não gera rotulagem legal. A etiquetagem automática costuma estar ligada à geometria do recurso, por exemplo, quantas peças estão em uma linha, de modo que, a princípio, todas as peças estejam sendo etiquetadas. Obviamente, o QGIS tem meios de evitar rotulagem repetida, o que também depende da escala da visualização atual do mapa.

De qualquer forma, minha dica não é uma solução rápida. Costumo criar uma camada especializada apenas para rotular, para que meus rótulos sejam mais facilmente controlados. E muitas vezes a geometria dos recursos para representação cartográfica pode colidir com uma boa geometria para rotulagem. Então, eu proporia a criação de uma nova camada em que os córregos não cruzem os lagos, para que você possa contornar o problema completamente. Ter uma camada de rotulagem extra também pode ajudar a evitar problemas onde a direção da rotulagem não está na direção pretendida, porque está ligada à forma como a geometria foi criada.

Bem, temo que minha dica não seja o que você esperava, mas espero que minha alternativa se aproxime da minha ajuda.

Frank
fonte
Você defende que eu poderia criar um novo conjunto de dados (o que seria fácil de fazer neste caso ... basta apagar os recursos da linha sob polígonos), dobrar os conjuntos de dados não parece muito atraente ou gerenciável, a menos que você use um método orientado a banco de dados como o @Richard Law mencionado.
precisa saber é o seguinte
Entendo o seu argumento e entendo sua hesitação em criar um conjunto de dados semelhante duas vezes. Na minha experiência, a camada de rótulo é frequentemente mais diferente do que a camada de dados original. Por exemplo, para ficar com o exemplo do rio, convém alterar ainda mais a geometria do rio para unir ou dividir partes do recurso, a fim de criar uma rotulagem melhor, repetida mais regularmente. Pelo menos esse é o meu caso ao lidar com estradas OSM, por exemplo, que às vezes são organizadas arbitrariamente.
Frank
3

existe um plug-in chamado " Máscara " que pode ser usado para filtrar rótulos com base em polígonos.

Conforme mencionado no meu comentário anterior, no entanto, seria muito mais fácil se você pudesse dividir suas linhas no cruzamento com os lagos (veja métodos diferentes aqui ). Em seguida, você pode definir uma etiqueta de tamanho zero para os segmentos que estão dentro dos lagos ("Camada"> "Rotulagem"> "Configurações definidas por dados"> "Tamanho" e selecione a coluna onde você armazena o tamanho da etiqueta). A divisão mantém a maioria das propriedades da sua rede fluvial e é reversível com a dissolução, para que você possa continuar trabalhando com uma única camada (armazene o comprimento total em uma tabela de atributos específica, se necessário).

radouxju
fonte
Obrigado, o plugin parece promissor, então vou tentar.
precisa saber é o seguinte