2010-03-05 19 views
5

Bir dizi verilmiş veri kümesinin bir ısı haritası stili oluşturulmasını görüntüleyen bir statik KML (Google Earth işaretlemesi) dosyası oluşturmak istiyorum. [lat, lon, yoğunluk] tuples.[lat, lon, yoğunluk] verilen veri kümesinden bir KML ısı haritası oluşturma

Sahip olduğum çok basit bir veri kümesi, nüfus yoğunluğu içindir.

Benim gereksinimleri şunlardır:

  • bir enlem verilen verilerinde beslemek için mümkün olmalı, boylam
  • o Lat de bilgi yoğunluğunu belirlemek mümkün olmalı, boylam
  • dışa olmalı KML
  • için

Bu proje için gerekenler, bu dosyaları başka bir yerde kullanılan KML'yi oluşturmak için çevrimdışı olarak oluşturacağım için, dil konusunda bir agnostiktir.

KML dışa aktarma ile Python'da gheat numaralı bağlantı noktası olan özellikle heatmap.py numaralı birkaç projeye baktım. Bugüne kadar bulduğum projelerin, ısı haritasının, algoritmaya beslenen [lat, lon] noktalarının yoğunluğundan yola çıkmasıyla bir tuğla duvara çarptım.

Veri kümemi yalnızca [lat, lon] boyutlarında beslemeye, ancak sahip olduğum yoğunluk değerlerini kullanarak onları nasıl beslediğime göre ayarlamaya yönelik açık bir yöntem eksikse, bunu bilmek isterim!

cevap

3

Hey Will, heatmap.py benim. İsteğiniz bir ortak-yeterince ve bir şeyleri adres listemde. Genel olarak nasıl yapılacağından henüz emin değilim; heatmap.py parlance'de, şimdi olduğu gibi global bir dotsize yerine dotsize numaralı bir noktaya sahip olmak kolay olurdu, ancak gerçek ihtiyacı karşılayacağından emin değilim. Bir yaz 2010 sürümü yayınlamayı hedefliyorum ama muhtemelen bu modu kendiniz yapabilirsiniz.

Kernel Density Estimator araçlarını aramayı deneyebilirsiniz; istatistikçilerin ısı haritası dedikleri budur. R, gereksiniminizi daha çabuk karşılayabilecek bazı iyi yerleşik araçlara sahiptir.

iyi şanslar!

+0

Parlak, teşekkür JJ! –

+0

Yakınlaştır 0-9 ile zemin arasında bir görüntü bulunamaydı, Zoom 15-19 modelinde tavan ve sırada olmalıdır. 0-9'da buldum, sadece 1 piksel noktaları geçerli ve 15-19'da, 64 pikselin üzerinde bir anlam ifade etmiyor. Bu aralığı KML metodolojinize dahil etmenin bir yolunu görüyor musunuz? – nessence

1

Bunu yapmanın bir yolunun, o noktadaki yoğunluğa göre tekrarlanan her noktaya sahip (daha büyük) bir tupl listesi oluşturması olduğunu düşünüyorum. Yüksek yoğunluklu bir nokta, birbirinin üstünde çok sayıda nokta ile temsil edilirken, düşük yoğunluğa sahip bir nokta, az sayıda noktaya sahiptir. Yani: [(120.7, 82.5, 2), (130.6, 81.5, 1)] yerine [(120.7, 82.5), (120.7, 82.5), (130.6, 81.5)] (oldukça sık rastlanan bir veri kümesi) kullanırsınız.

Muhtemel bir sorun, yoğunluklarınızın, tamsayılar değil de yüzer olabileceğidir, bu nedenle verileri normalleştirip tamamlamanız gerekir.

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 

(çok pythonic değil, basit bir test durumu için çalışmak gibi): dönüşüm yapmanın bir yolu, böyle bir şeydir. Bu alt yordam, verilerinizi heatmap.py tarafından kabul edilen bir forma dönüştürmelidir. Biraz çaba ile alt rutinin iki satıra indirilebileceğini düşünüyorum.

1

heatmap.py komut dosyasını güncelleyerek her nokta için bir yoğunluk belirtebilirsiniz. I uploaded my changes to my blog. Tam olarak istediğini yapıp yapmayacağından emin değilsin!

Alkış, Alex

+0

Parlak - teşekkürler Alex! Kontrol edeceğim. –