uniapp开发app使用谷歌地图(ios跟安卓)

打印 上一主题 下一主题

主题 798|帖子 798|积分 2394

条件条件:

谷歌地图必要翻墙,否则无法加载
谷歌地图说明

   文档地点:概览  |  Maps JavaScript API  |  Google for Developers
  

  • 设置地图语言
  1. <script async
  2.     src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&language=ja&callback=initMap">
  3. </script>
复制代码
  文档地点:将地图本地化  |  Maps JavaScript API  |  Google for Developers 
  第一种方法(web-view):

web-view 是一个 web 浏览器组件,可以用来承载网页的容器,会主动铺满整个页面(nvue 使用必要手动指定宽高),一般都会用nvue,否则默认占满页面
   官网说明:web-view | uni-app官网
  

  • 展示目录结构:

index.nvue
  1. <template>
  2.         <view>
  3.                 <view style="height: 100rpx;">222222222</view>
  4.                 <view class="" v-if="isShow">
  5.                         <web-view style="background-color: #fafafa;" ref="webview" :style="{ height: statusBarHeight + 'px'}"
  6.                                 @onPostMessage="getMessage" :src="webUrl"></web-view>
  7.                 </view>
  8.         </view>
  9. </template>
  10. <script>
  11.         /**
  12.          *
  13.          * 请看这里
  14.          * source :来源 根据上个界面传来的type值 实现不同的功能  
  15.          *
  16.          * */
  17.         import Vue from 'vue';
  18.         export default {
  19.                 data() {
  20.                         return {
  21.                                 statusBarHeight: 500, //可视屏幕的高度
  22.                                 webUrl: '',
  23.                                 isShow: false,
  24.                                 lat:'',
  25.                                 lng:'' ,
  26.                                 source: "",
  27.                         };
  28.                 },
  29.                 onLoad(e) {
  30.                         console.log(e.type)
  31.                         this.source = e.type;
  32.                         // #ifdef APP-PLUS
  33.                         this.getlocetion();
  34.                         // #endif
  35.                 },
  36.                 methods: {
  37.                         getlocetion() {
  38.                                 const self = this;
  39.                                 self.lat = '39.906217';
  40.                                 self.lng = '116.3912757';
  41.                                 self.webUrl = '/hybrid/html/maps/index' + self.source + '.html?lat=' + self.lat +
  42.                                         '&lng=' +
  43.                                         self.lng;
  44.                                 self.isShow = true
  45.                         }
  46.                 }
  47.         };
  48. </script>
  49. <style>
  50.        
  51. </style>
复制代码
 index1.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.         <head>
  4.                 <meta charset="utf-8">
  5.                 <meta name="viewport"
  6.                         content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=0" />
  7.                 <link href="http://fonts.googleapis.com/css?family=Roboto:300" rel="stylesheet" type="text/css">
  8.                 <title>谷歌地图-初始化地图</title>
  9.                 <link rel="stylesheet" type="text/css" href="./css/index.css" />
  10.                 <script src="./js/lib/common.js"></script>
  11.         </head>
  12.         <body>
  13.                 <!-- 地图 -->
  14.                 <div id="map"></div>
  15.                 <!-- css loading动画 -->
  16.                 <div class="loader" id="loader"></div>
  17.         </body>
  18.         <script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
  19.         <script
  20.                 src="https://maps.googleapis.com/maps/api/js?key=xxxxxxxx&libraries=places&language=zh-TW&callback=initMap"
  21.                 async defer></script>
  22.         <script src="./js/index1.js"></script>
  23. </html>
复制代码
index1.js
  1. var lats = getQueryVariable('lat') * 1;
  2. var lngs = getQueryVariable('lng') * 1;
  3. console.log(lats,lngs)
  4. var zoom = 15; //地图缩放比例
  5. var coords = ""
  6. /**
  7. * 初始化
  8. *
  9. */
  10. function initMap() {
  11.         if (lats && lngs) {
  12.                 coords = {
  13.                         lat: lats,
  14.                         lng: lngs
  15.                 };
  16.         } else {
  17.                 navigator.geolocation.getCurrentPosition(function(position) {
  18.                         coords = {
  19.                                 lat: position.coords.latitude,
  20.                                 lng: position.coords.longitude
  21.                         };
  22.                         lats = position.coords.latitude;
  23.                         lngs = position.coords.longitude
  24.                 });
  25.         }
  26.         map = new google.maps.Map(document.getElementById('map'), {
  27.                 zoom: zoom,
  28.                 center: coords,
  29.                 mapId: MAPID,
  30.                 animation: 'BOUNCE',
  31.                 language: 'zh-TW'
  32.         });
  33.         setTimeout(() => {
  34.                 LoadAnimation(false)
  35.         }, 1000)
  36. }
  37. LoadAnimation(true)
  38. window.initMap = initMap;
复制代码
common.js  ---  公共js
  1. /**
  2. * MapID
  3. *
  4. *
  5. * */
  6. var MAPID = 'xxxxxxx'
  7. /**
  8. *
  9. * 获取url地址参数
  10. *
  11. * */
  12. function getQueryVariable(variable) {
  13.         var query = decodeURI(window.location.search.substring(1));
  14.         var vars = query.split("&");
  15.         for (var i = 0; i < vars.length; i++) {
  16.                 var pair = vars[i].split("=");
  17.                 if (pair[0] == variable) {
  18.                         return pair[1];
  19.                 }
  20.         }
  21.         return (false);
  22. }
  23. /**
  24. * 加载动画
  25. *
  26. */
  27. function LoadAnimation(isFalse) {
  28.         if (isFalse) {
  29.                 document.getElementById("loader").style.display = "inline";
  30.         } else {
  31.                 document.getElementById("loader").style.display = "none";
  32.         }
  33. }
复制代码


  • <script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>是什么
uni.webview.1.5.2.js 这个 JavaScript 文件为开发者提供了在 Uni-app 中使用 Webview 组件的丰富功能和接口,方便开发者在应用中集成和控制 web 页面


  • <link href="http://fonts.googleapis.com/css?family=Roboto:300" rel="stylesheet" type="text/css"> 是什么
在网页中引入 Google Fonts 中的 Roboto 字体。Google Fonts 提供了大量免费的网页字体供开发者使用
上面代码就可以天生一个谷歌地图示例了
第二种方法(render.js)

renderjs是一个运行在视图层的js。它比WXS更加强盛。它只支持app-vue和web;
在视图层操作dom,运行 for web 的 js库
googleMap.vue
app繁体语言加载地图,绘制marker,绘制轨迹
  1. <template>
  2.         <view class="trajectory OverallSty">
  3.                 <view class="content">
  4.                         <view id="container">
  5.                                 <view class="loader" v-if="loaderSta"></view>
  6.                                 <view style="width: 750rpx; height:650rpx;" :location="currLocation"
  7.                                         :change:location="renderScript.receiveLoca" :Trace="currTrace"
  8.                                         :change:Trace="renderScript.receiveTrace" id="renderScript"></view>
  9.                         </view>
  10.                 </view>
  11.         </view>
  12. </template>
  13. <script>
  14.         import {
  15.                 get,
  16.                 post
  17.         } from '@/util/request/request.js'
  18.         import localStorage from '@/util/commen/localStorage.js'
  19.         import {
  20.                 onLoad
  21.         } from "@dcloudio/uni-app"
  22.         export default {
  23.                 data() {
  24.                         return {
  25.                                 markers: [{
  26.                                         id: 'begin',
  27.                                         latitude: '',
  28.                                         longitude: '',
  29.                                         iconPath: "../../static/img/map/place.png",
  30.                                         width: 30,
  31.                                         height: 30
  32.                                 }],
  33.                                 polylines: [],
  34.                                 center_lat: '',
  35.                                 center_lng: '',
  36.                                 userInfo: JSON.parse(localStorage.get('userInfo')),
  37.                                 projInfo: JSON.parse(localStorage.get('projInfo')),
  38.                                 getWorkerSignsInformation: {},
  39.                                 searchBeginTime: '',
  40.                                 searchEndTime: '',
  41.                                 workerInfo: null,
  42.                                 currLocation: {},
  43.                                 currTrace: [],
  44.                                 loaderSta: true
  45.                         }
  46.                 },
  47.                 onLoad(options) {
  48.                         let data = JSON.parse(decodeURIComponent(options.data));
  49.                         this.workerInfo = data
  50.                 },
  51.                 mounted() {
  52.                         let _this = this
  53.                         setTimeout(() => {
  54.                                 _this.loaderSta = false
  55.                         }, 1500);
  56.                         this.getWorkerSignsInformationFun()
  57.                 },
  58.                 methods: {
  59.                         getWorkerLocus() {
  60.                                 let _this = this
  61.                                 get('/proj/smartBracelet/getWorkerLocus', {
  62.                                         'projId': _this.projInfo.proId,
  63.                                         'workerId': _this.workerInfo.workerId,
  64.                                         'searchBeginTime': _this.searchBeginTime,
  65.                                         'searchEndTime': _this.searchEndTime
  66.                                 }, {
  67.                                         'token': localStorage.get('token'),
  68.                                         'uid': _this.userInfo.userId
  69.                                 }).then(res => {
  70.                                         let data = res.data.result
  71.                                         const points = data.lon.map((lon, index) => {
  72.                                                 return {
  73.                                                         lat: parseFloat(data.lat[index]),
  74.                                                         lng: parseFloat(lon)
  75.                                                 }
  76.                                         });
  77.                                         if (points[0]?.lat == "" || points[0]?.lng == "" ||
  78.                                                 points[0]?.lat == undefined || points[0]?.lng == undefined) {
  79.                                                 _this.$refs.messagePopup.showMessage('warn', '未查詢到軌跡', 'top')
  80.                                                 return
  81.                                         }
  82.                                         _this.currTrace = points
  83.                                 }).catch(err => {
  84.                                         console.error(err);
  85.                                 });
  86.                         },
  87.                         getWorkerSignsInformationFun() {
  88.                                 let _this = this
  89.                                 get('/proj/smartBracelet/getWorkerSignsInformation', {
  90.                                         'projId': _this.projInfo.proId,
  91.                                         'workerId': _this.workerInfo.workerId
  92.                                 }, {
  93.                                         'token': localStorage.get('token'),
  94.                                         'uid': _this.userInfo.userId
  95.                                 }).then(res => {
  96.                                         _this.getWorkerSignsInformation = res.data?.result
  97.                                         if (_this.getWorkerSignsInformation?.lat == undefined || _this.getWorkerSignsInformation
  98.                                                 ?.lon == undefined) {
  99.                                                 _this.$refs.messagePopup.showMessage('warn', '未獲取定位信息', 'top')
  100.                                                 _this.center_lat = '39.906217';
  101.                                                 _this.center_lng = '116.3912757';
  102.                                                 _this.markers[0].latitude = '39.906217';
  103.                                                 _this.markers[0].longitude = '116.3912757';
  104.                                                 return
  105.                                         }
  106.                                         _this.currLocation = res.data.result
  107.                                         _this.center_lat = _this.getWorkerSignsInformation.lat;
  108.                                         _this.center_lng = _this.getWorkerSignsInformation.lon;
  109.                                         _this.markers[0].latitude = _this.getWorkerSignsInformation.lat;
  110.                                         _this.markers[0].longitude = _this.getWorkerSignsInformation.lon;
  111.                                 }).catch(err => {
  112.                                         console.error(err);
  113.                                 });
  114.                         }
  115.                 }
  116.         };
  117. </script>
  118. <script module="renderScript" lang="renderjs">
  119.         var meMarker = []
  120.         var polylinePath = null
  121.         export default {
  122.                 data() {
  123.                         return {
  124.                                 map: {},
  125.                                 receiveLocaDate: {
  126.                                         lat: '39.906217',
  127.                                         lon: '116.3912757'
  128.                                 },
  129.                                 receiveTraceDate: []
  130.                         };
  131.                 },
  132.                 mounted() {
  133.                         let _this = this
  134.                         const script = document.createElement('script')
  135.                         script.src =
  136.                                 'https://maps.googleapis.com/maps/api/js?key=xxxxxxxx&language=zh-TW&callback=initMap'
  137.                         window.initMap = function() {
  138.                                 setTimeout(() => {
  139.                                         console.log('renderScript')
  140.                                         _this.initAmap()
  141.                                 }, 1500);
  142.                         };
  143.                         document.head.appendChild(script)
  144.                 },
  145.                 methods: {
  146.                         initAmap() {
  147.                                 let _this = this
  148.                                 console.log('initAmap')
  149.                                 _this.map = new google.maps.Map(document.getElementById("renderScript"), {
  150.                                         center: {
  151.                                                 lat: parseFloat(_this.receiveLocaDate.lat),
  152.                                                 lng: parseFloat(_this.receiveLocaDate.lon)
  153.                                         },
  154.                                         zoom: 16
  155.                                 });
  156.                                 _this.setMePositioning()
  157.                         },
  158.                         setMePositioning() {
  159.                                 let _this = this
  160.                                 const marker = new google.maps.Marker({
  161.                                         position: {
  162.                                                 lat: parseFloat(_this.receiveLocaDate.lat),
  163.                                                 lng: parseFloat(_this.receiveLocaDate.lon)
  164.                                         },
  165.                                         icon: {
  166.                                                 url: "https://maps.gstatic.com/mapfiles/ms2/micons/red.png",
  167.                                                 scaledSize: new google.maps.Size(50, 50)
  168.                                         },
  169.                                         map: _this.map
  170.                                 });
  171.                                 meMarker.push(marker)
  172.                         },
  173.                         receiveLoca(newValue, oldValue, ownerInstance, instance) {
  174.                                 let _this = this
  175.                                 if (JSON.stringify(newValue) != '{}' && newValue.length != 0) {
  176.                                         _this.receiveLocaDate = newValue
  177.                                 }
  178.                         },
  179.                         receiveTrace(newValue, oldValue, ownerInstance, instance) {
  180.                                 let _this = this
  181.                                 if (JSON.stringify(newValue) != '{}' && newValue.length != 0) {
  182.                                         console.log('触发了',newValue,newValue.length)
  183.                                         for (let i = 0; i < meMarker.length; i++) {
  184.                                                 meMarker[i].setMap(null);
  185.                                         }
  186.                                         if(polylinePath != null){
  187.                                                 polylinePath.setMap(null);
  188.                                         }
  189.                                         _this.map.setZoom(20);
  190.                                         const marker1 = new google.maps.Marker({
  191.                                                 position: {
  192.                                                         lat: parseFloat(newValue[0].lat),
  193.                                                         lng: parseFloat(newValue[0].lng)
  194.                                                 },
  195.                                                 icon: {
  196.                                                         url: "static/img/map/icon_start.png",
  197.                                                         scaledSize: new google.maps.Size(20, 20)
  198.                                                 },
  199.                                                 map: _this.map
  200.                                         });
  201.                                         meMarker.push(marker1)
  202.                                         const marker2 = new google.maps.Marker({
  203.                                                 position: {
  204.                                                         lat: parseFloat(newValue[newValue.length - 1].lat),
  205.                                                         lng: parseFloat(newValue[newValue.length - 1].lng)
  206.                                                 },
  207.                                                 icon: {
  208.                                                         url: "static/img/map/icon_end.png",
  209.                                                         scaledSize: new google.maps.Size(20, 20)
  210.                                                 },
  211.                                                 map: _this.map
  212.                                         });
  213.                                         meMarker.push(marker2)
  214.                                         polylinePath = new google.maps.Polyline({
  215.                                                 path: newValue,
  216.                                                 geodesic: false,
  217.                                                 strokeColor: '#41d9b7',
  218.                                                 strokeOpacity: 1,
  219.                                                 strokeWeight: 8,
  220.                                                 editable: false,
  221.                                                 draggable: false,
  222.                                         });
  223.                                         polylinePath.setMap(_this.map)
  224.                                         let pos = {
  225.                                                 lat: parseFloat(newValue[0].lat),
  226.                                                 lng: parseFloat(newValue[0].lng)
  227.                                         }
  228.                                         _this.map.setCenter(pos)
  229.                                 }
  230.                         }
  231.                 }
  232.         }
  233. </script>
  234. <style scoped>
  235.         /* 动画 */
  236.         .trajectory .loader {
  237.                 position: fixed;
  238.                 z-index: 99;
  239.                 border: 8px solid #f3f3f3;
  240.                 border-top: 8px solid #ea4335;
  241.                 border-radius: 50%;
  242.                 width: 80px;
  243.                 height: 80px;
  244.                 animation: spin 2s linear infinite;
  245.                 position: absolute;
  246.                 top: 50%;
  247.                 left: 50%;
  248.                 margin-left: -90rpx;
  249.                 margin-top: 320rpx;
  250.                 transform: translate(-50%, -50%);
  251.         }
  252.         @keyframes spin {
  253.                 0% {
  254.                         transform: rotate(0deg);
  255.                 }
  256.                 100% {
  257.                         transform: rotate(360deg);
  258.                 }
  259.         }
  260. </style>
复制代码
遇到的问题



  • manifest.json中不用勾选map模块,否则google地图打包时会模块冲突,导致打包失败
例如报错日志:
  1. * What went wrong:
  2. Execution failed for task ':app:checkReleaseDuplicateClasses'.
  3. > A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
  4. > Duplicate class com.google.android.gms.actions.ItemListIntents found in modules jetified-play-services-basement-18.0.0-runtime (com.google.android.gms:play-services-basement:18.0.0) and jetified-play-services-basement-18.0.0-runtime (play-services-basement-18.0.0.aar)
  5. Duplicate class com.google.android.gms.actions.NoteIntents found in modules jetified-play-services-basement-18.0.0-runtime (com.google.android.gms:play-services-basement:18.0.0) and jetified-play-services-basement-18.0.0-runtime (play-services-basement-18.0.0.aar)
  6. Duplicate class com.google.android.gms.actions.ReserveIntents found in modules jetified-play-services-basement-18.0.0-runtime (com.google.android.gms:play-services-basement:18.0.0) and jetified-play-services-basement-18.0.0-runtime (play-services-basement-18.0.0.aar)   
复制代码


  • InvalidValueError: at index 0: not a LatLng or LatLngLiteral with finite coordinates: in property lat: not a number a
经纬度坐标格式不正确,导致 Google 地图 API 无法识别,确保提供的经纬度值是有用的数字,确保经纬度值的类型是 number
其他

   UNiAPP中使用render.js绘制高德地图文章推荐:
  UNiAPP中使用render.js绘制高德地图 - 掘金 (juejin.cn)
  
   HBuilderX汗青版本:汗青版本 - HBuilderX 文档 (dcloud.net.cn) 
    谷歌地图插件:谷歌示例大全、各种谷歌地图案例 - DCloud 插件市场 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表