2010-02-05 6 views
7

SpatialKey genera alcune heatmap davvero belle, e stiamo esaminando ciò che è coinvolto nel fare questo per un progetto interno per visualizzare grandi quantità di punti. Sto cercando feedback su alcune idee su dove iniziare (ed è solo un problema davvero interessante).Generazione di mappe di densità/calore come SpatialKey

SpatialKey heatmap http://img697.imageshack.us/img697/7964/resolutiondays508x17550.jpg

Sappiamo che stanno utilizzando Flash, e da quello che possiamo dire, le mappe di calore sono interattivi piuttosto che essere reso da un server di piastrelle. La nostra prima ipotesi su come questo è implementato è che il server fornisce al client Flash una griglia: ogni cella ha un conteggio calcolato dal server. Il client Flash esegue quindi un'interpolazione basata sui valori della cella nella griglia per rendere l'output carino che vedi sopra.

A questo punto, sono solo interessato a come potrebbero generare la rete in modo efficiente lato server (se la nostra ipotesi sulla loro implementazione è corretta). Sembra che comporterebbe:

  1. Esecuzione di una query per ciò che è attualmente in mappa limiti
  2. esecuzione di un subquery di aggregazione per ogni cella all'interno di tali limiti (facendo un conteggio, somma, o media, come nell'esempio di cui sopra) .

Lanciare questo a più livelli di zoom con una risoluzione di griglia sensata e sembra che sia necessario un indice spaziale personalizzato per renderlo efficiente.

Chi prende in considerazione spiegando un percorso alternativo? Se è importante, siamo abituati a memorizzare i nostri dati in PostgreSQL con PostGIS per l'indice spaziale, ma sono aperto a provare qualsiasi cosa.

risposta

5

Come solo una supposizione, immagino che abbiano implementato una libreria GIS in Flash sul lato client e lo stanno usando per proiettare le coordinate di latitudine e longitudine in uno spazio pixel. Quindi si aggregano per pixel per determinare "l'altezza" di ciascun pixel e lo rendono esattamente come si farebbe con il rendering di un cerchio, ma usando un riempimento sfumato con una trasparenza, con i colori iniziale e finale del riempimento sfumato determinato dall'altezza del pixel. Più cerchi sovrapposti uno sull'altro creeranno pixel più luminosi.

Un'alternativa potrebbe essere quella di farlo in scala di grigi, quindi mappare il valore di luminosità su una scala di colori. Potrebbe essere più efficiente.

Vendiamo le mappe di calore di tre mappe più tradizionali per l'utilizzo di integrazione in applicazioni di analisi visiva (ad esempio heat map SDK) e ora disponiamo di mappe termografiche geografiche che colorano le aree. Leggiamo le mappe ESRI Shapefile standard e facciamo tutta la proiezione e il rendering sul lato client (in Java, non in Flash, ma nello stesso concetto). Penso che SpatialKey stia facendo lo stesso, dal momento che supportano il rendering pieno di aree, che non può essere fatto se si utilizza un server di tile come Google Maps.

Non stiamo ancora facendo mappe di densità di calore come questa, ma abbiamo eseguito un paio di test usando immagini statiche come sfondo. Se vuoi maggiori informazioni, fammi sapere e posso chiedere al mio sviluppatore come lo abbiamo fatto. So che siamo attualmente in fase di sviluppo su più funzionalità basate su punti, anche se non so dove siano ancora in programma le mappe di calore per la densità.

SpatialKey ha appena scritto un buon post sulle diverse mappe di calore riempite di area (ovvero: mappe tematiche) e mappe di calore a densità. Puoi verificarlo allo http://blog.spatialkey.com/2010/02/comparing-thematic-maps-with-density-heatmaps/.

Se si riesce a capire un buon modo di fare mappe di densità di calore, sarei interessato ad apprendere come l'hai fatto, in quanto sarebbe una preziosa aggiunta al nostro SDK di analisi visiva. Buona fortuna.

+0

Ho appena realizzato che potrei aver interpretato male la domanda. La domanda appare diretta a come ottenere il set di dati che contiene latitudine, longitudine e "altezza", piuttosto che come renderlo. Ancora una volta, non sapendo come SpatialKey sta facendo questo, penso che tu abbia almeno parzialmente ragione. Anziché eseguire subquery per ogni cella, che potrebbe sovraccaricare rapidamente il database (una griglia 10x10 richiederebbe 100 sottoquery), è possibile effettuare le seguenti operazioni: - Far passare lato client la larghezza e l'altezza della superficie di rendering insieme ai limiti in longitudine e latitudine –

+0

- Calcola la risoluzione della longitudine e della latitudine eseguendo un intervallo di mappatura tra longitudine e latitudine, larghezza e altezza. Questo indica la larghezza e l'altezza dei cassoni effettivi per ogni cella da una prospettiva di latitudine e longitudine - Query per tutti i punti nei limiti di longitudine e latitudine - Iterare attraverso ciascun punto e arrotondare al più vicino longitudine e latitudine bin - Memorizza il risultato in una ricerca hashtable con la chiave essendo longitudine e latitudine binning e il valore è il conteggio –

+0

- Output il risultato come un set di dati con tre colonne: longitudine, latitudine e conteggio (es .: altezza) Il client può quindi facilmente esegue il rendering di questo set di dati utilizzando una libreria GIS sul front-end. Oppure puoi pre-proiettare i punti e inviarli al front-end usando le coordinate pixel X, Y. [Nota: ho appena realizzato che il mio uso del termine "altezza" qui potrebbe essere fonte di confusione. Ciò è dovuto al fatto che una mappa di densità è essenzialmente una mappa tolopogica colorata con il colore che rappresenta l'altezza di ciascun punto.] –

0

MapReduce per i totali totali delle mappe aggregate e qualcosa con Indicizzazione geospaziale per il database - per alimentare questi lavori MapReduce. Sto cercando di implementare questo stesso identico approccio, ma per interfacce invece di mappe :) MongoDB sembra essere una buona scelta al momento.