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:
- Esecuzione di una query per ciò che è attualmente in mappa limiti
- 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.
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 –
- 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 –
- 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.] –