Mak*_*ele 11 javascript php google-maps heatmap google-fusion-tables
我正在使用谷歌地图中的热图图层显示热图,但是,我现在有太多的点,它停止工作,因为浏览器无法再处理它了.我发现它们提供了Fusion Tables,但它们也有限:到100k行,这太低了.我需要渲染数百万的热图或者甚至更多的点.如果我的服务器可以有一些PHP脚本来渲染热图,例如,每天一次,我会很完美.然后来自js的客户端将只下载预加载的热图(在地图上像谷歌地图,但也可能是不同的地图).这是否可以通过一些现有技术(可以是商业的)?
小智 7
您所需要的只是将您的点预先聚类为较少数量的点,并将这些组传递给Google地图,就像它是您的原始点一样.因此,如果您有3个附近的值为3,5和10的点,则在坐标的加权平均值处创建一个值为18的点.对所有数据集执行此操作,您将减少3次.将3更改为任何适当的值以进一步减少数据集.
集群数据的简便方法是使用geohashing [1].这是PHP的很好的geohashing库[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}"]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1451 次 |
最近记录: |