2010-03-05 23 views
5

Estoy buscando construir un archivo estático KML (marcado de Google Earth) que muestre una representación de estilo de mapa de calor de unos pocos conjuntos de datos dados en forma de [lat, lon, densidad] tuplas.Generación de un mapa de calor KML a partir del conjunto de datos de [lat, lon, densidad]

Un conjunto de datos muy sencillo que tengo es para la densidad de población.

Mis requisitos son:

  • Debe ser capaz de alimentar de datos para un determinado lat, lon
  • debe ser capaz de especificar la densidad de los datos en ese lat, lon
  • debe exportar a KML

Los requisitos son independientes del idioma para este proyecto, ya que generaré estos archivos fuera de línea para construir el archivo KML utilizado en otro lugar.

He visto algunos proyectos, sobre todo heatmap.py, que es un puerto de gheat en Python con exportación KML. He golpeado una pared de ladrillos en el sentido de que los proyectos que he encontrado hasta la fecha se basan en construir el mapa de calor a partir de la densidad de [lat, lon] puntos alimentados en el algoritmo.

Si me falta una forma obvia de adaptar mi conjunto de datos para alimentar solo las [lat, lon] tuplas, pero ajustando cómo las alimento usando los valores de densidad que tengo, ¡me encantaría saberlo!

Respuesta

3

Hey Will, heatmap.py soy yo. Su solicitud es bastante común y está en mi lista de cosas que abordar. Todavía no estoy seguro de cómo hacerlo de manera general; en el lenguaje heatmap.py, sería sencillo tener un punto por cada dotsize en lugar de un tamaño de mapa global como lo es ahora, pero no estoy seguro de que vaya a abordar la verdadera necesidad. Estoy buscando un lanzamiento para el verano de 2010, pero probablemente puedas hacer esta modificación tú mismo.

Puede intentar buscar herramientas Kernel Density Estimator; eso es lo que los estadísticos llaman heatmaps. R tiene algunas buenas herramientas incorporadas que puede usar que podrían satisfacer su necesidad más rápidamente.

buena suerte!

+0

brillante, gracias JJ! –

+0

He encontrado que Zoom 0-9 debe tener el tamaño de piso, Zoom 15-19 tiene techo, y escala en el medio. He encontrado en 0-9, solo puntos de 1 píxel son viables y en 15-19, no tiene sentido tener más de 64px. ¿Ves una forma de incorporar este rango en tu metodología KML? – nessence

1

Creo que una forma de hacerlo es crear una lista (más grande) de tuplas con cada punto repetido según la densidad en ese punto. Un punto con una alta densidad está representado por muchos puntos uno encima del otro, mientras que un punto con una densidad baja tiene pocos puntos. Entonces, en lugar de: [(120.7, 82.5, 2), (130.6, 81.5, 1)], usaría [(120.7, 82.5), (120.7, 82.5), (130.6, 81.5)] (un conjunto de datos bastante aburrido).

Un problema posible es que las densidades pueden ser flotantes, no enteros, por lo que debe normalizar y redondear los datos. Una forma de hacer la conversión es algo como esto:

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 

(que no es muy Pythonic, pero parece funcionar para el caso simple prueba). Esta subrutina debe convertir sus datos en una forma que sea aceptada por heatmap.py. Con un poco de esfuerzo, creo que la subrutina se puede reducir a dos líneas.

1

He actualizado el script heatmap.py para que pueda especificar una densidad para cada punto. I uploaded my changes to my blog. ¡Sin embargo, no estoy seguro si hará exactamente lo que quiere!

Saludos, Alex

+0

Brillante - gracias Alex! Lo comprobaré. –

Cuestiones relacionadas