3 回答

TA贡献1886条经验 获得超2个赞
我认为最简单的方法是忽略Google的愿望,即删除和隐藏有用的功能而不是添加新功能,而只是编写自己的方法来完成相同的工作,从而使我们的生活更加艰难。
这是某人发布的功能的版本(我现在找不到),它对我有用:
fromLatLngToPixel: function (position) {
var scale = Math.pow(2, Map.getZoom());
var proj = Map.getProjection();
var bounds = Map.getBounds();
var nw = proj.fromLatLngToPoint(
new google.maps.LatLng(
bounds.getNorthEast().lat(),
bounds.getSouthWest().lng()
));
var point = proj.fromLatLngToPoint(position);
return new google.maps.Point(
Math.floor((point.x - nw.x) * scale),
Math.floor((point.y - nw.y) * scale));
},
现在,您可以随时随地调用它。对于自定义上下文菜单,我特别需要它,并且它确实可以很好地工作。
编辑:我还写了一个反向函数,fromPixelToLatLng恰好相反。它仅基于第一个,并应用了一些数学运算:
fromPixelToLatLng: function (pixel) {
var scale = Math.pow(2, Map.getZoom());
var proj = Map.getProjection();
var bounds = Map.getBounds();
var nw = proj.fromLatLngToPoint(
new google.maps.LatLng(
bounds.getNorthEast().lat(),
bounds.getSouthWest().lng()
));
var point = new google.maps.Point();
point.x = pixel.x / scale + nw.x;
point.y = pixel.y / scale + nw.y;
return proj.fromPointToLatLng(point);
}

TA贡献1744条经验 获得超4个赞
我对这里的答案不满意。因此,我进行了一些实验,找到了“最简单”的工作解决方案,该解决方案与Ralph的答案很接近,但希望可以理解。(希望Google使此功能更易于使用!)
首先,您声明一个OverlayView像这样的子类:
function CanvasProjectionOverlay() {}
CanvasProjectionOverlay.prototype = new google.maps.OverlayView();
CanvasProjectionOverlay.prototype.constructor = CanvasProjectionOverlay;
CanvasProjectionOverlay.prototype.onAdd = function(){};
CanvasProjectionOverlay.prototype.draw = function(){};
CanvasProjectionOverlay.prototype.onRemove = function(){};
然后在代码中实例化地图的其他地方,您也实例化此OverlayView并设置其地图,如下所示:
var map = new google.maps.Map(document.getElementById('google-map'), mapOptions);
// Add canvas projection overlay so we can use the LatLng to pixel converter
var canvasProjectionOverlay = new CanvasProjectionOverlay();
canvasProjectionOverlay.setMap(map);
然后,每当需要使用时fromLatLngToContainerPixel,只需执行以下操作:
canvasProjectionOverlay.getProjection().fromLatLngToContainerPixel(myLatLng);
请注意,由于MapCanvasProjection对象仅在draw()调用一次(即在地图的某个时间之前)后才可用,因此idle我建议创建一个布尔值“ mapInitialized”标志,并在第一个地图idle回调中将其设置为true 。然后仅在此之后执行您需要做的事情。
添加回答
举报