目錄
地图覆盖物概述
标注
信息窗口
自定义覆盖物
首頁 web前端 html教學 【07】覆盖物(百度地图覆盖物笔记)_html/css_WEB-ITnose

【07】覆盖物(百度地图覆盖物笔记)_html/css_WEB-ITnose

Jun 24, 2016 am 11:34 AM

【07】覆盖物

地图覆盖物概述

所有叠加或覆盖到地图的内容,我们统称为地图覆盖物。如标注、矢量图形元素(包括:折线和多边形和圆)、信息窗口等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动。

地图API提供了如下几种覆盖物:

Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法。

Marker:标注表示地图上的点,可自定义标注的图标。

Label:表示地图上的文本标注,您可以自定义标注的文本内容。

Polyline:表示地图上的折线。

Polygon:表示地图上的多边形。多边形类似于闭合的折线,另外您也可以为其添加填充颜色。

Circle: 表示地图上的圆。

InfoWindow:信息窗口也是一种特殊的覆盖物,它可以展示更为丰富的文字和多媒体信息。注意:同一时刻只能有一个信息窗口在地图上打开。

可以使用map.addOverlay方法向地图添加覆盖物,使用map.removeOverlay方法移除覆盖物,注意此方法不适用于InfoWindow。

标注

标注表示地图上的点。API提供了默认图标样式,您也可以通过Icon类来指定自定义图标。Marker的构造函数的参数为Point和 MarkerOptions(可选)。注意:当您使用自定义图标时,标注的地理坐标点将位于标注所用图标的中心位置,您可通过Icon的offset属性 修改标定位置。

下面的示例向地图中心点添加了一个标注,并使用默认的标注样式。

var map = new BMap.Map("container");var point = new BMap.Point(116.404, 39.915);    map.centerAndZoom(point, 15);var marker = new BMap.Marker(point);        // 创建标注    map.addOverlay(marker);                     // 将标注添加到地图中
登入後複製

定义标注图标

  1. var map =newBMap.Map("container");
  2. var point =newBMap.Point(116.404,39.915);
  3. map.centerAndZoom(point,15);
  4. var marker =newBMap.Marker(point);// 创建标注
  5. map.addOverlay(marker);// 将标注添加到地图中

通过Icon类可实现自定义标注的图标,下面示例通过参数MarkerOptions的icon属性进行设置,您也可以使用marker.setIcon()方法。

  1. var map =newBMap.Map("container");
  2. var point =newBMap.Point(116.404,39.915);
  3. map.centerAndZoom(point,15);// 编写自定义函数,创建标注
  4. function addMarker(point, index){// 创建图标对象
  5. var myIcon =newBMap.Icon("markers.png",newBMap.Size(23,25),{
  6. // 指定定位位置。
  7. // 当标注显示在地图上时,其所指向的地理位置距离图标左上
  8. // 角各偏移10像素和25像素。您可以看到在本例中该位置即是
  9. // 图标中央下端的尖角位置。
  10. offset:newBMap.Size(10,25),
  11. // 设置图片偏移。
  12. // 当您需要从一幅较大的图片中截取某部分作为标注图标时,您
  13. // 需要指定大图的偏移位置,此做法与css sprites技术类似。
  14. imageOffset:newBMap.Size(0,0- index *25)// 设置图片偏移
  15. });
  16. // 创建标注对象并添加到地图
  17. var marker =newBMap.Marker(point,{icon: myIcon});
  18. map.addOverlay(marker);
  19. }
  20. // 随机向地图添加10个标注
  21. var bounds = map.getBounds();
  22. var lngSpan = bounds.maxX - bounds.minX;
  23. var latSpan = bounds.maxY - bounds.minY;
  24. for(var i =0; i <10; i ++){
  25. var point =newBMap.Point(bounds.minX + lngSpan *(Math.random()*0.7+0.15),
  26. bounds.minY + latSpan *(Math.random()*0.7+0.15));
  27. addMarker(point, i);
  28. }

监听标注事件

事件方法与Map事件机制相同。可参考事件部分。

  1. marker.addEventListener("click",function(){
  2. alert("您点击了标注");
  3. });

可托拽的标注

marker的enableDragging和disableDragging方法可用来开启和关闭标注的拖拽功能。默认情况下标注不支持 拖拽,您需要调用marker.enableDragging()方法来开启拖拽功能。在标注开启拖拽功能后,您可以监听标注的dragend事件来捕获 拖拽后标注的最新位置。

  1. marker.enableDragging();
  2. marker.addEventListener("dragend",function(e){
  3. alert("当前位置:"+ e.point.lng +", "+ e.point.lat);
  4. })

内存释放

在API 1.0版本中,如果您需要在地图中反复添加大量的标注,这可能会占用较多的内存资源。如果您的标注在移除后不再使用,可调用 Overlay.dispose()方法来释放内存。注意在1.0版本中,调用此方法后标注将不能再次添加到地图上。自1.1版本开始,您不在需要使用此 方法来释放内存资源,API会自动帮助您完成此工作。

例如,您可以在标注被移除后调用此方法:

  1. map.removeOverlay(marker);
  2. marker.dispose();// 1.1 版本不需要这样调用

信息窗口

信息窗口在地图上方的浮动显示HTML内容。信息窗口可直接在地图上的任意位置打开,也可以在标注对象上打开(此时信息窗口的坐标与标注的坐标一致)。 您可以使用InfoWindow来创建一个信息窗实例,注意同一时刻地图上只能有一个信息窗口处于打开状态。

  1. var opts ={
  2. width :250,// 信息窗口宽度
  3. height:100,// 信息窗口高度
  4. title :"Hello"// 信息窗口标题
  5. }
  6. var infoWindow =newBMap.InfoWindow("World", opts);// 创建信息窗口对象
  7. map.openInfoWindow(infoWindow, map.getCenter());// 打开信息窗口

折线
登入後複製

Polyline表示地图上的折线覆盖物。它包含一组点,并将这些点连接起来形成折线。

添加折线

折线在地图上绘制为一系列直线段。可以自定义这些线段的颜色、粗细和透明度。颜色可以是十六进制数字形式(比如:#ff0000)或者是颜色关键字(比如:red)。

Polyline的绘制需要浏览器支持矢量绘制功能。在Internet Explorer中,地图使用VML绘制折线;在其他浏览器中使用SVG或者Canvas

以下代码段会在两点之间创建6像素宽的蓝色折线:

  1. var polyline =newBMap.Polyline([
  2. newBMap.Point(116.399,39.910),
  3. newBMap.Point(116.405,39.920)
  4. ],
  5. {strokeColor:"blue", strokeWeight:6, strokeOpacity:0.5}
  6. );
  7. map.addOverlay(polyline);

 

自定义覆盖物

API自1.1版本起支持用户自定义覆盖物。

要创建自定义覆盖物,您需要做以下工作:

1.定义一个自定义覆盖物的构造函数,通过构造函数参数可以传递一些自由的变量。

2.设置自定义覆盖物对象的prototype属性为Overlay的实例,以便继承覆盖物基类。

3.实现initialize方法,当调用map.addOverlay方法时,API会调用此方法。

4.实现draw方法。

定义构造函数并继承Overlay

首先您需要定义自定义覆盖物的构造函数,在下面的示例中我们定义一个名为SquareOverlay的构造函数,它包含中心点和边长两个参数,用来在地图上创建一个方形覆盖物。

  1. // 定义自定义覆盖物的构造函数
  2. functionSquareOverlay(center, length, color){
  3. this._center = center;
  4. this._length = length;
  5. this._color = color;
  6. }
  7. // 继承API的BMap.Overlay
  8. SquareOverlay.prototype =newBMap.Overlay();

 

初始化自定义覆盖物

当调用map.addOverlay方法添加自定义覆盖物时,API会调用该对象的initialize方法用来初始化覆盖物,在初始化过程中需要创建覆盖物所需要的DOM元素,并添加到地图相应的容器中。

地图提供了若干容器供覆盖物展示,通过map.getPanes方法可以得到这些容器元素,它们包括:

floatPane

markerMouseTarget

floatShadow

labelPane

markerPane

mapPane

这些对象代表了不同的覆盖物容器元素,它们之间存在着覆盖关系,最上一层为floatPane,用于显示信息窗口内容,下面依次为标注点击区域层、信息窗口阴影层、文本标注层、标注层和矢量图形层。

我们自定义的方形覆盖物可以添加到任意图层上,这里我们选择添加到markerPane上,作为其一个子结点。

  1. // 实现初始化方法
  2. SquareOverlay.prototype.initialize =function(map){
  3. // 保存map对象实例
  4. this._map = map;
  5. // 创建div元素,作为自定义覆盖物的容器
  6. var div = document.createElement("div");
  7. div.style.position ="absolute";
  8. // 可以根据参数设置元素外观
  9. div.style.width =this._length +"px";
  10. div.style.height =this._length +"px";
  11. div.style.background =this._color;
  12. // 将div添加到覆盖物容器中
  13. map.getPanes().markerPane.appendChild(div);
  14. // 保存div实例
  15. this._div = div;
  16. // 需要将div元素作为方法的返回值,当调用该覆盖物的show、
  17. // hide方法,或者对覆盖物进行移除时,API都将操作此元素。
  18. return div;
  19. }

 

绘制覆盖物

到目前为止,我们仅仅把覆盖物添加到了地图上,但是并没有将它放置在正确的位置上。您需要在draw方法中设置覆盖物的位置,每当地图状态 发生变化(比如:位置移动、级别变化)时,API都会调用覆盖物的draw方法,用于重新计算覆盖物的位置。通过 map.pointToOverlayPixel方法可以将地理坐标转换到覆盖物的所需要的像素坐标。

  1. // 实现绘制方法
  2. SquareOverlay.prototype.draw =function(){
  3. // 根据地理坐标转换为像素坐标,并设置给容器
  4. var position =this._map.pointToOverlayPixel(this._center);
  5. this._div.style.left = position.x -this._length /2+"px";
  6. this._div.style.top = position.y -this._length /2+"px";
  7. }

 

移除覆盖物

当调用map.removeOverlay或者map.clearOverlays方法时,API会自动将initialize方法返回的DOM元素进行移除。

显示和隐藏覆盖物

自定义覆盖物会自动继承Overlay的show和hide方法,方法会修改由initialize方法返回的DOM元素的style.display属性。如果自定义覆盖物元素较为复杂,您也可以自己实现show和hide方法。

  1. // 实现显示方法
  2. SquareOverlay.prototype.show =function(){
  3. if(this._div){
  4. this._div.style.display ="";
  5. }
  6. }
  7. // 实现隐藏方法
  8. SquareOverlay.prototype.hide =function(){
  9. if(this._div){
  10. this._div.style.display ="none";
  11. }
  12. }

 

自定义其他方法 通过构造函数的prototype属性,您可以添加任何自定义的方法,比如下面这个方法每调用一次就能改变覆盖物的显示状态:

  1. // 添加自定义方法
  2. SquareOverlay.prototype.toggle =function(){
  3. if(this._div){
  4. if(this._div.style.display ==""){
  5. this.hide();
  6. }
  7. else{
  8. this.show();
  9. }
  10. }
  11. }

 

添加覆盖物

您现在已经完成了一个完整的自定义覆盖物的编写,可以添加到地图上了。

  1. // 初始化地图
  2. var map =newBMap.Map("container");
  3. var point =newBMap.Point(116.404,39.915);
  4. map.centerAndZoom(point,15);
  5. // 添加自定义覆盖物
  6. var mySquare =newSquareOverlay(map.getCenter(),100,"red");
  7. map.addOverlay(mySquare);

 



来自为知笔记(Wiz)



本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1250
24
了解HTML,CSS和JavaScript:初學者指南 了解HTML,CSS和JavaScript:初學者指南 Apr 12, 2025 am 12:02 AM

WebDevelovermentReliesonHtml,CSS和JavaScript:1)HTMLStructuresContent,2)CSSStyleSIT和3)JavaScriptAddSstractivity,形成thebasisofmodernWebemodernWebExexperiences。

HTML:結構,CSS:樣式,JavaScript:行為 HTML:結構,CSS:樣式,JavaScript:行為 Apr 18, 2025 am 12:09 AM

HTML、CSS和JavaScript在Web開發中的作用分別是:1.HTML定義網頁結構,2.CSS控製網頁樣式,3.JavaScript添加動態行為。它們共同構建了現代網站的框架、美觀和交互性。

HTML,CSS和JavaScript的未來:網絡開發趨勢 HTML,CSS和JavaScript的未來:網絡開發趨勢 Apr 19, 2025 am 12:02 AM

HTML的未來趨勢是語義化和Web組件,CSS的未來趨勢是CSS-in-JS和CSSHoudini,JavaScript的未來趨勢是WebAssembly和Serverless。 1.HTML的語義化提高可訪問性和SEO效果,Web組件提升開發效率但需注意瀏覽器兼容性。 2.CSS-in-JS增強樣式管理靈活性但可能增大文件體積,CSSHoudini允許直接操作CSS渲染。 3.WebAssembly優化瀏覽器應用性能但學習曲線陡,Serverless簡化開發但需優化冷啟動問題。

HTML的未來:網絡設計的發展和趨勢 HTML的未來:網絡設計的發展和趨勢 Apr 17, 2025 am 12:12 AM

HTML的未來充滿了無限可能。 1)新功能和標準將包括更多的語義化標籤和WebComponents的普及。 2)網頁設計趨勢將繼續向響應式和無障礙設計發展。 3)性能優化將通過響應式圖片加載和延遲加載技術提升用戶體驗。

HTML與CSS vs. JavaScript:比較概述 HTML與CSS vs. JavaScript:比較概述 Apr 16, 2025 am 12:04 AM

HTML、CSS和JavaScript在網頁開發中的角色分別是:HTML負責內容結構,CSS負責樣式,JavaScript負責動態行為。 1.HTML通過標籤定義網頁結構和內容,確保語義化。 2.CSS通過選擇器和屬性控製網頁樣式,使其美觀易讀。 3.JavaScript通過腳本控製網頁行為,實現動態和交互功能。

HTML:建立網頁的結構 HTML:建立網頁的結構 Apr 14, 2025 am 12:14 AM

HTML是構建網頁結構的基石。 1.HTML定義內容結構和語義,使用、、等標籤。 2.提供語義化標記,如、、等,提升SEO效果。 3.通過標籤實現用戶交互,需注意表單驗證。 4.使用、等高級元素結合JavaScript實現動態效果。 5.常見錯誤包括標籤未閉合和屬性值未加引號,需使用驗證工具。 6.優化策略包括減少HTTP請求、壓縮HTML、使用語義化標籤等。

HTML與CSS和JavaScript:比較Web技術 HTML與CSS和JavaScript:比較Web技術 Apr 23, 2025 am 12:05 AM

HTML、CSS和JavaScript是構建現代網頁的核心技術:1.HTML定義網頁結構,2.CSS負責網頁外觀,3.JavaScript提供網頁動態和交互性,它們共同作用,打造出用戶體驗良好的網站。

HTML:是編程語言還是其他? HTML:是編程語言還是其他? Apr 15, 2025 am 12:13 AM

HTMLISNOTAPROGRAMMENGUAGE; ITISAMARKUMARKUPLAGUAGE.1)htmlStructures andFormatSwebContentusingtags.2)itworkswithcsssforstylingandjavascript for Interactivity,增強WebevebDevelopment。

See all articles