Rendering di linee sovrapposte


24

Sto realizzando una mappa contenente informazioni sui trasporti pubblici: autobus, tram, ecc. La mappa avrà uno strato contenente ad esempio le linee del tram. Ogni linea ha il suo colore ed è rappresentata da una geometria della stringa di linea.

Il problema è che molte linee hanno parti sovrapposte, in cui più di una linea tranviaria copre la stessa sezione. Per mostrarlo all'utente, preferirei che le linee fossero parallele l'una all'altra anziché essere disegnate una sopra l'altra. Per un esempio, vedi come Google Maps mostra le linee della metropolitana di New York.

Sospetto che questo sia un problema abbastanza comune nella cartografia, ma non so quale terminologia dovrei cercare.

Sto usando PostGIS / GeoServer / OpenLayers come mio stack, ma qualsiasi soluzione open source sarebbe accettabile.


Avere lo stesso problema con le linee della metropolitana. Hai trovato / implementato una soluzione accettabile?
Geert-Jan

Sfortunatamente no. Il cliente non ha dato la priorità a questo e abbiamo fatto un trucco abbastanza sgradevole per evitare sovrapposizioni.
Liedman,

Risposte:


7

Se sei interessato a saperne di più su quest'area, il problema si chiama spostamento cartografico e il suo unico aspetto della generalizzazione cartografica .

Un paio di articoli che parlano di spostamenti e approcci per gestire il problema:


"Spostamento"! Quello era l'altro termine che stavo cercando di ricordare. Abbiamo uno strumento in FME (scusate, non open source) che "Risolve i conflitti di prossimità tra funzionalità usando una variante dell'algoritmo di spostamento di Nickerson" - quindi forse un Google di Nickerson per vedere cosa succede?
Mark Irlanda,

scholar.google.com/… lancia un link all'articolo originale (purtroppo paga murato) e molte persone lo fanno riferimento. Alcuni degli articoli correlati sono gratuiti e sembrano interessanti.
Ian Turton

4

Questo problema è molto tipico nella generalizzazione cartografica. Esistono metodi automatizzati per questo, ma non sono ancora disponibili implementazioni.

I metodi basati su " Travi " e " Serpenti " forniscono risultati efficienti per risolvere questi conflitti cartografici di dati di rete (vedere anche i riferimenti forniti da SCW ). Ecco alcuni risultati degli algoritmi dei raggi sui dati stradali:

Prima:

testo alternativo

Dopo:

testo alternativo

Vedi anche questo documento e questa presentazione che spiegano come effettuare questa trasformazione .

EDIT: Non l'ho mai testato, ma sembra che ci sia qualcosa legato ai serpenti in GRASS. Vedi qui .


1
Funziona se due segmenti di linea (binari del bus) hanno esattamente la stessa geometria?
underdark

1
Si applica a linee troppo chiuse e non dovrebbe funzionare così bene per linee che si sovrappongono esattamente. È necessario un adattamento.
luglio

1

Non conosco una soluzione, ma penso che il termine che stai cercando sia "risoluzione dei conflitti", un argomento di generalizzazione delle mappe. Una ricerca di Google su "conflitti di generalizzazione delle mappe" mostra alcune informazioni interessanti - ma non so che ci sia molto di utilità pratica.


1

Nelle attuali implementazioni, è spesso possibile trovare "Offset" o "Dislocation". Usando lo stack corrente, sembra un po 'difficile ottenere automaticamente linee parallele:

Per riassumere: il modo più semplice che conosco sarebbe usare UMN Mapserver e il valore Offset lì. Stile di esempio per il tuo file map:

STYLE
 SYMBOL 7
 OUTLINECOLOR 160 160 160
 SIZE 5
 OFFSET 2 -99 # <-- This will offset the line to the right.
 ANTIALIAS FALSE
END # STYLE

0

Se stai disegnando livelli di linee che si sovrappongono, hai diverse opzioni per consentire al visualizzatore di vedere tutte le linee.

  1. Larghezza: puoi variare la larghezza della linea tra i livelli e posizionare le linee più larghe sul fondo.
  2. Opacità / Trasparenza: è possibile rendere i singoli livelli di linea parzialmente opachi, in modo da poter "vedere" i singoli livelli.
  3. Offset: è possibile sfalsare il simbolo della linea che rappresenta la funzione di linea effettiva su un lato della geometria effettiva della linea. I singoli livelli possono essere sfalsati di quantità diverse e in direzioni diverse per consentire la visualizzazione di tutti i livelli.
  4. Le linee possono essere rappresentate da una serie di simboli punto con uno spazio definito tra i simboli. Variando il simbolo, il colore del simbolo, la dimensione del simbolo e lo spazio tra i diversi livelli di linea, è necessario distinguere ogni singolo livello di linea.

Non uso GeoServer, ma so che MapServer ha la funzionalità per fare tutte queste cose. È probabile che lo faccia anche GeoServer.


Sembra che vogliamo il n. 3, ma solo per funzioni sovrapposte. È possibile?
mwalker,

2
MapServer e altri server di mappe web e GIS risolvono i conflitti per le etichette, ma non sono a conoscenza di una funzionalità che ti consenta di farlo al volo. Naturalmente, se i tuoi dati fossero abbastanza statici, potresti pre-elaborare i tuoi dati per identificare dove le linee di diversi livelli si intersecano (o rientrano in una tolleranza) e classificare i dati in base a questo. Il motore di rendering della mappa potrebbe quindi applicare la simbologia di "spostamento" basata su un attributo nei dati.
DavidF,
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.