【问题标题】:Marker Clustering - Fusion Table Layer - Google Maps v3标记聚类 - 融合表层 - Google Maps v3
【发布时间】:2011-10-13 16:34:02
【问题描述】:

有没有办法让标记聚类(即makerclusterer)与融合表层一起工作?似乎您必须为 markerclusterer 分配标记,但在使用融合表层时,Google 正在处理标记/信息窗口?仍在尝试解决这个融合表的问题。

基本上是在寻找一种方法来对通过融合表提供的大量标记进行聚类

【问题讨论】:

    标签: google-maps google-maps-api-3 google-fusion-tables


    【解决方案1】:

    Fusion Table Layers 为覆盖在地图图块顶部的每个图块渲染一个额外的 png 图像,其中包含该图块的数据点,这是服务器端渲染部分。因此,每个图块包含多个数据点。

    从数据中生成您自己的标记,这是 MarkerClusterer 所必需的,它不会在每个图块上叠加图像,它会在地图上为每个数据点创建一个单独的标记,并在其上叠加一个精灵图像。

    基于此,无法使用 MarkerClusterer 和 FusionTablesLayer。

    【讨论】:

    • 跑过这篇文章,为自己研究这个。我想我会发表评论,是的,根据 Google Fusion Tables Team 的说法是可能的。 [groups.google.com/d/msg/fusion-tables-users-group/eW-der8-diM/…
    • @danagerous 在 FusionTablesLayer 上执行此操作与使用 Fusion Table 中的数据(如您提到的参考文章)之间存在很大差异。可以使用来自 Fusion Table 的数据来实现,但仍然无法使用在服务器端呈现的 FusionTablesLayer 来实现。他们必须在服务器端的每个缩放级别创建分组项目的图层。
    • @tentaclenorm 我刚刚测试了 URL。有效。它应该将您带到 Google Fusion Table API 用户组。未能在 Google 群组论坛中搜索具有相同地理位置的多个项目不显示
    • @danagerous 我刚刚注意到,当我单击它时,在 URL 的末尾附加了一个括号。一旦我移除该支架,它就可以工作。干杯,谢谢。
    • 我无法编辑。显然只有5分钟的窗口。这里又是网址。 groups.google.com/d/msg/fusion-tables-users-group/eW-der8-diM/…
    【解决方案2】:

    这是我自己的代码。我在早期链接中尝试了该技术,但它对我不起作用。所以我就是这样做的。

    首先我用常规的chart api查询来查询融合表

    function initialize() {
        mapMain = new google.maps.Map(document.getElementById('map-canvas'), {
            center: new google.maps.LatLng(37.4, -100.1),
            zoom: 3,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        });
        mc = new MarkerClusterer(mapMain);
        var queryText = encodeURIComponent("select wikipedia_article, xy from "+tableid);
        var query = new google.visualization.Query("https://www.google.com/fusiontables/gvizdata?tq="+queryText);
        query.send(handleQueryResponse);
    }
    

    接下来,在我的 handleQueryResponse 中,我动态创建了标记并将其添加到 Mapclusterer

    function handleQueryResponse(response){
         dataTable = response.getDataTable();
    
        for(var i=0; i< dataTable.getNumberOfRows();i++){           
            var hrefval = dataTable.getValue(i,0).toString();
    
            var arr = dataTable.getValue(i,1).toString().split(" ");            
            var latlng = new google.maps.LatLng(arr[0], arr[1]);
    
            var marker = new google.maps.Marker({
                position: latlng,
                map:mapMain
            });
            fn = markerClick(i, marker);
            google.maps.event.addListener(marker,'click', fn);          
            markers.push(marker);
        }
        mc.addMarkers(markers);
    }
    

    在这种情况下,主地图,标记数组(下面代码中的 mc)是全局变量。您可以查看完整的工作示例here

    【讨论】:

    • 你能总结一下他们在那个网站上做了什么,这样你的答案就不会受到链接腐烂的影响吗?
    • 这很有趣,我想对 FusionTableLayer 中加载的 KML 标记做同样的事情。你有什么例子吗?
    • 我很久以前做过这个,从那时起就没有做过任何基于谷歌地图的工作。
    • 您编写了任何服务器端代码来为标记生成数据?
    • 不,我只是用这种特殊情况下的数据填充了一个融合表。
    【解决方案3】:

    我认为您无法将其与融合表一起使用。 IMO 融合表缺乏对空间索引的支持。 A si 有助于将 2d 复杂度降低到 1d 复杂度。它用于许多应用程序,如热图、树图、邮政编码搜索、地图应用程序。您想查找 Nick 的希尔伯特曲线空间索引四叉树博客。

    【讨论】:

      【解决方案4】:

      Fusion Tables 允许您使用服务器端渲染(来自谷歌服务器)一次查看数千个点。 Marker Clusterer 通过从最近的点(来自客户端浏览器)构建一组集群来解决这个问题。我不一定会同时使用它们,但它可能适用于您的用例,这取决于您。

      您可以在此处阅读有关它们如何工作的更多信息:

      http://code.google.com/apis/maps/articles/toomanymarkers.html

      如果您也确实需要,可以使用 Fusion Tables API 将数据从 Fusion Tables 提供给 Marker Clusterer。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-06
        • 2015-01-12
        • 2011-07-05
        • 1970-01-01
        • 1970-01-01
        • 2013-06-21
        • 2012-01-08
        • 1970-01-01
        相关资源
        最近更新 更多