Я использую слой Heatmap с Google Maps, чтобы отображать тепловую карту, однако у меня теперь слишком много очков, и она перестала работать, потому что браузер больше не справляется с этим. Я обнаружил, что они предоставляют таблицы Fusion, но они также ограничены: до 100 тыс. Строк, что слишком мало. Мне нужно отобразить тепловую карту миллионов или даже больше очков. Я был бы идеален, если бы у моего сервера мог быть какой-то PHP-скрипт для отображения тепловой карты, например, один раз в день. И тогда клиент из js просто загрузит предварительно загруженную карту памяти (на карте, например, карты Google, но может быть и другой картой). Возможно ли это с некоторыми существующими технологиями (может быть коммерческим)?
Создание слоя тепловой карты для миллионов пунктов
Ответ 1
Все, что вам нужно, - предварительно кластеризовать свои очки на меньшее количество очков и передать эти группы на Карты Google, как если бы это были ваши первоначальные баллы. Итак, если у вас было 3 соседних точки со значениями 3, 5 и 10, вы создаете одну точку со значением 18 в средневзвешенном значении своих координат. Сделайте это для всего набора данных, и вы уменьшите его 3 раза. Измените 3 на любое подходящее значение, чтобы еще больше уменьшить ваш набор данных.
Легкий способ скопировать ваши данные - использовать geohashing [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}"]);
}
}
}
Ответ 2
Я использую heatmap.js для визуализации. Это очень быстро и может обрабатывать множество точек. Не уверен, хотя если будет работать 1,5 миллиона очков.
Я могу представить, что использовать один из Javascript решений с node.js в prerender. Быстрый поиск google по поводу "heatmap js nodejs prerender" нашел мне этот https://github.com/substack/node-heatmap и этот https://mango-is.com/blog/engineering/pre-render-d3-js -графики-на-серверной стороне /