Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为数以百万计的点生成热图层_Javascript_Php_Google Maps_Heatmap_Google Fusion Tables - Fatal编程技术网

Javascript 为数以百万计的点生成热图层

Javascript 为数以百万计的点生成热图层,javascript,php,google-maps,heatmap,google-fusion-tables,Javascript,Php,Google Maps,Heatmap,Google Fusion Tables,我正在使用谷歌地图的热图图层来显示热图,然而,我现在有太多的点,它停止了工作,因为浏览器无法再处理它了。我发现它们提供了融合表,但它们也受到限制:只有10万行,这太低了。我需要渲染百万分之一或更多点的热图。如果我的服务器可以有一些PHP脚本来渲染热图,例如,每天一次,那我就太完美了。然后js的一个客户端只需下载一个预装的热图(在地图上就像谷歌地图一样,但也可能是不同的地图)。使用某些现有技术(可以商业化)是否可能实现这一点?我用于可视化。它速度非常快,可以处理很多积分。但不确定1.5 mil点是

我正在使用谷歌地图的热图图层来显示热图,然而,我现在有太多的点,它停止了工作,因为浏览器无法再处理它了。我发现它们提供了融合表,但它们也受到限制:只有10万行,这太低了。我需要渲染百万分之一或更多点的热图。如果我的服务器可以有一些PHP脚本来渲染热图,例如,每天一次,那我就太完美了。然后js的一个客户端只需下载一个预装的热图(在地图上就像谷歌地图一样,但也可能是不同的地图)。使用某些现有技术(可以商业化)是否可能实现这一点?

我用于可视化。它速度非常快,可以处理很多积分。但不确定1.5 mil点是否有效

我可以想象的是,使用一个带有node.js的Javascript解决方案来预渲染。在谷歌上快速搜索“heatmap js nodejs prerender”,我发现了这个
而这

您所需要的只是将您的点预聚为较小数量的点,并将这些组传递给Google地图,就像它是您的原始点一样。所以,如果附近有3个值为3、5和10的点,则在其坐标的加权平均值处创建一个值为18的点。对所有数据集执行此操作,将使其减少3倍。将3更改为任何适当的值以进一步减少数据集

对数据进行集群的简单方法是使用地理哈希[1]。这是一个很好的PHP地理哈希库[2]。添加时,您可以只为每个点计算一次不同精度的地理哈希集,然后使用所需精度,使用simple
GROUP BY
减少数据集。示例(元):


  • 您真的需要始终显示所有点吗?你能不能不要只加载视口中的点,可能会限制最小缩放级别、地图容器尺寸等?是和否。现在,所有点都在一个城市周围,我想看到整个城市(今天大约150万点)。稍后,它将在其他城市提供,这样我就可以考虑它,但正如我所说的,对于一个城市来说,它仍然太多。我需要预渲染的热图:)Mapbox假装你可以在地图上加载数百万个点。看看他们的博客。我找到了,找到了。可能值得一试。您可以添加图像覆盖。这里有一个指向GoogleMaps开发者文档的链接:预生成热图并作为覆盖添加到javascript中。在长时间的加载后,它几乎不能在10万点的情况下工作。未来可能会有几千万点。它可以在php服务器上的cron任务上运行吗?nodejs可以安装在linux服务器上,当然可以通过cron任务运行。我发现的唯一PHP热图服务器端呈现是fusion表,您已经提到的fusion表不符合您的要求。因此,设置一个小的nodejs脚本并尝试生成一个热图,这可能是您的最佳选择。我现在无法测试这个答案,但它似乎是解决我问题的最佳解决方案:)请注意,这是一种让您了解情况的伪代码,实际实现将根据您的数据库而有所不同,ORM和框架。请随时提出其他问题。
    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}"]);
            }
        }
    }