为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Google Maps API V3中从fromLatLngToDivPixel调用?

如何在Google Maps API V3中从fromLatLngToDivPixel调用?

呼唤远方 2019-10-26 13:22:15
我知道该方法存在并已记录,但我不知道如何获取MapCanvasProjection对象。
查看完整描述

3 回答

?
MM们

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

}


查看完整回答
反对 回复 2019-10-26
?
慕无忌1623718

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 。然后仅在此之后执行您需要做的事情。


查看完整回答
反对 回复 2019-10-26
  • 3 回答
  • 0 关注
  • 652 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号