2010-03-05 46 views
5

我正在尋找建立一個靜態KML(Google Earth標記)文件,該文件顯示幾個給定數據集的熱圖樣式呈現形式[lat,lon,density]元組。從給定的[lat,lon,density]數據集合生成KML熱圖

我擁有的一個非常簡單的數據集是用於人口密度。

我的要求是:

  • 必須能夠在數據養活的緯度給定的,LON
  • 必須能夠指定在該緯度的數據密度,LON
  • 必須導出KML

要求是語言不可知的這個項目,因爲我將離線生成這些文件,以建立其他地方使用的KML。

我已經看過幾個項目,最值得注意的是heatmap.py,它是Python中使用KML導出的端口gheat。我曾經碰到過一堵磚牆,因爲迄今爲止我發現的項目都依賴於從算法中輸入的[lat,lon]點密度構建熱圖。

如果我錯過了一個顯而易見的方法來調整我的數據集,只喂入[lat,lon]元組,但調整了我使用密度值餵食它們的方式,我很想知道!

回答

3

嘿,威爾,heatmap.py是我。你的要求是一個普通的要求,是我要解決的問題。我還不確定如何以一般方式這樣做;在heatmap.py的說法中,直接使用每點dotsize而不是像現在這樣的全局點數,但我不確定這會滿足真正的需求。我瞄準2010年夏季發佈,但你可以自己製作這個MOD。

您可以嘗試搜索Kernel Density Estimator工具;這就是統計學家所稱的熱圖。 R有一些可以使用的內置工具,可以更快地滿足您的需求。

好運!

+0

輝煌,感謝J·J! – 2010-04-18 15:43:46

+0

我發現縮放0-9應該有地板的大小,縮放15-19有天花板,並在兩者之間縮放。我發現在0-9時,只有1像素點是可行的,而在15-19時,超過64像素是沒有意義的。您是否看到了將此範圍納入您的KML方法的方法? – nessence 2010-09-22 16:43:03

1

我認爲一種方法是創建一個(更大的)元組列表,每個點根據當時的密度重複。密度較高的點由多個點表示,而密度較低的點只有少量點。所以,而不是:[(120.7, 82.5, 2), (130.6, 81.5, 1)]你會使用[(120.7, 82.5), (120.7, 82.5), (130.6, 81.5)](一個相當沉悶的數據集)。

一個可能的問題是您的密度很可能是漂浮物,而不是整數,因此您應該對數據進行歸一化和舍入。做轉換的一種方法是這樣的:

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 

(這是不是很Python的,但似乎很簡單的測試用例工作)。這個子程序應該將你的數據轉換爲heatmap.py所接受的表單。通過一點努力,我認爲子程序可以減少到兩行。

1

我更新了heatmap.py腳本,以便您可以爲每個點指定密度。我uploaded my changes to my blog。不知道它是否會做你想要的東西!

乾杯,亞歷克斯

+0

輝煌 - 感謝Alex!我會檢查出來的。 – 2010-09-10 10:05:13