Создание слоя тепловой карты для миллионов точек - PullRequest
0 голосов
/ 15 мая 2018

Я использую слой тепловой карты из Google Maps для отображения тепловой карты, однако у меня теперь слишком много точек, и она перестала работать, потому что браузер больше не может ее обрабатывать.Я обнаружил, что они предоставляют Fusion Tables, но они также ограничены: до 100 тыс. Строк, что слишком мало.Мне нужно сделать тепловую карту миллионов или, может быть, даже больше очков.Я был бы идеален, если бы на моем сервере был какой-нибудь PHP-скрипт для рендеринга тепловой карты, например, один раз в день.И тогда клиент из js просто загрузит предварительно загруженную тепловую карту (на карте, как карты Google, но может быть и другая карта).Возможно ли это с какой-то существующей технологией (может быть коммерческой)?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Все, что вам нужно, это предварительно сгруппировать ваши точки в меньшее количество точек и передать эти группы в Google Maps, как если бы это были ваши исходные точки. Итак, если у вас было 3 соседних точки со значениями 3, 5 и 10, вы создаете одну точку со значением 18 при средневзвешенном значении их координат. Сделайте это для всего набора данных, и вы уменьшите его в 3 раза. Измените 3 на любое подходящее значение, чтобы еще больше уменьшить ваш набор данных.

Самый простой способ кластеризации ваших данных - использовать геохеширование [1]. Вот хорошая библиотека геохеширования для PHP [2]. Вы можете вычислить набор геохешей различной точности для каждой из ваших точек только один раз при добавлении, а затем использовать желаемую точность, чтобы уменьшить набор данных, используя простой GROUP BY. Пример (мета):

use Lvht\GeoHash;

class DataPoint extends ActiveRecord {
    public geo_hash_precision4, geo_hash_precision5, geo_hash_precision6;
    public function save() {
        $this->geo_hash_precision4 = GeoHash::encode($this->lat,$this->lon, 0.0001);
        $this->geo_hash_precision5 = GeoHash::encode($this->lat,$this->lon, 0.00001);
        $this->geo_hash_precision6 = GeoHash::encode($this->lat,$this->lon, 0.000001);
        parent::save();
    }
}

class DataSet extends ActiveQuery {
    /**
     * @param int $p Desired precision
     */
    public function getValues($p = 6) {
        $data = $this->rawQuery("SELECT geo_hash_precision{$p}, SUM(value) FROM {$this->table} GROUP BY geo_hash_precision{$p}");
        // Add bounding box WHERE to reduce set for map size
        foreach ($data as $row) {
            list($minLon, $maxLon, $minLat, $maxLat) = GeoHash::decode($row["geo_hash_precision{$p}"]);
            $row['lat'] = ($maxLat - $minLat) / 2;
            $row['lon'] = ($maxLon - $minLon) / 2;
            unset($row["geo_hash_precision{$p}"]);
        }
    }
}
  1. https://en.wikipedia.org/wiki/Geohash
  2. https://github.com/lvht/geohash
0 голосов
/ 18 мая 2018

Я использую heatmap.js для визуализации.Это действительно быстро и может обрабатывать много точек.Не уверен, хотя, если 1,5 миллиона очков будут работать.

То, что я могу себе представить, это использовать одно из решений Javascript с node.js для предварительной визуализации.Быстрый поиск в Google по поводу «тепловая карта js nodejs prerender» обнаружил, что это https://github.com/substack/node-heatmap и это https://mango -is.com / blog / engineering / pre-render-d3-js-charts-at-server-side /

...