如何在逻辑上划分为段的地图上显示标记(巨大的数字)?

Posted

技术标签:

【中文标题】如何在逻辑上划分为段的地图上显示标记(巨大的数字)?【英文标题】:How to display markers (huge numbers) on a map which has been logically divided into segments? 【发布时间】:2014-03-06 12:36:34 【问题描述】:

到目前为止我做了什么: 我正在开发一个应用程序,我必须在 Navteq 地图上显示超过(50K)个点/标记,分为不同的部分。 例如:如果我有 50K 点,我会将所有点分成不同的段。

如果我将50K 点分成50 段,每个段将有1000 点(可能不是 50 段,这可能取决于)。 现在它正在工作,但它需要很长时间并且挂起来渲染 MAP 上的所有点。所以我想执行分段显示以仅显示几个带有聚类的点。 这样我就可以了解该段的外观。

但这里的问题是我应该只根据段执行聚类。否则来自不同段的点将混合在一起并显示 作为单个单元,向用户传达了错误的信息。

所以我的问题是:是否可以根据段执行聚类。这样只有来自同一段的点才会被聚类。

注意:如果这不可能,我想使用最新版本的here-maps 2.5.3(异步)可能会在加载时减少一些时间,所以我想在加载时也使用索引功能渲染点 使用nokia.maps.clustering.Index 类改进渲染时间。

我研究了索引会减少在地图上渲染点/标记时的时间。对我有帮助吗?有人可以建议如何执行索引吗?

这是我在地图上显示点的代码:

function displayAllLightPoints(arrLightPointCoordinats, totalLightPoints, 
                    selectedSegmentId, totalSegmentsCount,segmentColorcode) 

    var MyTheme1 = function ()    
    ;
    segmentColorcode = segmentColorcode.substring(2,segmentColorcode.length-1);

    MyTheme1.prototype.getNoisePresentation = function (dataPoint) 
            var markerLightPoint = new nokia.maps.map.Marker(dataPoint, 
            icon: new nokia.maps.gfx.BitmapImage("..//Images//Lightpoint//" + 
                                                  segmentColorcode + ".png"),
            anchor: 
                x: 12,
                y: 12
            
        );
        return markerLightPoint;     
    ;

    MyTheme1.prototype.getClusterPresentation = function (data)    
        var markerLightPoint = new 
            nokia.maps.map.StandardMarker(data.getBounds().getCenter(), 
            icon: new nokia.maps.gfx.BitmapImage("..//Images//
                Segment/" + segmentColorcode + ".png", null, 66, 65),
            text: data.getSize(),
            zIndex: 2,
            anchor: 
                x: 12,
                y: 12
            
        );
        return markerLightPoint; 
    ;

    var ClusterProvider = nokia.maps.clustering.ClusterProvider,
        theme = new MyTheme1(),
        clusterProvider = new ClusterProvider(map, 
            eps: 0.00000000001,
            minPts: 1000000,
            strategy: nokia.maps.clustering.ClusterProvider.
                                     STRATEGY_DENSITY_BASED,
            theme: theme,
            dataPoints: []
        );
    var lightpointsDataSet1 = new Array();
    for (var i = 0; i < totalLightPoints; i++)      
        lightpointsDataSet1[i] =  latitude: arrLightPointCoordinats[i][0], 
             longitude: arrLightPointCoordinats[i][1], title:
            'LightPoint ' + (i + 1) ;
    

    clusterProvider.addAll(lightpointsDataSet1);
    clusterProvider.cluster();

【问题讨论】:

【参考方案1】:

为了处理非常大的 (50K+) 数据集,我会在服务器端进行所有繁重的数字运算,并在地图更新时发送新的 JSON 响应。类似于here 描述的 html 页面

代码的关键部分是ZoomObserver:

var zoomObserver = function (obj, key, newValue, oldValue) 
  zoom = newValue;
  if (zoom < 7)
     zoom = 7;
  if (zoom > 16)
     zoom = 16;
  // Define the XML filename to read that contains the marker data
  placeMarkersOnMaps('http://api.maps.nokia.com/downloads/java-me/cluster/'+ zoom + '.xml' 
    + '?lat1=' + map.getViewBounds().topLeft.latitude
    + '&lng1='+ map.getViewBounds().topLeft.longitude
    + '&lat2='+ map.getViewBounds().bottomRight.latitude
    + '&lng2='+ map.getViewBounds().bottomRight.longitude);
;

map.addObserver("zoomLevel", zoomObserver );

REST 服务返回“众所周知的”数据格式,可用于向地图添加标记和集群。

现在假设您有两个海量数据集,您可以向不同的端点发出两个请求,或者以某种方式区分哪个数据集群属于哪个数据集,以便您只返回以下形式的信息:

latitude':51.761,'longitude':14.33128,'value':102091,

即使用DataPoint 标准(这意味着您也可以使用热图。

当然,我在这里没有首先展示的是用于集群的后端功能——但这会让客户端(和 API)去做它最擅长的事情显示数据,而不是数字运算。

【讨论】:

以上是关于如何在逻辑上划分为段的地图上显示标记(巨大的数字)?的主要内容,如果未能解决你的问题,请参考以下文章

为什么我的脚本无法在Google地图上显示标记?

如何在android中的地图上显示当前位置标记?

如何仅在地图上的半径(圆圈)内显示标记?

在地图上显示多个标记时,单击标记时如何只打开一个信息窗口?

如何在 Android 上的 Google 地图上的标记旁边显示标签?

如何在每个谷歌地图标记上显示工具提示 [重复]