Come mostrare le etichette solo per una selezione arbitraria di articoli?


10

Sono curioso di sapere come gli altri risolvono questo problema: hai creato una mappa per qualcosa con un gran numero di funzionalità che sono etichettate. Il cliente / cliente ti chiede di mostrare solo le etichette per X, Y e Z, sulla base di una decisione apparentemente arbitraria (ad es. Ciò che ritengono importanti funzionalità). Come faresti a fare questo?

Qualche idea:

  • Crea una nuova colonna di stringhe per questa etichetta speciale e inserisci solo un valore per le funzionalità che vogliono vedere (potrebbe generare informazioni duplicate)
  • Crea una nuova colonna booleana e contrassegna le funzionalità che vogliono vedere con true, quindi usa l'etichettatura condizionale in QGIS 1.8 per visualizzare l'etichetta solo quando il valore booleano è true

6
La seconda idea presenta molti vantaggi: (i) documenta chiaramente ciò che deve essere etichettato, (ii) è permanente e portatile come il set di dati sottostante, (iii) fornisce un meccanismo semplice e diretto per determinare quali etichette appariranno ( che è anche portabile su un altro GIS o pacchetto di tracciamento), (iv) è persino suscettibile di analisi nel caso in cui ci siano mai domande sulle relazioni tra queste scelte di etichette e qualsiasi altra variabile, e (v) codificando parsimoniosamente la scelta del cliente , non crea informazioni duplicate.
whuber

2
@whuber puoi fare una risposta così posso votarla perché è esattamente come la farei io.
Nathan W,

Risposte:


11

La seconda idea (per creare un attributo booleano per la selezione) presenta molti vantaggi :

(i) documenta chiaramente ciò che deve essere etichettato,

(ii) è permanente e portatile come il set di dati sottostante,

(iii) fornisce un meccanismo semplice e diretto per determinare quali etichette appariranno (che è persino portabile su un altro GIS o pacchetto di stampa),

(iv) è anche suscettibile di analisi nel caso in cui ci siano mai domande sulle relazioni tra queste scelte di etichette e qualsiasi altra variabile, e

(v) codificando parsimoniosamente la scelta del cliente, non crea informazioni duplicate.

Ci sono alcuni principi generali di costruzione e gestione del database al lavoro qui , come saggiamente suggerito nella domanda. Uno di questi è che qualsiasi informazione coerente dovrebbe essere rappresentata in modo univoco nel database, se possibile. (Le informazioni utilizzate come chiavi per implementare i join e le relazioni ovviamente devono apparire in più punti in virtù della sua funzione di identificazione dei record corrispondenti in diverse tabelle.) Vi sono eccellenti ragioni per questo principio, in quanto chiunque abbia tentato di mantenere un valore non normalizzato il database relazionale può attestare: se non ricordi costantemente di aggiornare o rimuovere o aggiungere queste informazioni a tutti tabella in cui appare, il tuo database diventa presto incoerente internamente: è danneggiato, spesso irrimediabilmente così.

Un altro principio è che in una buona progettazione di database relazionali, ogni tabella dovrebbe rappresentare una singola "entità" concettuale : qualcosa che i dati stanno modellando o una relazione tra quelle cose. Quando un client specifica una selezione apparentemente arbitraria di funzionalità, specifica in modo efficace un sottoinsieme di righe in una tabella. Matematicamente, per l' assioma della separazione, ciò equivale a segnalarli con un campo booleano. Pertanto, qualsiasi sottoinsieme "arbitrario" di cose in un database può essere rappresentato da un campo booleano e, al contrario, un tale campo è un buon modo per memorizzare sottoinsiemi (o selezioni) arbitrari.

Un altro principio è che dovresti preferire utilizzare le capacità di gestione dei dati sottostanti del GIS per archiviare informazioni . L'alternativa è un po ' ad hocmetodo basato sulla capacità del GIS di memorizzare informazioni all'interno dei suoi "file di progetto" o in qualche altro modo indipendente. Un tipico esempio di ciò è la pratica di scegliere e posizionare manualmente le etichette desiderate. Spesso è facile e veloce farlo. I problemi sorgono ogni volta che è necessario un cambiamento o il lavoro deve essere riprodotto; l'una o l'altra di queste situazioni è praticamente inevitabile. Il posizionamento manuale delle etichette equivale alla memorizzazione di informazioni (vale a dire, quale sottoinsieme di funzioni dovrebbe essere etichettato) all'esterno di RDBMS in modo estremamente ellittico. Vale a dire, la selezione specificata esclusivamente da quali etichette compaiono e quali no. Pensa a come risolvere questi problemi successivi:

  • Il cliente desidera che le stesse etichette vengano visualizzate in una mappa correlata ma diversa, parte di un progetto diverso.

  • Sorge una domanda se le etichette siano associate ad altri attributi.

  • Dopo aver apportato diverse modifiche alle etichette nel tempo, ti viene chiesto di ripristinare la versione originale.

In questi casi, il lavoro necessario per risolvere il problema può essere enorme: è necessario ripetere nuovamente l'etichettatura o eseguire controlli incrociati manuali su tabelle di database o trovare e ripristinare un vecchio file di progetto archiviato. Se le etichette fossero invece rappresentate da un campo booleano nel database, il lavoro sarebbe invece quasi banale.


1
Sto solo iniziando con GIS, ma ho una certa conoscenza del database dallo sviluppo del software. Ho il sospetto che presto avrò una domanda di follow-up sulla conservazione del set di dati originale creando una tabella separata, specifica per il cliente, che viene unita 1 a 1 con il set di dati originale e forse fornita come vista PostgreSQL per la trasparenza.
Brian Kelly,

Sì, anche questa è una buona soluzione. Con la tua conoscenza del database sai che raramente esiste una risposta perfetta; ci sono sempre dei compromessi. Un tavolo di ricerca è elegante e perfetto per alcune situazioni. In effetti, spesso hai solo bisogno di una nuova tabella che elenca gli ID delle caratteristiche da etichettare: un join alla tabella degli attributi del livello crea un nuovo campo (esterno) che è nullo per le caratteristiche che non devono essere etichettate, e tu sei buono andare. Ma ora hai una nuova tabella da gestire nel database: c'è il compromesso.
whuber

8

Probabilmente puoi semplicemente impostare la regola nella nuova etichettatura basata su espressioni. La regola funzionerà come documentazione di ciò che hai fatto per ottenere le etichette risultanti.

Il vantaggio rispetto all'approccio "bandiera booleana" è che questo è più flessibile mentre si lavora sulla regola corretta. È facile modificare e migliorare la regola senza alterare il set di dati sottostante. D'altra parte, non è portabile su altri pacchetti GIS.

Questo è un esempio in cui sto etichettando solo funzioni con nomi più lunghi di sei caratteri e con una certa classe:

inserisci qui la descrizione dell'immagine


1
Ma la regola in questo caso è "Considero queste funzionalità importanti e le altre non importanti". Non credo che ci sia una funzione per questo :-)
Brian Kelly

1
Inoltre, questa domanda si lega a "Quando devo modificare un set di dati e quando dovrei copiarlo?" Sospetto però che sia una conversazione molto più ampia.
Brian Kelly,

Ho appena pensato che quelle caratteristiche importanti avrebbero almeno un ID che puoi usare come ho usato l'attributo clazz. C'è un vantaggio per entrambe le soluzioni.
underdark
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.