第一次使用百度地图API

最近在项目中在添加客户功能时需要实现对客户地址进行地图选址的功能,包括添加页面的选址以及编辑页面的地址定位。现将第一次使用的心得记录下来。首先搜索百度地图的官网“http://lbsyun.baidu.com/”。找到“开发文档——web开发——JavaScript ApI”。在API文档中有详细的开发步骤和相关的Demo。

第一步:  申请百度账号和ak。应用名称可以自己随便取一个名字,只要符合其命名规范即可。应用类型需要选择浏览器端。由于是本地自己使用,我就将白名单设为*。点击提交去激活。激活成功后就会获得相关的ak。


第二步:将javaScript文件引入到我们的页面当中来。

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

第三步:创建地图容器元素。地图需要一个HTML元素作为容器,这样才能展现到页面上。这里我们创建了一个div元素。

 
   
  1. <div id="container"></div>
第四步:位于BMap命名空间下的Map类表示地图,通过new操作符可以创建一个地图实例。其参数可以是元素id也可以是元素对象。

 
   
  1. var map = new BMap.Map("BDMap",{enableMapClick: false});

注意:

1.在调用此构造函数时应确保容器元素已经添加到地图上。

2.命名空间 API使用BMap作为命名空间,所有类均在该命名空间之下,比如:BMap.MapBMap.ControlBMap.Overlay

3.第一个参数“BDMap”表示在id为BDMap的容器内添加一个地图。第二个参数主要为了防止选址时出现相关公交线路信息。如下所示。

第五步:设置地图中心点

这里我们使用BMap命名空间下的Point类来创建一个坐标点。Point类描述了一个地理坐标点,其中116.404表示经度,39.915表示纬度。(为天安门坐标)

 
    
  1. var point = new BMap.Point(116.404, 39.915);

请注意:在使用百度地图JavaScript API服务时,需使用百度BD09坐标,如使用其他坐标( WGS84GCJ02)进行展示,需先将其他坐标转换为BD09,详细说明请参考坐标转换说明,请勿使用非官方的转换方法!!

第六步:地图初始化,同时设置地图展示级别

在创建地图实例后,我们需要对其进行初始化,BMap.Map.centerAndZoom()方法要求设置中心点坐标和地图级别。 地图必须经过初始化才可以执行其他操作。

 
   
  1. map.centerAndZoom(point, 15);

注意:这里的point也可以使用String来代替,例如“北京”,这样的话zoom就会根据center自动调整。

以上就可以绘制出一副基本的地图了。

下面贴上在项目的相关javaScript代码。

 
    
  1. // 百度地图API功能
  2. // 绘制地图
  3. var map = new BMap.Map("BDMap",{enableMapClick: false});
  4. // 定位并显示当前地址
  5. theLocation();
  6. map.enableScrollWheelZoom(); //启用滚轮放大缩小,默认禁用
  7. map.enableContinuousZoom(); //启用地图惯性拖拽,默认禁用
  8. var top_left_control = new BMap.ScaleControl({anchor: BMAP_ANCHOR_TOP_LEFT});// 左上角,添加比例尺
  9. var top_left_navigation = new BMap.NavigationControl({type:BMAP_NAVIGATION_CONTROL_SMALL}); //左上角,添加默认缩放平移控件
  10. map.addControl(top_left_control);
  11. map.addControl(top_left_navigation);
  12. var ac = new BMap.Autocomplete( //建立一个自动完成的对象
  13. {"input" : "address"
  14. ,"location" : map
  15. });
  16. var c=document.getElementById("address").value;
  17. ac.setInputValue(c);
  18. ac.addEventListener("onhighlight", function(e) { //鼠标放在下拉列表上的事件
  19. var str = "";
  20. var _value = e.fromitem.value;
  21. var value = "";
  22. if (e.fromitem.index > -1) {
  23. value = _value.province + _value.city + _value.district + _value.street + _value.business;
  24. }
  25. str = "FromItem<br />index = " + e.fromitem.index + "<br />value = " + value;
  26. value = "";
  27. if (e.toitem.index > -1) {
  28. _value = e.toitem.value;
  29. value = _value.province + _value.city + _value.district + _value.street + _value.business;
  30. }
  31. str += "<br />ToItem<br />index = " + e.toitem.index + "<br />value = " + value;
  32. G("searchResultPanel").innerHTML = str;
  33. });
  34. var myValue;
  35. ac.addEventListener("onconfirm", function(e) { //鼠标点击下拉列表后的事件
  36. var _value = e.item.value;
  37. myValue = _value.province + _value.city + _value.district + _value.street + _value.business;
  38. G("searchResultPanel").innerHTML ="onconfirm<br />index = " + e.item.index + "<br />myValue = " + myValue;
  39. setPlace();
  40. });
  41. function G(id) {
  42. return document.getElementById(id);
  43. }
  44. function setPlace(){
  45. map.clearOverlays(); //清除地图上所有覆盖物
  46. function myFun(){
  47. var pp = local.getResults().getPoi(0).point; //获取第一个智能搜索的结果
  48. $("#longitude").val(pp.lng);//设置经纬度
  49. $("#latitude").val(pp.lat);
  50. map.centerAndZoom(pp, 18);
  51. map.addOverlay(new BMap.Marker(pp)); //添加标注
  52. }
  53. var local = new BMap.LocalSearch(map, { //智能搜索
  54. onSearchComplete: myFun
  55. });
  56. local.search(myValue);
  57. }
  58. // 用经纬度设置地图中心点
  59. function theLocation(){
  60. if(document.getElementById("longitude").value != "" && document.getElementById("latitude").value != ""){
  61. map.clearOverlays();
  62. var new_point = new BMap.Point(document.getElementById("longitude").value,document.getElementById("latitude").value);
  63. var marker = new BMap.Marker(new_point); // 创建标注
  64. map.centerAndZoom(new_point, 15);
  65. map.addOverlay(marker); // 将标注添加到地图中
  66. map.panTo(new_point);
  67. }else{
  68. map.centerAndZoom("无锡", 15);
  69. }
  70. }
  71. var geoc = new BMap.Geocoder();
  72. map.addEventListener("click", function(e){
  73. //通过点击百度地图,可以获取到对应的point, 由point的lng、lat属性就可以获取对应的经度纬度
  74. var pt = e.point;
  75. geoc.getLocation(pt, function(rs){
  76. //addressComponents对象可以获取到详细的地址信息
  77. var addComp = rs.addressComponents;
  78. var site = addComp.province + addComp.city + addComp.district + addComp.street + addComp.streetNumber;
  79. //将对应的HTML元素设置值
  80. $("#address").val(site);
  81. $("#longitude").val(pt.lng);
  82. $("#latitude").val(pt.lat);
  83. });
  84. });
 在项目中遇到的最大的问题就是,当保存了客户的相关地址信息之后。再次编辑时,用户在地图中的选址点和地址信息会一闪而过,变成初始化的状态。解决方法时再次编辑时
1.获取之前的经纬度进行地图中的标注创建(也就是那个红点)
 
     
  1. var new_point = new BMap.Point(document.getElementById("longitude").value,document.getElementById("latitude").value);
  2. var marker = new BMap.Marker(new_point); // 创建标注
  3. map.centerAndZoom(new_point, 15);
  4. map.addOverlay(marker); // 将标注添加到地图中
2.设置地图中心点为选中的地址
 
    
  1. map.panTo(new_point);
3.将地址值设置再次设置到input框中,否则地址为空。
 
    
  1. var c=document.getElementById("address").value;
  2. ac.setInputValue(c);
最终的显示效果如下。