openmap.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. // 判断设备类型
  2. export function getDeviceType() {
  3. var userAgent = navigator.userAgent || navigator.vendor || window.opera;
  4. if (userAgent.match(/iPad/i) || userAgent.match(/iPhone/i) || userAgent.match(/iPod/i)) {
  5. return 'iOS'; // iOS device
  6. } else if (userAgent.match(/Android/i)) {
  7. return 'Android'; // Android device
  8. } else {
  9. return 'unknown'; // 其他设备
  10. }
  11. }
  12. // 打开指定的地图APP
  13. // mapAppId 1: 高德地图 2:百度地图 3: 腾讯地图
  14. // longitude, latitude 地点经纬度
  15. // name 地点名称
  16. export function openNavigation(mapAppId, longitude, latitude, name) {
  17. let url = ""; // app url
  18. let referer = "彩图奔跑"; //应用名称
  19. const deviceType = getDeviceType();
  20. switch (mapAppId) {
  21. //下面是拼接url,不同系统以及不同地图都有不同的拼接字段
  22. case 1: //打开高德地图
  23. if (deviceType == "Android") { // 安卓
  24. url =
  25. `androidamap://viewMap?sourceApplication=appname&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`;
  26. } else { //苹果
  27. url =
  28. `iosamap://viewMap?sourceApplication=applicationName&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`;
  29. }
  30. break;
  31. case 2: //打开百度地图
  32. if (deviceType == "Android") { // 安卓
  33. url =
  34. `baidumap://map/marker?location=${latitude},${longitude}&title=${name}&content=${name}&src=andr.baidu.openAPIdemo&coord_type=gcj02`;
  35. } else { //苹果
  36. url =
  37. `iosamap://map/marker?location=${latitude},${longitude}&title=${name}&content=${name}&src=ios.baidu.openAPIdemo&coord_type=gcj02`;
  38. }
  39. break;
  40. case 3: //打开腾讯地图
  41. if (deviceType == "Android") { // 安卓
  42. url =
  43. `qqmap://map/geocoder?coord=${latitude},${longitude}&title${name}&addr=${name}=&referer=${referer}`
  44. } else { //苹果
  45. url =
  46. `qqmap://map/geocoder?coord=${latitude},${longitude}&title${name}&addr=${name}=&referer=${referer}`;
  47. }
  48. break;
  49. }
  50. // 如果选中
  51. if (url != "") {
  52. url = encodeURI(url);
  53. // window.open(url);
  54. window.location.href = url;
  55. }
  56. }
  57. // 打开指定的地图APP
  58. // mapAppId 1: 高德地图 2:百度地图 3: 腾讯地图
  59. // longitude, latitude 地点经纬度
  60. // name 地点名称
  61. export function openNavigation2(mapAppId, longitude, latitude, name) {
  62. let url = ""; // app url
  63. let webUrl = ""; // web url 用来为用户未安装导航软件时打开浏览器所使用url
  64. let referer = "彩图奔跑"; //应用名称
  65. switch (mapAppId) {
  66. //下面是拼接url,不同系统以及不同地图都有不同的拼接字段
  67. case 1: //打开高德地图
  68. url =
  69. `https://uri.amap.com/marker?position=${longitude},${latitude}&name=${name}&src=mypage&coordinate=gaode`
  70. break;
  71. case 2: //打开百度地图
  72. url =
  73. `http://api.map.baidu.com/marker?location=${latitude},${longitude}&title=${name}&content=${name}&output=html&src=webapp.baidu.openAPIdemo`
  74. break;
  75. case 3: //打开腾讯地图
  76. url =
  77. `https://apis.map.qq.com/uri/v1/marker?marker=coord:${latitude},${longitude}&title=${name}&addr=${name}&referer=${referer}`
  78. break;
  79. }
  80. // 如果选中
  81. if (url != "") {
  82. url = encodeURI(url);
  83. window.open(url);
  84. // window.location.href = url;
  85. }
  86. }
  87. // 打开指定的地图APP
  88. // mapAppId 1: 高德地图 2:百度地图 3: 腾讯地图
  89. // longitude, latitude 地点经纬度
  90. // name 地点名称
  91. export function openNavigation3(mapAppId, longitude, latitude, name) {
  92. let url = ""; // app url
  93. let webUrl = ""; // web url 用来为用户未安装导航软件时打开浏览器所使用url
  94. let referer = "彩图奔跑"; //应用名称
  95. const deviceType = getDeviceType();
  96. switch (mapAppId) {
  97. //下面是拼接url,不同系统以及不同地图都有不同的拼接字段
  98. case 1: //打开高德地图
  99. if (deviceType == "Android") { // 安卓
  100. url =
  101. `androidamap://viewMap?sourceApplication=appname&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`;
  102. } else { //苹果
  103. url =
  104. `iosamap://viewMap?sourceApplication=applicationName&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`;
  105. }
  106. webUrl =
  107. `https://uri.amap.com/marker?position=${longitude},${latitude}&name=${name}&src=mypage&coordinate=gaode`
  108. break;
  109. case 2: //打开百度地图
  110. if (deviceType == "Android") { // 安卓
  111. url =
  112. `baidumap://map/marker?location=${latitude},${longitude}&title=${name}&content=${name}&src=andr.baidu.openAPIdemo&coord_type=gcj02`;
  113. } else { //苹果
  114. url =
  115. `iosamap://map/marker?location=${latitude},${longitude}&title=${name}&content=${name}&src=ios.baidu.openAPIdemo&coord_type=gcj02`;
  116. }
  117. webUrl =
  118. `http://api.map.baidu.com/marker?location=${latitude},${longitude}&title=${name}&content=${name}&output=html&src=webapp.baidu.openAPIdemo`
  119. break;
  120. case 3: //打开腾讯地图
  121. if (deviceType == "Android") { // 安卓
  122. url =
  123. `qqmap://map/geocoder?coord=${latitude},${longitude}&title${name}&addr=${name}=&referer=${referer}`
  124. } else { //苹果
  125. url =
  126. `qqmap://map/geocoder?coord=${latitude},${longitude}&title${name}&addr=${name}=&referer=${referer}`;
  127. }
  128. webUrl =
  129. `https://apis.map.qq.com/uri/v1/marker?marker=coord:${latitude},${longitude}&title=${name}&addr=${name}&referer=${referer}`
  130. break;
  131. }
  132. // 如果选中
  133. if (url != "") {
  134. url = encodeURI(url);
  135. document.addEventListener('visibilitychange', function() {
  136. if (document.hidden) { // 当页面被切换至后台时
  137. // console.log("页面已经切换到了后台");
  138. clearTimeout(t);
  139. appInstalled = true;
  140. // uni.showToast({
  141. // title: chooseMap + '已安装,正在打开APP...',
  142. // icon: 'none',
  143. // duration: 2000
  144. // });
  145. } else { // 当页面重新显示在前台时
  146. // console.log("页面已经切换回前台");
  147. }
  148. });
  149. // window.open(url);
  150. window.location.href = url;
  151. let chooseMap = ''
  152. if (mapAppId == 1) {
  153. chooseMap = "高德地图"
  154. } else if (mapAppId == 2) {
  155. chooseMap = "百度地图"
  156. } else {
  157. chooseMap = "腾讯地图"
  158. }
  159. let appInstalled = false;
  160. let t = setTimeout(() => {
  161. if (appInstalled) {
  162. return;
  163. }
  164. uni.showModal({
  165. title: '提示',
  166. content: '您的手机尚未安装' + chooseMap + ',是否要使用浏览器打开?',
  167. confirmText: '确定', //确定文本的文字
  168. cancelText: '取消', //确定文本的文字
  169. showCancel: true, //没有取消按钮的弹框
  170. success: function(res) {
  171. if (res.confirm) {
  172. window.open(webUrl);
  173. // window.location.href = webUrl;
  174. } else if (res.cancel) {
  175. }
  176. }
  177. })
  178. }, 500); // 500毫秒后进行检查
  179. }
  180. }
  181. // [App平台] 打开地图
  182. // 导航 会打开导航菜单供用户选择
  183. export function openNavigation4(longitude, latitude, name) {
  184. let url = ""; // app url
  185. let webUrl = ""; // web url 用来为用户未安装导航软件时打开浏览器所使用url
  186. let referer = "SKK"; //应用名称
  187. plus.nativeUI.actionSheet({ //选择菜单
  188. title: "选择地图应用",
  189. cancel: "取消",
  190. buttons: [{
  191. title: "高德地图"
  192. }, {
  193. title: "百度地图"
  194. }, {
  195. title: "腾讯地图"
  196. }] // 可选的地图类型
  197. }, (e) => {
  198. // 判断用户选择的地图
  199. switch (e.index) {
  200. //下面是拼接url,不同系统以及不同地图都有不同的拼接字段
  201. case 1: //打开高德地图
  202. if (plus.os.name == "Android") { // 安卓
  203. url =
  204. `androidamap://viewMap?sourceApplication=appname&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`;
  205. } else { //苹果
  206. url =
  207. `iosamap://viewMap?sourceApplication=applicationName&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`;
  208. }
  209. webUrl =
  210. `https://uri.amap.com/marker?position=${longitude},${latitude}&name=${name}&src=mypage&coordinate=gaode`
  211. break;
  212. case 2: //打开百度地图
  213. if (plus.os.name == "Android") { // 安卓
  214. url =
  215. `baidumap://map/marker?location=${latitude},${longitude}&title=${name}&content=${name}&src=andr.baidu.openAPIdemo&coord_type=gcj02`;
  216. } else { //苹果
  217. url =
  218. `iosamap://map/marker?location=${latitude},${longitude}&title=${name}&content=${name}&src=ios.baidu.openAPIdemo&coord_type=gcj02`;
  219. }
  220. webUrl =
  221. `http://api.map.baidu.com/marker?location=${latitude},${longitude}&title=${name}&content=${name}&output=html&src=webapp.baidu.openAPIdemo`
  222. break;
  223. case 3: //打开腾讯地图
  224. if (plus.os.name == "Android") { // 安卓
  225. url =
  226. `qqmap://map/geocoder?coord=${latitude},${longitude}&title${name}&addr=${name}=&referer=${referer}`
  227. } else { //苹果
  228. url =
  229. `qqmap://map/geocoder?coord=${latitude},${longitude}&title${name}&addr=${name}=&referer=${referer}`;
  230. }
  231. webUrl =
  232. `https://apis.map.qq.com/uri/v1/marker?marker=coord:${latitude},${longitude}&title=${name}&addr=${name}&referer=${referer}`
  233. break;
  234. }
  235. // 如果选中
  236. if (url != "") {
  237. url = encodeURI(url);
  238. // console.log(url, '地址')
  239. // 打开 app 导航
  240. plus.runtime.openURL(url, (err) => { // 失败回到
  241. // 毕竟用户可能没有安装app但一定安装的有浏览器
  242. // 如果失败则说明未安装 直接 打开网页版进行导航
  243. let chooseMap = ''
  244. if (e.index == 1) {
  245. chooseMap = "高德地图"
  246. } else if (e.index == 2) {
  247. chooseMap = "百度地图"
  248. } else {
  249. chooseMap = "腾讯地图"
  250. }
  251. uni.showModal({
  252. title: '提示',
  253. content: '检测到您本机暂未安装' + chooseMap + '应用,是否要选择使用浏览器打开?',
  254. confirmText: '确定', //确定文本的文字
  255. cancelText: '取消', //确定文本的文字
  256. showCancel: true, //没有取消按钮的弹框
  257. success: function(res) {
  258. if (res.confirm) {
  259. plus.runtime.openURL(webUrl)
  260. console.log('用户点击了确定')
  261. } else if (res.cancel) {
  262. console.log('用户点击了取消')
  263. // plus.nativeUI.alert("本机未安装指定的地图应用");
  264. }
  265. }
  266. })
  267. });
  268. }
  269. })
  270. }