Esiste una soluzione FOSS per l'analisi della legenda in un ambiente di mappatura Web?


14

I nostri requisiti di mappatura Web sono abbastanza standard: alcune query di base e la possibilità di stampare la mappa risultante (o salvare l'immagine). In genere abbiamo usato prodotti ESRI in passato (al momento stiamo usando GeoCortex) ma non siamo ancora stati in grado di risolvere il problema di come analizzare le informazioni sulla legenda in modo che corrispondano a ciò che viene effettivamente mostrato sulla mappa. Ad esempio, se sulla mappa sono presenti quattro poligoni, dovrebbero essere presenti solo quattro elementi legenda per i poligoni. Esiste una soluzione open source per questo problema?

EDIT : Vediamo se posso chiarire di più questo. Attualmente, abbiamo uno strato geologico con oltre 33.000 poligoni. La legenda per questo livello è una singola immagine e contiene diverse centinaia di elementi legenda (cioè è la legenda per l'intero livello geologico, memorizzata in un JPEG / PNG).

In genere, un utente ingrandirà un'area (come un singolo foglio della mappa NTS, o anche più piccolo) e quindi un sottoinsieme di poligoni geologici verrà mostrato sullo schermo. Quindi salveranno la mappa come documento di stampa (PDF o immagine), che viene generato da GeoCortex / ArcGIS Server. Il documento di stampa conterrà un'intestazione, un'immagine della mappa e una legenda. Tuttavia, la legenda per il livello geologico sarà la legenda per l' intero livello geologico, non ciò che viene effettivamente mostrato sulla mappa (cioè un sottoinsieme molto più piccolo).

Quindi, sto cercando di vedere se esiste una soluzione FOSS che mi consente di ritagliare o generare al volo un sottoinsieme della legenda geologica che riflette gli elementi reali sullo schermo / sulla mappa, per andare con il documento di stampa . Spero che chiarisca le cose; Mi scuso se non lo fa!


1
Ciao ollyoop, sto facendo fatica a immaginare il risultato desiderato. Puoi includere un esempio della cattiva leggenda e un esempio di una buona leggenda? Penso che potrebbe aiutare me o altri a dare una risposta. Grazie--
Andytilia,

questa funzione è stata inclusa nel server Arcgis 10.1, l'ho vista durante una presentazione di ESRI.
geogeek,

Hmmm, beh, vedremo come funziona davvero. Nel frattempo, ci sono soluzioni FOSS?
ollyoop

1
Basato su FOSS o ESRI, sembra che avrai bisogno di un codice personalizzato.
Ragi Yaser Burhum,

Sicuramente Latitude Geographics può farlo. Ne hai parlato con loro (anche se è già presente in Geocortex Essentials o se hanno intenzione di implementarlo)?
Chad Cooper,

Risposte:


3

È sicuramente possibile fare quello che vuoi, a seconda di determinate condizioni. Dai un'occhiata a questa app Flex che avevo sviluppato un paio di anni fa: http://india-wris.nrsc.gov.in/LULCApp.html .

La legenda e le statistiche cambiano in base ai dati visibili nell'estensione corrente. L'algoritmo richiede che ciascuna classe abbia un colore distinto. L'applicazione Flex conosce la classe e il suo colore. Ad ogni variazione di estensione, converte l'estensione della mappa corrente in una bitmap, quindi rileva i colori in essa contenuti. Usando questo, puoi scoprire quali colori o classi sono attualmente visibili. Sulla base di queste informazioni, la legenda viene creata in modo dinamico.

Avevo usato Flex in quel momento, ma questo è possibile anche usando Canvas in HTML5. Oppure puoi usare qualsiasi codice lato server per fare la stessa cosa con l'immagine della tua mappa per ottenere la legenda creata dinamicamente.


È esattamente così! Fantastico vedere un esempio in pratica. Molto apprezzato!!!
ollyoop,

5

AFAIK, in FOSS4G o ESRI, dovrai scrivere un codice personalizzato per generare questo livello.

Non è così difficile, ma ti richiederà più di alcune righe di codice.

Per ArcMap, ciò viene realizzato utilizzando un elemento personalizzato . Il sito di aiuto ESRI è pieno di vecchi esempi e nuovi esempi .

In passato, ho realizzato qualcosa di simile a quello che hai descritto usando Pagelayout Frame Elements .

Se non hai mai fatto ArcObjects (ma hai programmato), il codice di disegno può diventare un po 'complicato, ma di solito ci vuole uno per raggiungere quel "aha!" momento.

L'algoritmo è semplice:

  • (1) Ottieni l' oggetto Map del PageLayout che vuoi usare come riferimento per generare la legenda ... Potrebbe essere necessario trattare con più frame per raggiungere la mappa che desideri, perché un Pagelayout può contenere diversi oggetti Map con differenti estensioni che è un po 'insolito se non hai eseguito alcuna programmazione personalizzata di PagMay ArcMap (pensa alle piccole mappe degli inserti che puoi avere).

  • (2) Prendi l' estensione visibile dell'ActiveView della mappa che desideri.

  • (3) Utilizzalo come geometria del filtro di query per eseguire il ciclo e cercare in tutti i livelli della mappa.

  • (4) Se il layer restituisce dei record, devi disegnarlo come mostrato negli esempi che ti ho dato prima.

Spiacenti, non posso offrirti una soluzione più semplice, ma almeno in questo modo sarai in grado di farlo sembrare come desideri, basta codificare.

Aggiornare:

Dato che volevi farlo nel contesto di un'applicazione Web, ho controllato la documentazione e ci sono diversi modi per farlo usando un algoritmo simile.

Uno di questi è tramite un'estensione dell'oggetto server ArcGIS . Faresti tutti i passaggi tranne (1) (non devi preoccuparti di Pagelayout in questo contesto). Esporre il risultato usando REST.

Da qui, hai diverse opzioni (basate su se vuoi usare Flex o Javascript), ma l'idea è la stessa: all'aggiornamento della pagina chiama il servizio web REST che hai creato e disegna la legenda.

Il vantaggio di questo approccio rispetto ad altri che sono stati suggeriti è che puoi usare qualsiasi simbologia con le tue caratteristiche (e non si limitano a colori distinti per la simbologia della caratteristica). Puoi usare la tua lingua web preferita per il codice lato client. I simboli generati per la legenda possono essere generati automaticamente dalla mappa.

Lo svantaggio è che dovrai scrivere un'estensione oggetto server! Fortunatamente, esiste un campione ESRI che fa già il 75% di ciò di cui hai bisogno e dovrebbe darti un'idea chiara di come continuare con i commenti che ho fatto sopra.

Aggiornamento 2: per quanto riguarda una soluzione FOSS4G, lo stesso approccio funzionerebbe anche con qualsiasi server FOSS, sebbene l'API sia leggermente diversa per ciascuno.


1
Grazie mille per la risposta! C'è uno strumento chiamato Legend Limiter che lo fa già per l'ambiente ArcGIS. Quello che sto cercando di fare è portare questa capacità nel mondo della mappatura web.
ollyoop,

@ollyoop Almeno fino alla 9.3, so che questo stesso approccio avrebbe funzionato perfettamente per ArcGIS Server. So che ci sono stati cambiamenti significativi nell'architettura di rendering del server dalla 9.3, e devo ammettere che non l'ho tenuto al passo. Sarei sorpreso se gli elementi personalizzati fossero stati estratti da 10.1.
Ragi Yaser Burhum,

@ollyoop ha aggiunto un approccio che funzionerebbe con ArcGIS Server
Ragi Yaser Burhum,

3

Quando si esporta in un PDF con Geocortex Essentials, la legenda viene generata da un sottoreport nel modello di stampa. Questo sottoreport riceve tutti i livelli visibili utilizzati per creare l'immagine della mappa e tutti i campioni di legenda prodotti da ArcGIS Server. Non genera alcuna query spaziale per determinare se alcuni livelli nella legenda sono effettivamente disegnati all'estensione dell'area stampata.

Pertanto, se si desidera modificare il comportamento della legenda, è possibile personalizzare il sottoreport legenda oppure utilizzare un'immagine anziché un sottoreport per inserire una legenda nel modello di stampa. Se stai già generando un'immagine della legenda in qualche modo da utilizzare nel tuo visualizzatore, dovresti essere in grado di riutilizzare quel servizio dal motore di stampa.

La legenda contiene già del codice incorporato incorporato che attiva o disattiva la formattazione del testo della legenda in base al fatto che il campione sia per un livello o per una classe nel livello. È possibile visualizzare il codice incorporato quando si passa alla scheda "Scripting" in Progettazione report.

(Lavoro a Latitude Geographics)


1

Informazioni sulla "mappatura web" con "soluzione FOSS" completa ... Considerazioni:

  • La "soluzione FOSS" deve essere "popolare" (avere una grande e organizzata comunità) per essere sicura, stabile, ecc.
  • Un concetto chiave in FOSS e GIS è la standardizzazione : le migliori soluzioni adottano standard, come quelli OGC .
  • Oggi le popolari "soluzioni web" sono OpenLayer, Mapserver, GeoServer, PostGIS, ecc. Tutte hanno un core conforme a OGC. La soluzione "GeoCortex / ArcGIS Server" non è FOSS, ma, forse, conforme a OGC.

E considerazione tecnica: stai usando "coperture" (?), Quindi un buon standard OGC per recuperare le tue informazioni spaziali è il WMS .


Una soluzione semplice conforme a OGC al tuo problema è quella di utilizzare i servizi WC GetCapabilities e GetLegendGraphic , che restituisce una descrizione di legenda standard in un file XML e l'immagine con legende.

NOTA: quando si pensa a una soluzione GIS / FOSS, si può pensare prima con gli standard, quindi il problema si riduce a un "noto problema di pezzi LEGO" e i pezzi provengono da qualsiasi fornitore.

ArcGIS 10+ ha GetLegendGraphic , ma controlla se puoi specificare BBOX per mostrare solo un sottoinsieme di legende.


Se vuoi costruire un layout di mappa con legenda , ci sono altri pezzi di questa "soluzione FOSS LEGO":

Qualsiasi server di mappe FOSS, come MapServer (e penso anche le soluzioni ESRI), può offrire un'immagine JPEG come richiesta di mappa WMS (non affiancata) - consultare il servizio GetMap di WMS .

PS: non è uno standard, ma forse il tuo server può essere configurato per offrire una mappa con legenda , tramite strumenti di template come MapServer.

Per creare un layout di "mappa con legenda" è possibile generare un HTML (o "file PDF al volo") con Javascript, PHP o un'altra lingua che esegua le richieste del servizio Web (REST) per mappa e legenda.

Preferisco generare PDF da HTML: puoi usare wkHtmlToPdf , una soluzione FOSS per le conversioni da HTML a PDF. Per produrre layout più scadenti, con "layout JPEG al volo", è possibile utilizzare un toolkit FOSS standard, come imagemagick , sul server.

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.