如何在逻辑上划分为段的地图上显示标记(巨大的数字)?
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)去做它最擅长的事情显示数据,而不是数字运算。
【讨论】:
以上是关于如何在逻辑上划分为段的地图上显示标记(巨大的数字)?的主要内容,如果未能解决你的问题,请参考以下文章