【问题标题】:How to know zoom level to display a marker inside google marker cluster如何知道缩放级别以在谷歌标记集群中显示标记
【发布时间】:2014-02-24 14:20:06
【问题描述】:
嗯,几乎所有内容都在标题中:
- 我有数千个带有 google 标记簇的标记(不是 google 标记簇 plus:如果有帮助,请告诉我)
- 一切正常
但是
- 当我触发与特定标记相关的事件时,我想单独显示此标记(不再显示在集群中)。
- 由于标记的空间重新分区不均匀:在某些地方,缩放级别为 9 会单独显示它,但在另一个地方,我必须将缩放级别设置为 15。
所以
- 最终的问题是:给一个特定的制造商,如何“查询”标记集群来知道:
- 可能是距离最近的制造商的距离(假设我应该能够计算相应的缩放级别)
- 任何其他我当时仍然应该错过的有用信息......
【问题讨论】:
标签:
google-maps-api-3
zooming
markerclusterer
【解决方案1】:
我已经使用了这个解决方案。它检查所选标记是否在集群中。如果是则增加缩放级别。
var zoom = 15;
this.map.setCenter(marker.getPosition());
var zoomInterval = setInterval($.proxy(function() {
if(!marker.map) {
this.map.setZoom(zoom++);
} else {
clearInterval(zoomInterval);
}
}, this), 400);
请注意,如果标记在集群中,则它的“地图”属性为“空”。
【解决方案2】:
一些代码;)
/**
* Computes scale in meters per pixel for given zoom and latitute.
*
* @param {Object} opt optional parameters
* - zoom
* - lat
* - precision
*
* @returns {Number} scale in meters per pixel
*/
google.maps.Map.prototype.getMapScale = function (opt){
var circumference = 40075040,
zoom, lat, scale;
if (typeof(opt['zoom']) == 'number' && typeof(opt['lat']) == 'number') {
zoom = opt['zoom'];
lat = opt['lat'];
} else {
zoom = this.getZoom();
lat = this.getCenter().lat();
}
scale = (circumference * Math.cos(lat) / Math.pow(2, zoom + 8));
if (typeof(opt['precision']) == 'number') {
scale = Number(scale.toFixed(opt['precision']));
}
return scale;
}
function calculateZoomLevelMarkerAloneInCluster(VigneronID){
var distance = 1000000000;
var found_marker_in_cluster = false;
/* GET ALL CLUSTERS FROM GMAP MARKER CLUSTER */
var clustersArray = mc.getClusters();
/* FOR ALL CLUSTERS */
$.each(clustersArray, function(key, cluster){
var markersClusterArray = cluster.getMarkers();
/* FOR ALL MARKERS IN THIS CLUSTER */
$.each(markersClusterArray, function(key, marker){
/* IF I FIND MY MARKER */
if(marker.VigneronID === VigneronID){
/* MARKER IS IN CLUSTER : no need to process all markers */
found_marker_in_cluster = true;
/* THEN AGAIN : FOR ALL MARKERS IN THIS CLUSTER */
var distance_tmp = 0;
/* FOR ALL MARKERS IN THIS CLUSTER */
$.each(markersClusterArray, function(key, marker2){
/* ALL MARKERS EXCEPT MINE (otherwise distance will always be 0 :-) ) */
if(marker.VigneronID !== marker2.VigneronID){
/* CALCULATE DISTANCE BETWEEN MY MARKER : http://stackoverflow.com/questions/1502590/calculate-distance-between-two-points-in-google-maps-v3 */
distance_tmp = google.maps.geometry.spherical.computeDistanceBetween(marker.getPosition(), marker2.getPosition());
/* KEEP MIN DISTANCE */
if(distance_tmp < distance && distance_tmp!==0){
distance = distance_tmp;
}
}
});
/* NO REASON TO CONTINUE PROCESS : BREAK */
return false;
}
});
});
if(found_marker_in_cluster === false){
var markersClusterArray = mc.getMarkers()
$.each(markersClusterArray, function(key, marker){
if(marker.VigneronID === VigneronID){
var distance_tmp = 0;
/* FOR ALL MARKERS IN THIS CLUSTER */
$.each(markersClusterArray, function(key, marker2){
/* ALL MARKERS EXCEPT MINE (otherwise distance will always be 0 :-) ) */
if(marker.VigneronID !== marker2.VigneronID){
/* CALCULATE DISTANCE BETWEEN MY MARKER : http://stackoverflow.com/questions/1502590/calculate-distance-between-two-points-in-google-maps-v3 */
distance_tmp = google.maps.geometry.spherical.computeDistanceBetween(marker.getPosition(), marker2.getPosition());
/* KEEP MIN DISTANCE */
if(distance_tmp < distance && distance_tmp!==0){
distance = distance_tmp;
}
}
});
}
});
}
var mapScale = map.getMapScale({}); /* meters / pixels */
var gridSizePixels = mc.getGridSize(); /* in pixels */
var gridSizeMeters = gridSizePixels * mapScale;
if(distance!==1000000000 && distance!==0){
if(distance < gridSizeMeters){
var factor = get2Factor(gridSizeMeters, distance);
map.setZoom(map.getZoom() + factor);
} else{
var factor = get2Factor(distance, gridSizeMeters);
map.setZoom(map.getZoom() - factor + 1);
}
}
/*alert(distance);*/
}
function get2Factor(grid, distance){
var count = 0;
while(distance < grid){
count++;
grid = grid / 2;
}
return count;
}
一些解释:
首先代码被高度评价,所以请阅读它
其次:
第一个函数getMapScale在网上找到
在我使用这些函数之前,我需要先设置我的标记一个标识符(这里:marker.VigneronID),然后再推入标记集群
我在集群中进行第一次迭代以找到我的标记和到最近标记的距离(以米为单位)
如果我没有找到我的标记,这意味着它不在集群中,所以我对标记集群管理的所有标记进行第二次迭代,并获取到最近标记的距离(以米为单位)
然后我以米为单位计算 gridSize(感谢函数 getMapScale 以米为单位转换像素)
知道每个缩放级别是之前缩放级别的 2 倍,我计算我最近的标记和我的集群网格大小之间的距离,以了解我可以添加或减去多少缩放级别到当前缩放级别
是的!