Генерация тепловой карты KML из заданного набора данных [широта, долгота, плотность] - PullRequest
5 голосов
/ 05 марта 2010

Я собираюсь создать статический файл KML (разметки Google Earth), который отображает рендеринг нескольких заданных наборов данных в стиле тепловых карт в виде кортежей [lat, lon, density].

Очень простой набор данных для плотности населения.

Мои требования:

  • Должен иметь возможность вводить данные для данного лата, долг.
  • Должен быть в состоянии указать плотность данных в этом лат, lon
  • Необходимо экспортировать в KML

Требования для этого проекта не зависят от языка, так как я буду создавать эти файлы в автономном режиме для создания KML, используемого в других местах.

Я рассмотрел несколько проектов, в частности heatmap.py , который представляет собой порт gheat в Python с экспортом KML. Я столкнулся с кирпичной стеной в том смысле, что все проекты, которые я нашел на сегодняшний день, основаны на построении тепловой карты из плотности точек [широта, долгота], введенных в алгоритм.

Если мне не хватает очевидного способа приспособить мой набор данных для подачи только в [широта, долгота] кортежей, но изменить способ их подачи с использованием имеющихся у меня значений плотности, я бы хотел знать!

Ответы [ 3 ]

4 голосов
/ 17 апреля 2010

Эй, Уилл, heatmap.py - это я.Ваш запрос является достаточно распространенным и находится в моем списке вещей для рассмотрения.Я пока не совсем уверен, как это сделать вообще;на языке heatmap.py было бы просто иметь точную dotsize вместо глобальной точки, как сейчас, но я не уверен, что это удовлетворит истинную потребность.Я планирую выпустить лето 2010 года, но вы, вероятно, можете сделать этот мод самостоятельно.

Вы можете попробовать поискать Оценка плотности ядра инструментов;это то, что статистики называют тепловыми картами. R имеет несколько хороших встроенных инструментов, которые вы можете использовать, чтобы удовлетворить ваши потребности быстрее.

удачи!

1 голос
/ 08 сентября 2010

Я обновил скрипт heatmap.py, чтобы вы могли указать плотность для каждой точки. Я загрузил свои изменения в свой блог . Не уверен, что он будет делать именно то, что вы хотите, хотя!

Cheers, Alex

1 голос
/ 01 апреля 2010

Я думаю, что один из способов сделать это - создать (больший) список кортежей, каждая точка которого будет повторяться в соответствии с плотностью в этой точке. Точка с высокой плотностью представлена ​​множеством точек друг над другом, в то время как точка с низкой плотностью имеет мало точек. Поэтому вместо: [(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

(который не очень питоничен, но, кажется, работает для простого тестового примера). Эта подпрограмма должна преобразовать ваши данные в форму, которая принята heatmap.py. Приложив немного усилий, я думаю, что подпрограмма может быть сокращена до двух строк.

...