我们可以在Google地图V3上制作自定义叠加层吗? [英] Can we make custom overlays draggable on google maps V3

查看:113
本文介绍了我们可以在Google地图V3上制作自定义叠加层吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这些标记是可拖动的,但我不能在悬停点击等标记上有一个自定义div。因此我想使用自定义覆盖,但我无法确定自定义覆盖是否支持拖动。已经有了一个答案,但演示本身不起作用,


解决方案

是的,我们可以。

我没有找到关于overlayView类的代码参考的任何内容。 b
$ b

  DraggableOverlay.prototype = new google.maps.OverlayView(); 

DraggableOverlay.prototype.onAdd = function(){
var container = document.createElement('div'),
that = this;
$ b $ if(typeof this.get('content')。nodeName!=='undefined'){
container.appendChild(this.get('content'));

else {
if(typeof this.get('content')==='string'){
container.innerHTML = this.get('content') ;
}
else {
return;
}
}
container.style.position ='absolute';
container.draggable = true;
google.maps.event.addDomListener(this.get('map')。getDiv(),
'mouseleave',
function(){
google.maps.event .trigger(container,'mouseup');
}
);

$ b google.maps.event.addDomListener(容器,
'mousedown',
函数(e){
this.style.cursor =' move';
that.map.set('draggable',false);
that.set('origin',e);

that.moveHandler =
google.maps.event.addDomListener(that.get('map')。getDiv(),$ b $'mousemove',
function(e){
var origin = that.get 'origin'),
left = origin.clientX-e.clientX,
top = origin.clientY-e.clientY,
pos = that.getProjection()
.fromLatLngToDivPixel (that.get('position')),
latLng = that.getProjection()
.fromDivPixelToLatLng(new google.maps.P oint(pos.x-left,
pos.y-top));
that.set('origin',e);
that.set('position',latLng);
that.draw();
});


}
);

google.maps.event.addDomListener(container,'mouseup',function(){
that.map.set('draggable',true);
this.style .cursor ='default';
google.maps.event.removeListener(that.moveHandler);
});


this.set('container',container)
this.getPanes()。floatPane.appendChild(container);
};

函数DraggableOverlay(map,position,content){
if(typeof draw ==='function'){
this.draw = draw;
}
this.setValues({
position:position,
container:null,
content:content,
map:map
} );
}



DraggableOverlay.prototype.draw = function(){
var pos = this.getProjection()。fromLatLngToDivPixel(this.get '位置'));
this.get('container')。style.left = pos.x +'px';
this.get('container')。style.top = pos.y +'px';
};

DraggableOverlay.prototype.onRemove = function(){
this.get('container')。parentNode.removeChild(this.get('container'));
this.set('container',null)
};

它观察mousemove事件并根据距离修改叠加层的顶部/左侧样式从最后一个鼠标位置开始。






用法:

  new DraggableOverlay(
map,// maps-instance
latLng,// google.maps.LatLng
'content',// HTML-String or DOMNode
function(){} //可选,用于绘制draw-method的函数
);

默认叠加层的左上角将放置在通过的latLng -argument。



要应用自定义绘图,请使用构造函数的可选draw-argument。




演示: http://jsfiddle.net/doktormolle/QRuW8/ strong>






编辑:
此解决方案仅适用于谷歌版本3.27映射api。
在3.28版本中,对地图的可拖动选项进行了更改。



发行说明: https://developers.google.com/maps/documentation/javascript/releases#328


The markers are draggable, but I cannot have a custom div on a marker which changes on hover click etc. hence I thought of using custom overlays, but I am not able to find out if custom overlay support drag. There is already an answer to this, but the demo itself does not work,

how to make a Custom Overlays draggable using google-maps v3

I didn't find anything on code reference for overlayView class.

解决方案

Yes, we can.

DraggableOverlay.prototype = new google.maps.OverlayView();

DraggableOverlay.prototype.onAdd = function() {
  var container=document.createElement('div'),
      that=this;

  if(typeof this.get('content').nodeName!=='undefined'){
    container.appendChild(this.get('content'));
  }
  else{
    if(typeof this.get('content')==='string'){
      container.innerHTML=this.get('content');
    }
    else{
      return;
    }
  }
  container.style.position='absolute';
  container.draggable=true;
      google.maps.event.addDomListener(this.get('map').getDiv(),
                                       'mouseleave',
                                        function(){
          google.maps.event.trigger(container,'mouseup');
        }
      );


      google.maps.event.addDomListener(container,
                                       'mousedown',
                                   function(e){
        this.style.cursor='move';
        that.map.set('draggable',false);
        that.set('origin',e);

        that.moveHandler  = 
              google.maps.event.addDomListener(that.get('map').getDiv(),   
                                               'mousemove',
                                               function(e){
             var origin = that.get('origin'),
                 left   = origin.clientX-e.clientX,
                 top    = origin.clientY-e.clientY,
                 pos    = that.getProjection()
                               .fromLatLngToDivPixel(that.get('position')),
                 latLng = that.getProjection()
                          .fromDivPixelToLatLng(new google.maps.Point(pos.x-left,
                                                                    pos.y-top));
                 that.set('origin',e);
                 that.set('position',latLng);
                 that.draw();
            });


        }
     );

      google.maps.event.addDomListener(container,'mouseup',function(){
        that.map.set('draggable',true);
        this.style.cursor='default';
        google.maps.event.removeListener(that.moveHandler);
      });


  this.set('container',container)
  this.getPanes().floatPane.appendChild(container);
};

function DraggableOverlay(map,position,content){
  if(typeof draw==='function'){
    this.draw=draw;
  }
  this.setValues({
                 position:position,
                 container:null,
                 content:content,
                 map:map
                 });
}



DraggableOverlay.prototype.draw = function() {
  var pos = this.getProjection().fromLatLngToDivPixel(this.get('position'));
  this.get('container').style.left = pos.x + 'px';
  this.get('container').style.top = pos.y + 'px';
};

DraggableOverlay.prototype.onRemove = function() {
  this.get('container').parentNode.removeChild(this.get('container'));
  this.set('container',null)
};

It observes the mousemove-event and modifies the top/left-style of the overlay based on the distance from the last mouse-position.


Usage:

new DraggableOverlay( 
       map,//maps-instance
       latLng,//google.maps.LatLng
       'content',//HTML-String or DOMNode
       function(){}//optional, function that ovverrides the draw-method
       );

The top-left-corner of the overlay by default will be placed at the position provided via the latLng-argument.

To apply a custom drawing use the optional draw-argument of the constructor .


Demo: http://jsfiddle.net/doktormolle/QRuW8/


Edit: This solution will only work up to version 3.27 of the google maps api. Within the release of 3.28 there were changes made on the draggable option of the map.

Release Notes: https://developers.google.com/maps/documentation/javascript/releases#328

这篇关于我们可以在Google地图V3上制作自定义叠加层吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆