__uniappopenlocation.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <script>
  6. var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
  7. document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')
  8. </script>
  9. <title></title>
  10. <style>
  11. html,
  12. body,
  13. .container {
  14. margin: 0;
  15. padding: 0;
  16. position: absolute;
  17. left: 0;
  18. top: 0;
  19. right: 0;
  20. bottom: 0;
  21. background: #ffffff;
  22. }
  23. #map {
  24. position: absolute;
  25. left: 0;
  26. top: 0;
  27. right: 0;
  28. bottom: 80px;
  29. bottom: calc(80px + constant(safe-area-inset-bottom));
  30. bottom: calc(80px + env(safe-area-inset-bottom));
  31. }
  32. #poi {
  33. position: absolute;
  34. left: 0;
  35. right: 0;
  36. bottom: 0;
  37. bottom: constant(safe-area-inset-bottom);
  38. bottom: env(safe-area-inset-bottom);
  39. height: 80px;
  40. background: #FFFFFF;
  41. }
  42. .poi-info {
  43. width: 100%;
  44. padding: 23px 16px 23px 18px;
  45. box-sizing: border-box;
  46. background: #FFFFFF;
  47. }
  48. .poi-name {
  49. font-size: 17px;
  50. line-height: 17px;
  51. color: #111111;
  52. display: block;
  53. margin-right: 70px;
  54. word-wrap: break-word;
  55. }
  56. .poi-addr {
  57. font-size: 13px;
  58. line-height: 13px;
  59. color: #666666;
  60. display: block;
  61. margin-top: 4px;
  62. margin-right: 70px;
  63. word-wrap: break-word;
  64. }
  65. .poi-nav {
  66. display: block;
  67. position: absolute;
  68. top: 10px;
  69. right: 16px;
  70. width: 60px;
  71. height: 60px;
  72. border-radius: 60px;
  73. overflow: hidden;
  74. }
  75. .poi-nav i,
  76. .poi-nav span {
  77. position: absolute;
  78. top: 0;
  79. width: 100%;
  80. height: 100%;
  81. display: inline-block;
  82. border-radius: 60px;
  83. }
  84. .poi-nav i {
  85. background: url(data:image/png;base64,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) no-repeat;
  86. background-size: 100%;
  87. }
  88. </style>
  89. </head>
  90. <body>
  91. <div id="container" class="container">
  92. <div id="map"></div>
  93. <div id="poi">
  94. <div class="poi-info">
  95. <span class="poi-name"></span>
  96. <span class="poi-addr"></span>
  97. <div class="poi-nav">
  98. <i></i>
  99. <span></span>
  100. </div>
  101. </div>
  102. </div>
  103. </div>
  104. <script>
  105. var loc;
  106. var serviceWebview;
  107. var back = function() {
  108. var webview = plus.webview.currentWebview()
  109. if (webview.__uniapp_statusbar_style === 'light') {
  110. plus.navigator.setStatusBarStyle('light')
  111. }
  112. webview.close('auto');
  113. };
  114. var isIos = !!navigator.userAgent.match(/iPhone|iPad|iPod/i);
  115. document.addEventListener('plusready', function() {
  116. serviceWebview = plus.webview.getWebviewById('__W2A_CONTEXT_') || plus.webview.getLaunchWebview();
  117. plus.key.addEventListener('backbutton', back);
  118. })
  119. /**
  120. * 调用系统第三方程序进行导航
  121. */
  122. function openSysMap(lat, lng, title) {
  123. /**
  124. * 网页版地图源
  125. */
  126. var mapsSourceWeb = [
  127. {
  128. title: '腾讯地图网页版',
  129. getUrl: function() {
  130. var url
  131. url = 'https://apis.map.qq.com/uri/v1/routeplan?type=drive' + '&to=' +
  132. encodeURIComponent(title) + '&tocoord=' + encodeURIComponent(lat + ',' + lng) +
  133. '&referer=APP'
  134. return url
  135. }
  136. }
  137. ]
  138. /**
  139. * APP版地图源
  140. */
  141. var mapsSource = [
  142. {
  143. title: '高德地图',
  144. pname: 'com.autonavi.minimap',
  145. action: !isIos ? 'amapuri://' : 'iosamap://',
  146. getUrl: function() {
  147. var url
  148. if (!isIos) {
  149. url = 'amapuri://route/plan/'
  150. } else {
  151. url = 'iosamap://path'
  152. }
  153. url += '?sourceApplication=APP&dname=' + encodeURIComponent(title) + '&dlat=' + lat +
  154. '&dlon=' + lng + '&dev=0'
  155. return url
  156. }
  157. },
  158. {
  159. title: '百度地图',
  160. pname: 'com.baidu.BaiduMap',
  161. action: 'baidumap://',
  162. getUrl: function() {
  163. var url = 'baidumap://map/direction?destination=' + encodeURIComponent('latlng:' + lat +
  164. ',' + lng + '|name:' + title) + '&mode=driving&src=APP&coord_type=gcj02'
  165. return url
  166. }
  167. },
  168. {
  169. title: '腾讯地图',
  170. pname: 'com.tencent.map',
  171. action: 'qqmap://',
  172. getUrl: function() {
  173. var url
  174. url = 'qqmap://map/routeplan?type=drive' + (isIos ? ('&from=' + encodeURIComponent(
  175. '我的位置')) : '') + '&to=' + encodeURIComponent(title) + '&tocoord=' +
  176. encodeURIComponent(lat + ',' + lng) + '&referer=APP'
  177. return url
  178. }
  179. }
  180. ]
  181. var maps = []
  182. mapsSource.forEach(function(mapsSource) {
  183. var installed = plus.runtime.isApplicationExist({
  184. pname: mapsSource.pname,
  185. action: mapsSource.action,
  186. })
  187. if (installed) {
  188. maps.push(mapsSource)
  189. }
  190. })
  191. if (isIos) {
  192. maps.unshift({
  193. title: 'Apple 地图',
  194. getUrl: function() {
  195. var url
  196. url = 'https://maps.apple.com/?daddr=' + encodeURIComponent(title) + '&sll=' +
  197. encodeURIComponent(lat + ',' + lng)
  198. return url
  199. }
  200. })
  201. }
  202. if (maps.length === 0) {
  203. maps = maps.concat(mapsSourceWeb)
  204. }
  205. plus.nativeUI.actionSheet({
  206. title: '导航方式',
  207. cancel: '取消',
  208. buttons: maps,
  209. }, function(res) {
  210. var index = res.index
  211. var map
  212. if (index > 0) {
  213. map = maps[index - 1]
  214. plus.runtime.openURL(map.getUrl(), function() { }, map.pname)
  215. }
  216. })
  217. }
  218. var ZOOM = 13
  219. window.__openLocation__ = function(params) {
  220. var mapElem = document.getElementById('map');
  221. var poiNameElem = document.querySelector('.poi-name');
  222. var poiAddrElem = document.querySelector('.poi-addr');
  223. var poiNavElem = document.querySelector('.poi-nav');
  224. var latitude = params.latitude;
  225. var longitude = params.longitude;
  226. var scale = params.scale;
  227. var name = params.name;
  228. var address = params.address;
  229. var point = new plus.maps.Point(longitude, latitude);
  230. var map = plus.maps.create('map', {
  231. center: point,
  232. zoom: scale || ZOOM,
  233. top: 0,
  234. left: 0,
  235. width: '100%',
  236. height: mapElem.offsetHeight
  237. });
  238. var marker = new plus.maps.Marker(point);
  239. marker.setIcon('__uniappmarker@3x.png');
  240. if (name) {
  241. poiNameElem.innerText = name;
  242. // marker.setLabel(name);
  243. }
  244. if (address) {
  245. poiAddrElem.innerText = address;
  246. // var bubble = new plus.maps.Bubble(address);
  247. // marker.setBubble(bubble);
  248. }
  249. map.addOverlay(marker);
  250. plus.webview.currentWebview().append(map);
  251. var userPoint = false
  252. map.getUserLocation(function(state, point) {
  253. if (state) {
  254. plus.nativeUI.toast('定位失败!');
  255. } else {
  256. userPoint = point;
  257. }
  258. })
  259. poiNavElem.addEventListener('click', function() {
  260. openSysMap(latitude, longitude, name)
  261. });
  262. }
  263. </script>
  264. </body>
  265. </html>