当前位置:   article > 正文

uniapp中通过webview实现百度地图Javascript Api 定位、路线规划、标记、导航_web实现地图导航

web实现地图导航

1.在百度地图开放平台 控制台新建应用,应用类型为 浏览器端,生成AK

2.实现 标记当前位置,点击获取附近数据并标记 Marker ,地点检索,数据传输到uniapp。配有详细注释,效果如下图:

代码如下:

  1. <template>
  2. <view class="map">
  3. <web-view src="/static/baidu-map/baidu-map.html" @message="getData"></web-view>
  4. </view>
  5. </template>
  6. <script>
  7. export default {
  8. data() {
  9. return {
  10. }
  11. },
  12. methods: {
  13. getData(event) {
  14. let data = event.detail.data;
  15. uni.setStorageSync('mapData',data)
  16. uni.navigateBack()
  17. }
  18. }
  19. }
  20. </script>
  21. <style>
  22. </style>

在static文件下创建baidu-map.html文件

baidu-map.html代码如下(把ak换为你申请的ak就可以直接用)

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
  6. <style type="text/css">
  7. body,html {width: 100%;height: 100%; margin: 0;font-family: "微软雅黑";}
  8. #allmap {height: 500px; width: 100%;overflow: hidden;}
  9. #result {height: calc(100% - 610px);width: 100%;font-size: 12px;}
  10. #resultText { height: 70px;font-size: 18px;padding: 6px;}
  11. #r-result {height: 40px;width: 100%;display: flex;align-items: center;justify-content: center;
  12. border-bottom: #A9A9A9 1px solid;margin-bottom: 2px;margin-top: 3px;}
  13. .btn {width: 100px;height: 34px;border: 1px solid #999;border-radius: 5px;margin: 0 auto;
  14. font-size: 18px;text-align: center;line-height: 34px;color: #333;background: #E8E7E3;}
  15. </style>
  16. <!-- 引入百度地图api 携带 AK -->
  17. <script type="text/javascript"
  18. src="http://api.map.baidu.com/api?v=2.0&ak=你申请的百度ak"></script>
  19. <!-- 引入搜索功能 -->
  20. <script type="text/javascript"
  21. src="http://api.map.baidu.com/library/SearchInfoWindow/1.5/src/SearchInfoWindow_min.js"></script>
  22. <link rel="stylesheet" href="http://api.map.baidu.com/library/SearchInfoWindow/1.5/src/SearchInfoWindow_min.css" />
  23. <!-- 引入 uni-app 的 SDK -->
  24. <script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
  25. <title>选择地址</title>
  26. </head>
  27. <body>
  28. <!-- 顶部搜索栏 -->
  29. <div id="search">
  30. <div id="r-result"><input type="text" id="suggestId" size="20" placeholder="位置搜索" value="百度"
  31. style="width:100%;height:40px;" /></div>
  32. <div id="searchResultPanel" style="border:1px solid #C0C0C0;width:150px;height:auto; display:none;"></div>
  33. </div>
  34. <!-- 地图 -->
  35. <div id="allmap"></div>
  36. <!-- 选中的位置回显 -->
  37. <div id="result">
  38. <div id="resultText"></div>
  39. <div class="btn">确定地点</div>
  40. </div>
  41. <script type="text/javascript">
  42. document.write('<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"><\/script>');
  43. var map = new BMap.Map('allmap');
  44. var poi = new BMap.Point(116.307852, 40.057031); //罗马的坐标
  45. var addressPost; //存储附近信息数据
  46. var CURRENT_LNG; //记录坐标
  47. var CURRENT_LAT; //记录坐标
  48. var lng, lat; //记录坐标
  49. map.centerAndZoom(poi, 18); //设置地图中心点 和 缩放等级
  50. map.enableScrollWheelZoom();//开启鼠标滚轮
  51. function G(id) {
  52. return document.getElementById(id);
  53. }
  54. //获取当前位置附近地址信息 --- geoc.getLocation
  55. var geoc = new BMap.Geocoder();
  56. var getCurrentLocation = function (lg, lt) {
  57. //geoc.getLocation 获取到 坐标 以及 包含附近地址信息的数组
  58. geoc.getLocation(new BMap.Point(lg, lt), function (rs) {
  59. //取数组第一个地址信息为选中的位置,也可现为地址列表
  60. var nearbyAddeessArr = rs.surroundingPois[0];
  61. document.getElementById('resultText').innerText = '当前位置 :' + nearbyAddeessArr.title + '——' + nearbyAddeessArr.address;
  62. addressPost = nearbyAddeessArr.title + '——' + nearbyAddeessArr.address;
  63. CURRENT_LNG = lg;
  64. CURRENT_LAT = lt;
  65. });
  66. }
  67. //通过浏览器获取当前定位的坐标
  68. var geolocation = new BMap.Geolocation();
  69. geolocation.getCurrentPosition(function (r) {
  70. if (this.getStatus() == BMAP_STATUS_SUCCESS) {
  71. var mk = new BMap.Marker(r.point);
  72. map.addOverlay(mk);
  73. map.panTo(r.point);
  74. lng = r.point.lng
  75. lat = r.point.lat
  76. getCurrentLocation(lng, lat)
  77. }
  78. else {
  79. alert('failed' + this.getStatus());
  80. }
  81. }, { enableHighAccuracy: true })
  82. //给地图添加点击事件 标记 marker
  83. map.addEventListener("touchstart", function (e) {
  84. map.clearOverlays();//清除地图上所有覆盖物 marker
  85. //获取坐标
  86. var lng = e.point.lng;
  87. var lat = e.point.lat;
  88. //创建marker标注位置
  89. var pt = new BMap.Point(lng, lat);
  90. //new BMap.Icon("本地marker图标路径",图标的尺寸,{marker偏移量,窗口的偏移量})
  91. var myIcon = new BMap.Icon("https://mapopen-website-wiki.cdn.bcebos.com/markers.png", new BMap.Size(19, 25), {
  92. anchor: new BMap.Size(10, 25),
  93. imageOffset: new BMap.Size(0, 0 - 12 * 25)
  94. });
  95. var marker2 = new BMap.Marker(pt, { icon: myIcon }); // 创建标注实例
  96. map.addOverlay(marker2); //将标注添加到地图中
  97. getCurrentLocation(lng, lat)
  98. });
  99. // 以下是地点检索功能
  100. //创建一个search实例
  101. var ac = new BMap.Autocomplete(
  102. {
  103. "input": "suggestId",
  104. "location": map
  105. });
  106. var myValue;//存储地址检索结果
  107. ac.addEventListener("onconfirm", function (e) { //鼠标点击下拉列表后的事件
  108. var _value = e.item.value;
  109. myValue = _value.province + _value.city + _value.district + _value.street + _value.business;
  110. G("searchResultPanel").innerHTML = "onconfirm<br />index = " + e.item.index + "<br />myValue = " + myValue;
  111. setPlace();
  112. });
  113. // 地图移动到检索的位置,并且标记
  114. function setPlace() {
  115. map.clearOverlays(); //清除地图上所有覆盖物
  116. function myFun() {
  117. var pp = local.getResults().getPoi(0).point; //获取第一个智能搜索的结果
  118. map.centerAndZoom(pp, 18);
  119. map.addOverlay(new BMap.Marker(pp)); //添加标注
  120. getCurrentLocation(pp.lng, pp.lat)
  121. }
  122. var local = new BMap.LocalSearch(map, { //智能搜索
  123. onSearchComplete: myFun
  124. });
  125. local.search(myValue);
  126. }
  127. //确定地址 将数据传输到 uniapp 的 webview内
  128. document.addEventListener('UniAppJSBridgeReady', function () {
  129. //uniapp 挂载完毕,在内部可以使用uniapp 部分 api,具体看 官方文档 webview
  130. document.querySelector('.btn').addEventListener('touchstart', function () {
  131. uni.postMessage({
  132. data: {
  133. addressPost,
  134. CURRENT_LNG,
  135. CURRENT_LAT
  136. }
  137. });
  138. })
  139. });
  140. </script>
  141. </body>
  142. </html>
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/639415
推荐阅读