我正在使用Google Maps API v3。我想在地图平移时不会移动的地图上创建文字叠加层。是操纵从MapPanes对象访问的DOM元素的最佳方法,还是最好创建一个自定义控件,即使除了显示文本之外它不会做很多事情?如何在Google Maps API v3中创建不能平移的文字叠加层?
7
A
回答
21
我发现为我工作的最简单方法是在创建新地图后添加了几行JavaScript代码。所以,在此之后:
map = new google.maps.Map('myMapDivId', mapOptions);
补充一点:
var myTitle = document.createElement('h1');
myTitle.style.color = 'white';
myTitle.innerHTML = 'Hello World';
var myTextDiv = document.createElement('div');
myTextDiv.appendChild(myTitle);
map.controls[google.maps.ControlPosition.BOTTOM_CENTER].push(myTextDiv);
你可能会想样式的文字看起来更好。
另一种方法是把格在你的HTML:
<div id="myTextDiv" style="color: white; position: absolute;">
<h1>Hello World</h1>
</div>
,然后做到这一点在你的JavaScript:
var myControl = document.getElementById('myTextDiv');
map.controls[google.maps.ControlPosition.TOP_CENTER].push(myControl);
注意一个重要的区别:如果你使用的HTML路由定义您的div,您必须在HTML中将位置样式设置为绝对位置以避免渲染问题。
5
从您所描述的情况来看,最好的方法是自定义控件。该文档是here。自定义控件可以像你想的那样简单或复杂。
为什么你想要使用地图窗格来解决这个问题的一个原因是,如果你想要这样一个“控制”位于标记/阴影/多段线之下等等。我现在正在做这个工作来显示十字线在任何时候都是地图的中心。但是因为我将它作为叠加层保留下来,所以我选择这些窗格以便标记在其上方,以便它们可以继续点击并与之交互 - 使用mapPane
。下面是我如何做它:
var CrosshairOverlay = function(map){
this._holder = null;
this.setMap(map);
};
CrosshairOverlay.prototype = new google.maps.OverlayView();
CrosshairOverlay.prototype.onAdd = function(){
var map = this.getMap();
var holder = this._holder = $('<div>').attr('id', 'crosshair')[0];
var crosshairPaper = this._paper = R(holder, 150, 150);
// ... all your drawing and rendering code here.
var projection = this.getProjection();
var wrappedHolder = $(holder);
var updateCrosshairPosition = function(){
var center = projection.fromLatLngToDivPixel(map.getCenter());
wrappedHolder.css({left:center.x-75, top:center.y-75});
}
_.each(['drag','dragend','bounds_changed','center_changed','zoom_changed','idle','resize'], function(event){
google.maps.event.addListener(map, event, updateCrosshairPosition);
});
google.maps.event.addListener(map, 'maptypeid_changed', function(){
_.defer(updateCrosshairPosition);
});
this.getPanes().mapPane.appendChild(holder);
};
CrosshairOverlay.prototype.draw = function(){
};
CrosshairOverlay.prototype.onRemove = function(){
this._holder.parentNode.removeChild(this._holder);
this._holder = null;
};
的maptypeid_changed
有自己的处理程序与defer
的原因是因为事件被触发之前地图改变类型时正确地设置自己的身体。在当前事件循环之后运行你的函数。
相关问题
- 1. Google Maps API v3 - 如何清除叠加层?
- 2. 在Google Maps API v3中切换图像叠加层
- 3. Google Maps JavaScript API V3 - 连续平移
- 4. 如何在Google Maps API V3中将地图平移到floatPane覆盖层?
- 5. 在Google Maps API V3中删除平移控制
- 6. Google Maps API v2 vs Google Maps API v3?
- 7. Google Maps API V3-在创建标记后添加侦听器
- 8. Google Maps API v3自定义叠加层未传递的点击事件
- 9. Google Maps API v3 BrowserIsCompatible
- 10. Google Maps API v3 - maxZoomService
- 11. Google Maps API V3:fromContainerPixelToLatLng
- 12. 如何在Google maps 3d flash api中创建平面标记?
- 13. Google Maps API v3 ...非移动设备?
- 14. 如何在Google Maps V3 API中构建这样的东西?
- 15. 动态创建Google Maps API V3脚本功能
- 16. 在Google Maps v3中切换KML图层
- 17. Google API V3:如何使用自定义叠加层的onRemove()方法删除叠加层
- 18. Google Maps API v3:为什么Google Maps API V3和Google Maps的搜索结果之间存在不一致?
- 19. 如何在css中创建叠加层?
- 20. 如何在Google Maps API v3中将标记添加到标记
- 21. Google Maps API v3:使用画布绘制的自定义叠加层不在Safari中接收事件
- 22. 来自Geoserver的Google Maps API v3 KML图层不显示
- 23. Google Maps API v3:将图层附加到MapTypeControl
- 24. Google Maps API v3 - 如何指定“VehicleType”
- 25. 如何在Google Maps v3中为每个标记创建infowindow?
- 26. Google Maps API v3 - 添加地标控件
- 27. Google Maps API(JS V3) - 逐行加载
- 28. Google maps API V3方法fitBounds()
- 29. google maps api v3 + infoBubble in markerClusterer
- 30. kml + google maps api v3 + geoxml3
位置:绝对 - 正是我所期待的。谢谢。 – user644745 2011-10-11 11:23:32
任何想法如何点击通过添加元素,以便地图可拖动下面? – yckart 2013-05-22 09:38:27
@yckart - 没有答案,但这两个SO问题有我会追求的答案:http://stackoverflow.com/questions/8002960/pass-left-click-message-to-html-element-below-another-one和http://stackoverflow.com/questions/3268791/javascript-click-through-element。祝你好运,如果你成功了,请回复。 – DaveBurns 2013-05-22 13:45:41