Comment afficher uniquement les étiquettes pour une sélection arbitraire d'articles?


10

Je suis curieux de voir comment les autres résolvent ce problème: vous avez créé une carte pour quelque chose avec un grand nombre d'entités étiquetées. Le client / client vous demande de n'afficher que les étiquettes pour X, Y et Z, sur la base d'une décision apparemment arbitraire (par exemple, ce qu'ils considèrent comme des caractéristiques importantes). Comment vous y prendriez-vous?

Quelques idées:

  • Créez une nouvelle colonne de chaîne pour cette étiquette spéciale et remplissez uniquement une valeur pour les fonctionnalités qu'ils souhaitent voir (cela pourrait entraîner des informations en double)
  • Créez une nouvelle colonne booléenne et marquez les fonctionnalités qu'ils veulent voir avec true, puis utilisez l'étiquetage conditionnel dans QGIS 1.8 pour afficher uniquement l'étiquette lorsque le booléen est vrai

6
La deuxième idée présente de nombreux avantages: (i) elle documente clairement ce qui doit être étiqueté, (ii) elle est aussi permanente et portable que l'ensemble de données sous-jacent, (iii) elle fournit un mécanisme simple et direct pour déterminer quelles étiquettes apparaîtront ( qui est même portable sur un autre SIG ou traceur), (iv) il peut même être analysé en cas de questions sur les relations entre ces choix d'étiquettes et toute autre variable, et (v) en codant avec parcimonie le choix du client , il ne crée aucune information en double.
whuber

2
@whuber pouvez-vous répondre à cette question afin que je puisse voter, car c'est exactement la façon dont je le ferais.
Nathan W

Réponses:


11

La deuxième idée (pour créer un attribut booléen pour la sélection) présente de nombreux avantages :

(i) il documente clairement ce qui doit être étiqueté,

(ii) il est aussi permanent et portable que l'ensemble de données sous-jacent,

(iii) il fournit un mécanisme simple et direct pour déterminer quelles étiquettes apparaîtront (ce qui est même portable sur un autre SIG ou ensemble de traçage),

(iv) il peut même être analysé au cas où il y aurait des questions sur les relations entre ces choix d'étiquettes et toute autre variable, et

(v) en codant avec parcimonie le choix du client, il ne crée aucune information en double.

Il y a quelques principes généraux de construction et de gestion de base de données à l'œuvre ici , comme le suggère judicieusement la question. L'un d'eux est que toute information cohérente doit être représentée de manière unique dans la base de données si possible. (Informations utilisées comme clés pour mettre en œuvre des jointures et concerne bien sûr doit apparaître à plusieurs endroits en vertu de sa fonction d' identification des enregistrements correspondants dans différents tableaux.) Il y a d' excellentes raisons de ce principe, comme toute personne qui a tenté de maintenir un non normalisé base de données relationnelle peut attester: si vous ne vous souvenez pas toujours de mettre à jour ou supprimer ou ajouter ces informations à tous les dans laquelle il apparaît, votre base de données devient vite incohérente: elle est corrompue, souvent de manière irrémédiable.

Un autre principe est que dans une bonne conception de base de données relationnelle, chaque table doit représenter une seule "entité" conceptuelle : quelque chose que les données modélisent ou une relation entre ces choses. Lorsqu'un client spécifie une sélection apparemment arbitraire de fonctionnalités, il spécifie effectivement un sous-ensemble de lignes dans une table. Mathématiquement, par l' axiome de la séparation, cela revient à les signaler avec un champ booléen. Ainsi, tout sous-ensemble significatif "arbitraire" de choses dans une base de données peut être représenté par un champ booléen et, inversement, un tel champ est un bon moyen de stocker des sous-ensembles (ou sélections) arbitraires.

Encore un autre principe est que vous devriez préférer utiliser les capacités sous-jacentes de gestion des données du SIG pour stocker des informations . L'alternative est une ad hocméthode basée sur la capacité du SIG à stocker des informations dans ses "fichiers de projet" ou d'une autre manière indépendante. Un exemple typique de ceci est la pratique de choisir et de placer manuellement les étiquettes souhaitées. C'est souvent rapide et facile à faire. Les problèmes surviennent chaque fois qu'un changement est nécessaire ou que l'œuvre doit être reproduite; l'une ou l'autre de ces situations est pratiquement inévitable. Le placement manuel des étiquettes revient à stocker des informations (à savoir, quel sous-ensemble de fonctionnalités doit être étiqueté) en dehors du SGBDR d'une manière extrêmement elliptique. A savoir, la sélection spécifiée uniquement par laquelle les étiquettes apparaissent et celles qui ne le font pas. Réfléchissez à la façon dont vous pourriez alors résoudre ces problèmes de suivi:

  • Le client souhaite que les mêmes étiquettes apparaissent dans une carte associée mais différente, faisant partie d'un projet différent.

  • Une question se pose de savoir si les étiquettes sont associées à un autre attribut.

  • Après avoir apporté plusieurs modifications aux étiquettes au fil du temps, vous êtes invité à revenir à la version d'origine.

Dans ces cas, le travail nécessaire pour résoudre le problème peut être énorme: vous devez recommencer l'étiquetage à nouveau, ou effectuer des recoupements manuels avec les tables de base de données, ou rechercher et restaurer un ancien fichier de projet archivé. Si les étiquettes étaient plutôt représentées par un champ booléen dans la base de données, le travail serait à la place presque trivial.


1
Je ne fais que commencer avec le SIG, mais j'ai quelques connaissances en base de données pour faire du développement logiciel. Je soupçonne que j'aurai bientôt une question de suivi sur la préservation de l'ensemble de données d'origine en créant une table spécifique au client qui est jointe 1 à 1 avec l'ensemble de données d'origine et peut-être fournie en tant que vue PostgreSQL pour plus de transparence.
Brian Kelly

Oui, c'est aussi une bonne solution. Avec vos connaissances de base de données, vous savez qu'il y a rarement une réponse parfaite; il y a toujours des compromis. Une table de recherche est élégante et parfaite pour certaines situations. En fait, souvent, vous avez juste besoin d'une nouvelle table qui répertorie les identifiants des entités à étiqueter: une jointure à la table attributaire de couche crée un nouveau champ (étranger) qui est nul pour les entités à ne pas étiqueter, et vous êtes bon pour aller. Mais maintenant, vous avez une nouvelle table à gérer dans la base de données: il y a le compromis.
whuber

8

Vous pouvez probablement simplement définir la règle dans le nouveau libellé basé sur l'expression. La règle fonctionnera comme une documentation de ce que vous avez fait pour obtenir les étiquettes résultantes.

L'avantage par rapport à l'approche du "drapeau booléen" est qu'il est plus flexible tout en travaillant sur la bonne règle. Il est facile de modifier et d'améliorer la règle sans modifier l'ensemble de données sous-jacent. D'un autre côté, il n'est pas portable pour les autres packages SIG.

Ceci est un exemple où je ne nomme que des entités avec des noms de plus de six caractères et avec une certaine classe:

entrez la description de l'image ici


1
Mais la règle dans ce cas est "je considère ces caractéristiques importantes et les autres non importantes". Je ne pense pas qu'il y ait de fonction pour ça :-)
Brian Kelly

1
En outre, cette question est liée à "Quand dois-je modifier un ensemble de données et quand dois-je le copier?" Je soupçonne que c'est une conversation beaucoup plus large cependant.
Brian Kelly

J'ai simplement supposé que ces fonctionnalités importantes auraient au moins un ID que vous pouvez utiliser comme j'ai utilisé l'attribut clazz. Il y a des avantages aux deux solutions.
underdark
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.