码迷,mamicode.com
首页 > 其他好文 > 详细

百度地图

时间:2016-11-08 20:16:50      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:asc   order   src   abs   marker   name   覆盖   onload   javascrip   

由于我最近做这个租房的网站,所以用到了百度地图,自己这几天好好读了一下百度地图的API,在这里谈谈对百度地图的认识和操作过程。

我们想要使用百度地图必须先申请一个百度接口的秘钥,申请成功之后我们就可以使用了,我们一点一点随着文档读写,首先就是连接:

<script src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥" type="text/javascript"></script>

如果是在移动平台上得添加:

 <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 

这样是为了保证在移动平台上正常显示。

JavaScript API支持异步加载,您可以在引用脚本的时候添加callback参数,当脚本加载完成后callback函数会被立刻调用。请参考下面的使用示例:

 1 <!DOCTYPE html>
 2 <html>
 3 
 4 <head>
 5     <meta charset="utf-8" />
 6     <title>异步加载</title>
 7     <script type="text/javascript">
 8         function initialize() {
 9             var mp = new BMap.Map(map);
10             mp.centerAndZoom(new BMap.Point(121.491, 31.233), 11);
11         }
12 
13         function loadScript() {
14             var script = document.createElement("script");
15             script.src = "http://api.map.baidu.com/api?v=2.0&ak=您的密钥&callback=initialize"; //此为v2.0版本的引用方式  
16             // http://api.map.baidu.com/api?v=1.4&ak=您的密钥&callback=initialize"; //此为v1.4版本及以前版本的引用方式  
17             document.body.appendChild(script);
18         }
19 
20         window.onload = loadScript;
21     </script>
22 </head>
23 
24 <body>
25     <div id="map" style="width:500px;height:320px"></div>
26 </body>
27 
28 </html>

以下代码创建了一个地图并以天安门作为地图的中心:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
 5     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 6     <title>Hello, World</title>
 7     <style type="text/css">
 8         html {
 9             height: 100%
10         }  
11         body {
12             height: 100%;
13             margin: 0px;
14             padding: 0px
15         }
16         #container {
17             height: 100%
18         }
19     </style>
20     <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥">
21         //v2.0版本的引用方式:src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"
22         //v1.4版本及以前版本的引用方式:src="http://api.map.baidu.com/api?v=1.4&key=您的密钥&callback=initialize"
23     </script>
24 </head>
25 <body>
26     <div id="container"></div>
27     <script type="text/javascript">
28         var map = new BMap.Map("container"); // 创建地图实例  
29         var point = new BMap.Point(116.404, 39.915); // 创建点坐标  
30         map.centerAndZoom(point, 15); // 初始化地图,设置中心点坐标和地图级别
31     </script>
32 </body>
33 </html>

至于样式我们可以在CSS中设置。

地图上有很多我们常见的控件,地图API的控件有:

  • Control:控件的抽象基类,所有控件均继承此类的方法、属性。通过此类您可实现自定义控件。
  • NavigationControl:地图平移缩放控件,PC端默认位于地图左上方,它包含控制地图的平移和缩放的功能。移动端提供缩放控件,默认位于地图右下方。
  • OverviewMapControl:缩略地图控件,默认位于地图右下方,是一个可折叠的缩略地图。
  • ScaleControl:比例尺控件,默认位于地图左下方,显示地图的比例关系。
  • MapTypeControl:地图类型控件,默认位于地图右上方。
  • CopyrightControl:版权控件,默认位于地图左下方。
  • GeolocationControl:定位控件,针对移动端开发,默认位于地图左下方。
map.addControl(new BMap.NavigationControl());    
map.addControl(new BMap.ScaleControl());    
map.addControl(new BMap.OverviewMapControl());    
map.addControl(new BMap.MapTypeControl());    
map.setCurrentCity("北京"); // 仅当设置城市信息时,MapTypeControl的切换功能才能可用

这些就是添加控件,我么还可以设置这些控件的位置,比如:

初始化控件时,可提供一个可选参数,其中的anchor和offset属性共同控制控件在地图上的位置。

控件停靠位置 anchor表示控件的停靠位置,即控件停靠在地图的哪个角。当地图尺寸发生变化时,控件会根据停靠位置的不同来调整自己的位置。anchor允许的值为:

  • BMAP_ANCHOR_TOP_LEFT 表示控件定位于地图的左上角。
  • BMAP_ANCHOR_TOP_RIGHT 表示控件定位于地图的右上角。
  • BMAP_ANCHOR_BOTTOM_LEFT 表示控件定位于地图的左下角。
  • BMAP_ANCHOR_BOTTOM_RIGHT 表示控件定位于地图的右下角。

控件位置偏移

除了指定停靠位置外,还可以通过偏移量来指示控件距离地图边界有多少像素。如果两个控件的停靠位置相同,那么控件可能会重叠在一起,这时就可以通过偏移值使二者分开显示。

本示例将比例尺放置在地图的左下角,由于API默认会有版权信息,因此需要添加一些偏移值以防止控件重叠。

1 var opts = {offset: new BMap.Size(150, 5)}    
2 map.addControl(new BMap.ScaleControl(opts));

修改控件配置

地图API的控件提供了丰富的配置参数,您可参考API文档来修改它们以便得到符合要求的控件外观。例如,NavigationControl控件就提供了如下类型:

  • BMAP_NAVIGATION_CONTROL_LARGE 表示显示完整的平移缩放控件。
  • BMAP_NAVIGATION_CONTROL_SMALL 表示显示小型的平移缩放控件。
  • BMAP_NAVIGATION_CONTROL_PAN 表示只显示控件的平移部分功能。
  • BMAP_NAVIGATION_CONTROL_ZOOM 表示只显示控件的缩放部分功能。

代码:

1 var opts = {type: BMAP_NAVIGATION_CONTROL_SMALL}    
2 map.addControl(new BMap.NavigationControl(opts));

定义构造函数并继承Control

首先您需要定义自定义控件的构造函数,并在构造函数中提供defaultAnchor和defaultOffset两个属性,以便API正确定位控件位置,接着让其继承于Control。在下面的示例中我们定义一个名为ZoomControl的控件,每一次点击将地图放大两个级别。它具有文本标识,而不是平移缩放控件中使用的图形图标。

1 // 定义一个控件类,即function    
2 function ZoomControl(){    
3     // 设置默认停靠位置和偏移量  
4     this.defaultAnchor = BMAP_ANCHOR_TOP_LEFT;    
5     this.defaultOffset = new BMap.Size(10, 10);    
6 }    
7 // 通过JavaScript的prototype属性继承于BMap.Control   
8 ZoomControl.prototype = new BMap.Control();

初始化自定义控件

当调用map.addControl()方法添加自定义控件时,API会调用该对象的initialize()方法用来初始化控件,您需要实现此方法并在其中创建控件所需的DOM元素,并添加DOM事件。所有自定义控件中的DOM元素最终都应该添加到地图容器(即地图所在的DOM元素)中去,地图容器可以通过map.getContainer()方法获得。最后initialize()方法需要返回控件容器的DOM元素。

 1 // 自定义控件必须实现initialize方法,并且将控件的DOM元素返回   
 2 // 在本方法中创建个div元素作为控件的容器,并将其添加到地图容器中   
 3 ZoomControl.prototype.initialize = function(map){    
 4 // 创建一个DOM元素   
 5  var div = document.createElement("div");    
 6 // 添加文字说明    
 7  div.appendChild(document.createTextNode("放大2级"));    
 8  // 设置样式    
 9  div.style.cursor = "pointer";    
10  div.style.border = "1px solid gray";    
11  div.style.backgroundColor = "white";    
12  // 绑定事件,点击一次放大两级    
13  div.onclick = function(e){  
14   map.zoomTo(map.getZoom() + 2);    
15  }    
16  // 添加DOM元素到地图中   
17  map.getContainer().appendChild(div);    
18  // 将DOM元素返回  
19  return div;    
20  }

添加自定义控件

添加自定义控件与添加其他控件方法一致,调用map.addControl()方法即可。

1 // 创建控件实例    
2 var myZoomCtrl = new ZoomControl();

标注

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

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

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

定义标注图标

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

 1 var map = new BMap.Map("container");    
 2 var point = new BMap.Point(116.404, 39.915);    
 3 map.centerAndZoom(point, 15);  // 编写自定义函数,创建标注   
 4 function addMarker(point, index){  // 创建图标对象   
 5 var myIcon = new BMap.Icon("markers.png", new BMap.Size(23, 25), {    
 6 // 指定定位位置。   
 7 // 当标注显示在地图上时,其所指向的地理位置距离图标左上    
 8 // 角各偏移10像素和25像素。您可以看到在本例中该位置即是   
 9    // 图标中央下端的尖角位置。    
10    offset: new BMap.Size(10, 25),    
11    // 设置图片偏移。   
12    // 当您需要从一幅较大的图片中截取某部分作为标注图标时,您   
13    // 需要指定大图的偏移位置,此做法与css sprites技术类似。    
14    imageOffset: new BMap.Size(0, 0 - index * 25)   // 设置图片偏移    
15  });      
16 // 创建标注对象并添加到地图   
17  var marker = new BMap.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 = new BMap.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 });

信息窗口

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

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

初始化自定义覆盖物

当调用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 = new BMap.Map("container");    
3 var point = new BMap.Point(116.404, 39.915);    
4 map.centerAndZoom(point, 15);    
5 // 添加自定义覆盖物   
6 var mySquare = new SquareOverlay(map.getCenter(), 100, "red");    
7 map.addOverlay(mySquare);

 

百度地图

标签:asc   order   src   abs   marker   name   覆盖   onload   javascrip   

原文地址:http://www.cnblogs.com/hgs-159/p/6044142.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!