Generazione di un heatmap KML da data set di dati di [lat, lon, la densità]
Domanda
Cerco di costruire uno statico KML (markup Google Earth) di file che mostra un rendering heatmap stile di alcune date insiemi di dati in forma di [lat, lon, densità] tuple.
setA dati molto semplici che ho è per densità di popolazione.
I miei requisiti sono:
- deve essere in grado di nutrire nei dati per un determinato lat, lon
- deve essere in grado di specificare la densità dei dati in quel lat, lon
- Deve esportare KML
I requisiti sono agnostico lingua per questo progetto come sarò generare questi file non in linea al fine di costruire il KML utilizzato altrove.
Ho guardato alcuni progetti, in particolare heatmap.py , che è un porto di < a href = "http://code.google.com/p/gheat/" rel = "nofollow noreferrer"> gheat in Python con KML esportazione. Ho colpito un muro di mattoni, nel senso che i progetti che ho trovato fino ad oggi tutti si basano sulla costruzione della heatmap dalla densità di [lat, lon] punti immessi nel algoritmo.
Se mi manca un modo ovvio per adattare il mio insieme di dati ad immettere in rete solo il [lat, lon] tuple, ma la regolazione come li do da mangiare utilizzando i valori di densità che ho, mi piacerebbe sapere!
Soluzione
Ehi Will, heatmap.py sono io. La vostra richiesta è un comune abbastanza ed è sulla mia lista di cose da indirizzo. Io non sono molto sicuro ancora come farlo in modo generale; nel gergo heatmap.py, sarebbe semplice per avere un dotsize
per-punto, invece di un dotsize globale come è ora, ma non sono sicuro che affronterà la vera necessità. Sto puntando per un rilascio estate 2010, ma probabilmente si potrebbe fare questo mod da soli.
Si può provare a cercare strumenti Kernel Density Estimator ; questo è quello che gli statistici chiamano heatmaps. R ha alcuni buoni strumenti integrati è possibile utilizzare che potrebbero soddisfare il vostro bisogno più rapidamente.
buona fortuna!
Altri suggerimenti
Credo che un modo per farlo è quello di creare una (più grande) lista di tuple con ogni punto ripetuti in base alla densità in quel punto. Un punto con una elevata densità è rappresentata da un sacco di punti uno sopra l'altro, mentre un punto con una bassa densità ha pochi punti. Così, invece di: [(120.7, 82.5, 2), (130.6, 81.5, 1)]
usereste [(120.7, 82.5), (120.7, 82.5), (130.6, 81.5)]
(un insieme di dati abbastanza noiosa).
Un problema possibile è che i vostri densità può ben essere carri, non interi, così si dovrebbe normalizzare e intorno ai dati. Un modo per fare la conversione è qualcosa di simile:
def dens2points (dens_tups):
min_dens = dens_tups[0][2]
for tup in dens_tups:
if (min_dens > tup[2]):
min_dens = tup[2]
print min_dens
result = []
for tup in dens_tups:
for i in range(int(tup[2]/min_dens)):
result.append((tup[0],tup[1]))
return result
if __name__ == "__main__":
input = [(10, 10, 20.0),(5, 5, 10.0),(10,10,0.9)]
output = dens2points(input)
print input
print output
(che non è molto divinatorio, ma sembra funzionare per il semplice caso di test). Questa subroutine dovrebbe convertire i dati in una forma che è accettato da heatmap.py. Con un piccolo sforzo credo che la subroutine può essere ridotto a due righe.
Ho aggiornato lo script heatmap.py
modo è possibile specificare una densità per ogni punto. I caricato le mie modifiche al mio blog . Non sono sicuro se lo farà esattamente quello che vuoi però!
Saluti, Alex