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



到目前为止我所做的工作:我正在开发一个应用程序,在该应用程序中,我必须在Navteq地图上显示(50K)个以上的点/标记,这些点/标记被划分为不同的段。例如:如果我有50K个点,我会把所有的点分成不同的段。

如果我将50K个点划分为50个分段,则每个分段将具有1000个点(可能不是50个分段,这可能取决于)。现在它正在工作,但渲染MAP上的所有点需要很长时间和挂起。因此,我想执行分段显示,以显示带有聚类的少数点。这样我就可以知道这个片段会是什么样子。

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

所以我的问题是:是否可以基于分段执行聚类。使得只有来自相同分段的点将被聚类。

注意:如果无法做到这一点,我希望使用here-maps 2.5.3的最新版本(异步),这可能会减少加载时的一些时间,因此我希望在渲染点时也使用索引功能以提高使用CCD_ 5类的渲染时间。

我研究了索引可以减少在地图上绘制点/标记的时间。对我来说有帮助吗?有人能建议一下如何进行索引吗?

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

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();
}

为了处理一个非常大(50K+)的数据集,我会在服务器端进行所有繁重的数字运算,并在地图更新时发送一个新的JSON响应。类似于这里描述的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)做它最擅长的事情显示数据,而不是数字运算。

最新更新