Como mostrar apenas rótulos para uma seleção arbitrária de itens?

10

Estou curioso para saber como os outros resolvem esse problema: você criou um mapa para algo com um grande número de recursos rotulados. O cliente solicita que você mostre apenas rótulos para X, Y e Z, com base em alguma decisão aparentemente arbitrária (por exemplo, o que eles consideram características importantes). Como você faria isso?

Algumas ideias:

  • Crie uma nova coluna de sequência para esse rótulo especial e preencha apenas um valor para os recursos que eles desejam ver (podem resultar em informações duplicadas)
  • Crie uma nova coluna booleana e sinalize os recursos que eles desejam ver com true, depois use a rotulação condicional no QGIS 1.8 para exibir apenas a etiqueta quando o booleano for verdadeiro
Brian Kelly
fonte
6
A segunda ideia tem muitas vantagens: (i) documenta claramente o que precisa ser rotulado; (ii) é tão permanente e portátil quanto o conjunto de dados subjacente; (iii) fornece um mecanismo simples e direto para determinar quais rótulos aparecerão ( que é até portátil para outro SIG ou pacote de plotagem), (iv) é até passível de análise, caso haja alguma dúvida sobre as relações entre essas escolhas de rótulos e quaisquer outras variáveis, e (v) codificando parcimoniosamente a escolha do cliente , ele não cria informações duplicadas.
whuber
2
@whuber, você pode fazer uma resposta para que eu possa votar, porque é exatamente assim que eu faria.
Nathan W

Respostas:

11

A segunda ideia (criar um atributo booleano para seleção) tem muitas vantagens :

(i) documenta claramente o que precisa ser rotulado,

(ii) é tão permanente e portátil quanto o conjunto de dados subjacente,

(iii) fornece um mecanismo simples e direto para determinar quais rótulos aparecerão (que são até portáteis para outro GIS ou pacote de plotagem),

(iv) é até passível de análise, caso haja alguma dúvida sobre as relações entre essas escolhas de rótulos e quaisquer outras variáveis, e

(v) codificando parcimoniosamente a escolha do cliente, ele não cria informações duplicadas.

Existem alguns princípios gerais de construção e gerenciamento de banco de dados em funcionamento aqui , como sabiamente sugerido na pergunta. Uma delas é que qualquer informação coerente deve ser representada exclusivamente no banco de dados, se possível. (Informações utilizadas como chaves para implementar une e relaciona-se, naturalmente, deve aparecer em vários lugares em virtude de sua função como identificar registros correspondentes em diferentes tabelas.) Existem excelentes razões para este princípio, como qualquer um que tenha tentado manter um não-normalizado banco de dados relacional pode atestar: se você não se lembrar constantemente de atualizar ou remover ou adicionar essas informações a todos tabela em que aparece, seu banco de dados logo se torna internamente inconsistente: está corrompido, geralmente irrecuperavelmente.

Outro princípio é que, em um bom design de banco de dados relacional, cada tabela deve representar uma única "entidade" conceitual : algo que os dados estão modelando ou um relacionamento entre essas coisas. Quando um cliente especifica uma seleção aparentemente arbitrária de recursos, ele efetivamente especifica um subconjunto de linhas em uma tabela. Matematicamente, pelo axioma da separação, é o mesmo que sinalizá-los com um campo booleano. Assim, qualquer subconjunto "arbitrário" significativo de coisas em um banco de dados pode ser representado por um campo booleano e, inversamente, esse campo é uma boa maneira de armazenar subconjuntos (ou seleções) arbitrários.

Outro princípio é que você deve preferir usar os recursos subjacentes de gerenciamento de dados do GIS para armazenar informações . A alternativa é ad hocmétodo baseado na capacidade do GIS para armazenar informações em seus "arquivos de projeto" ou de alguma outra maneira independente. Um exemplo típico disso é a prática de escolher e colocar manualmente os rótulos desejados. Muitas vezes, é rápido e fácil fazer isso. Os problemas surgem sempre que uma mudança é necessária ou o trabalho precisa ser reproduzido; uma ou outra dessas situações é praticamente inevitável. O posicionamento manual das etiquetas equivale a armazenar informações (a saber, que subconjunto de recursos deve ser rotulado) fora do RDBMS de maneira extremamente elíptica. Ou seja, a seleção especificada apenas por quais rótulos aparecem e quais não. Pense em como você resolveria esses problemas subsequentes:

  • O cliente deseja que os mesmos rótulos apareçam em um mapa relacionado, mas diferente, parte de um projeto diferente.

  • Surge uma questão sobre se os rótulos estão associados a algum outro atributo.

  • Após fazer várias alterações nos rótulos ao longo do tempo, você será solicitado a reverter para a versão original.

Nesses casos, o trabalho envolvido para resolver o problema pode ser enorme: é necessário refazer a rotulagem novamente, executar verificações cruzadas manuais em tabelas do banco de dados ou encontrar e restaurar um arquivo de projeto arquivado antigo. Se os rótulos fossem representados por um campo booleano no banco de dados, o trabalho seria quase trivial.

whuber
fonte
1
Estou apenas começando o GIS, mas tenho algum conhecimento em banco de dados ao desenvolver software. Suspeito que em breve terei uma pergunta de acompanhamento sobre como preservar o conjunto de dados original, criando uma tabela específica específica do cliente que seja unida 1 a 1 com o conjunto de dados original e talvez fornecida como uma Visualização do PostgreSQL para maior transparência.
Brian Kelly
Sim, essa também é uma boa solução. Com seu conhecimento de banco de dados, você sabe que raramente existe uma resposta perfeita; sempre há trocas. Uma tabela de pesquisa é elegante e perfeita para algumas situações. De fato, muitas vezes você só precisa de uma nova tabela que lista os IDs dos recursos a serem rotulados: uma junção à tabela de atributos da camada cria um novo campo (estrangeiro) que é nulo para os recursos não serem rotulados, e você bom para ir. Mas agora você tem uma nova tabela para gerenciar no banco de dados: existe o compromisso.
whuber
8

Provavelmente, você pode definir a regra na nova rotulagem baseada em expressão. A regra funcionará como documentação do que você está fazendo para obter os rótulos resultantes.

A vantagem sobre a abordagem "sinalizador booleano" é que isso é mais flexível ao trabalhar com a regra correta. É fácil alterar e melhorar a regra sem alterar o conjunto de dados subjacente. Por outro lado, não é portátil para outros pacotes GIS.

Este é um exemplo em que apenas rotulo recursos com nomes com mais de seis caracteres e com uma determinada classe:

insira a descrição da imagem aqui

underdark
fonte
1
Mas a regra neste caso é "considero esses recursos importantes e os outros não importantes". Eu não acho que há uma função para que :-)
Brian Kelly
1
Além disso, essa pergunta está relacionada a "Quando devo alterar um conjunto de dados e quando devo copiá-lo?" Eu suspeito que é uma conversa muito maior.
Brian Kelly
Eu apenas presumi que esses recursos importantes teriam pelo menos um ID que você possa usar como eu usei o atributo clazz. Há profissionais para ambas as soluções.
underdark