【uni-app】申请高德地图key,封装map.js,实现H5、iOS、Android通过getlocation获取地图定位信息

文章目录

  • map组件基础使用
  • 封装map.js,实现定位
    • 1、使用第三方地图:高德,申请对应平台key
      • 1、申请H5 key
      • 2、申请微信小程序 key
      • 3、申请android key
          • 查看证书详情,可以看到SHA1
          • 查看/设置Android包名
      • 4、申请ios key
    • 2、封装map
      • 1、lib/map.js
      • 2、main.js中全局引用:
      • 3、使用

map组件基础使用

<template>
  <view class="contact">
    <image class="img" :src="formData.headImg"></image>
    <view class="info">
      <view @click="callPhone">联系电话:{{formData.phone}} ( 点击拨打 )</view>
      <view>地址:{{formData.addr}}</view>
    </view>
    <map class="map" v-if="showMap" :longitude="longitude" :scale="scale" :latitude="latitude" :markers="markers"></map>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        showMap: false,
        formData:{
          headImg:'http://www.itcast.cn/2018czydz/images/gywmban.jpg',
          phone: '(0571)28828888',
          addr:'浙江省杭州市滨江区江南大道3588号'
        },
        longitude: 120.172341,
        latitude: 30.19159,
        scale: 13, // 缩放级别,取值范围为3-20, 默认16
        markers:[ // 标记点用于在地图上显示标记的位置,支持多个
          {
            longitude: 120.172341,
            latitude: 30.19159,
            iconPath: '../../static/logo.png',
            width: 20,
            height: 20,
            title:'ohh',// 点击时显示,callout存在时将被忽略
            label:{ 
                content:'呀哈哈'
            },
            callout:{
                content:`kkkk\r\nphds`
            }
          }
        ]
      }
    },
    mounted() {
      this.showMap = true;
    },
    methods: {
      phone() {
        uni.makePhoneCall({
          phoneNumber: this.formData.phone
        })
      }
    }
  }
</script>

<style lang="scss">
.contact{
    .img{
        width: 750rpx;
        height: 320rpx;
    }
    .info{
        padding: 10rpx 20rpx;
        font-size: 30rpx;
        view{
            line-height: 80rpx;
            border-bottom: 1px solid #eee;
        }
    }
    .map{
        width: 750rpx;
        height: 750rpx;
    }
}
</style>

封装map.js,实现定位

1、使用第三方地图:高德,申请对应平台key

注:高德地图web js api:https://lbs.amap.com/api/javascript-api/guide/abc/prepare

1、申请H5 key

1、登录高德开放平台
(https://console.amap.com/dev),没有账号需要先注册开发者账号

2、创建应用:输入名称,选择应用类型在这里插入图片描述
在这里插入图片描述
3、应用右侧,点击添加key,添加h5 web端(JS API),h5需申请这个key,否则活报key无效或不匹配
在这里插入图片描述
4、获取key值后浏览器访问该链接,
记得替换key值: https://webapi.amap.com/maps?v=1.4.15&key=申请的key值,项目中创建map-h5.js, 将访问到的js复制并粘贴到map-h5.js,这里我存放的路径是utils/maps-h5.js

5、如果不做map封装,可以不执行上一步,只需把申请到的web端的key和安全秘钥配置到项目的manifest.json,即可使用高德地图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时使用api获取当前定位,使用Google浏览器访问时,并不会触发获取当前位置api,而H5 端获取定位信息,要求部署在 https 服务上,查看配置是已经使用https协议
原因是:国内使用Google浏览器访问极有可能被墙,所以可以使用其他浏览器进行测试或者科学上网。

接口文档:https://uniapp.dcloud.net.cn/api/location/location.html#getlocation
在这里插入图片描述

配置使用https协议
在这里插入图片描述

通过uni.getLocation获取当前定位信息时,成功回调函数中会返回当前经纬度等信息,如果想获取当前省市区信息,可以设置参数 geocode 为 true,但该属性仅APP端支持,H5则需要再通过第三方(高德)逆地理编码解析出地址信息
逆地理编码需要web服务的key作为参数,所以需要再申请web服务的key

在这里插入图片描述

// 转地址
turnAdrr(longs, lat) {
  // 高德逆地理变码 https://lbs.amap.com/api/webservice/guide/api/georegeo/
  let _key = '22865bd225e8ce6a8dc04780e9d650c1';//高德API key类型:web服务
  uni.request({
    method: 'GET',
    url: 'https://restapi.amap.com/v3/geocode/regeo?parameters',
    data: {
      key: _key,
      location: `${longs},${lat}`,
      output: 'JSON'
    },
    success: async (res) => {
      console.log(res)
      const resData = res.data
      this.formData.addr = resData.regeocode.formatted_address
      this.latitude = lat
      this.longitude = longs
      this.markers[0].latitude = lat
      this.markers[0].longitude = longs
      this.showMap = true;
    },
    fail: r => {
      console.log(r);
    }
  });
},

以上通过逆地理编码就可以得到当前定位的地理信息
在这里插入图片描述

此时动态获取到当前定位信息,就可以把数据动态绑定到map组件中
到此H5使用第三方地图已完成。

2、申请微信小程序 key

1、申请微信小程序key
在这里插入图片描述

2、下载小程序的js文件链接:https://lbs.amap.com/api/wx/download

3、下载完后将amap-wx.js文件解压到项目即可(主要为了封装map全局调用)

3、申请android key

1、申请Android证书
在uni-app官方文档https://uniapp.dcloud.net.cn/左侧菜单,点击uniClound web端控制台https://unicloud.dcloud.net.cn/,登录开发者账号,然后点击账号管理,左侧菜单:应用管理-我的应用,找到需要创建Android正式的项目

点击项目名称-Android云端正式,点击创建证书===》点击确定,等待几分钟,正式就创建好了。

查看证书详情,可以看到SHA1

在这里插入图片描述

查看/设置Android包名

在这里插入图片描述
在这里插入图片描述

2、获得SHA1安全码和包名之后,高德开放平台,添加Android key,并输入SHA1 和包名,点击确认即可生成key。
在这里插入图片描述

3、复制Android key 添加到地图配置中。如果不打算申请ios,随便填一个或者都填Android的key。
在这里插入图片描述
在这里插入图片描述

4、申请ios key

ios 申请相对有点麻烦,主要是需要登录apple 开发者平台https://developer.apple.com/注册开发者账号,然后申请ios正式,生成bundle id。
具体申请可以参考:http://news.558idc.com/288029.html
这里仅为了测试,就填了dcound提供的bundle id: io.dclound.HBuilder
在这里插入图片描述
点击提交,生成ios平台key,复制 key 添加到地图配置中
在这里插入图片描述

2、封装map

1、lib/map.js

以上各平台key申请完成之后,新建lib/map.js进行封装

//h5 要调用的js文件
// #ifdef H5
import amap from '@/utils/map-h5.js';
// #endif
//微信小程序要调用的js文件
// #ifdef MP  
import amap from '@/utils/map-wx.js';
// #endif
//获取位置信息
const getlocation = (opt) => {
  return new Promise((resolve, reject) => {
    //h5开始
    // #ifdef H5
    AMap.plugin('AMap.Geolocation', function() {
      uni.showLoading({
        title: '系统正在定位'
      });
      var geolocation = new AMap.Geolocation({
        enableHighAccuracy: true, //是否使用高精度定位,默认:true
        timeout: 10000, //超过10秒后停止定位,默认:5s
        buttonPosition: 'RB', //定位按钮的停靠位置
        buttonOffset: new AMap.Pixel(10, 20), //定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
        zoomToAccuracy: true, //定位成功后是否自动调整地图视野到定位点
      });
      // console.log(geolocation,'geolocation')
      geolocation.getCurrentPosition(function(status, result) {
        console.log(status,'status')
        if (status == 'complete') {
          //这个地方的result,可能会出现报错:获得地理定位时间。得到ipLocation成功。获取地址失败,请检查您的密钥或网络。
          //可能是密匙申请错了,重新申请密匙,生成maps.js文件。
          // console.log(result)
          uni.hideLoading();
          resolve(result)
        } else {
          uni.hideLoading();
          uni.showToast({
            title: '定位失败',
          });
          reject(result)
        }
      });
    });
    // #endif
    //h5结束
    
    //app开始
    // #ifdef APP-PLUS
    uni.showLoading({
      title: '获取信息中'
    });
    uni.getLocation({
      // map组件默认为国测局坐标gcj02,调用 uni.getLocation返回结果传递给组件时,需指定 type 为 gcj02 
      type: 'gcj02',
      geocode: true,
      success: function(data) {
        resolve(data)
      },
      fail: function(err) {
        reject(err)
      },
      complete() {
        uni.hideLoading();
      }
    })
    // #endif
    //app结束
    
    ///小程序开始
    // #ifdef MP
    var amapPlugin = new amap.AMapWX({
      key: 'e7bdd77a10ffca3092c48032d1f74ace'  //此处为高德平台申请的微信小程序的key
    });
    uni.showLoading({
      title: '获取信息中'
    });
    amapPlugin.getRegeo({
      success: function(data) {
        resolve(data)
      },
      fail: function(err) {
        reject(err)
      },
      complete: function() {
        uni.hideLoading();
      }
    });
    // #endif
    //小程序结束
  })
};
export default {
  getlocation: getlocation
}

2、main.js中全局引用:

import map from 'common/map.js'
Vue.prototype.$map = map;

3、使用

<template>
  <view class="contact">
    <image class="img" :src="formData.headImg"></image>
    <view class="info">
      <view @click="callPhone">联系电话:{{formData.phone}} ( 点击拨打 )</view>
      <view>地址:{{formData.addr}}</view>
    </view>
    <map class="map" v-if="showMap" :longitude="longitude" :scale="scale" :latitude="latitude" :markers="markers"></map>
  </view>
</template>
<script>
  export default {
    data() {
      return {
        showMap:false,
        formData:{
          headImg:'http://www.itcast.cn/2018czydz/images/gywmban.jpg',
          phone: '(0571)28828888',
          addr:''
        },
        longitude: null,
        latitude: null,
        scale: 13, // 缩放级别,取值范围为3-20, 默认16
        markers:[ // 标记点用于在地图上显示标记的位置,支持多个
          {
            longitude: null,
            latitude: null,
            iconPath: '../../static/logo.png',
            width: 20,
            height: 20,
            title:'ohh',// 点击时显示,callout存在时将被忽略
            label:{ 
              content:'呀哈哈'
            },
            callout:{
              content:`kkkk\r\nphds`
            }
          }
        ]
      }
    },
    created() {
      this.init();
    },
    methods: {
      init(){
        this.$map.getlocation().then(res => {
          console.log(res)
          // #ifdef APP-PLUS
          this.formData.addr = res.address.province+res.address.city+res.address.district+res.address.street+res.address.streetNum+res.address.poiName;
          this.latitude = res.latitude
          this.longitude = res.longitude
          this.markers[0].latitude = res.latitude
          this.markers[0].longitude = res.longitude
          this.showMap = true;
          // #endif
          // #ifdef H5
          this.turnAdrr(res.longitude,res.latitude)
          // #endif
        }).catch(err => {
          console.log(err)
        })
      },
      // 转地址
      turnAdrr(longs, lat) {
        // 高德逆地理变码 https://lbs.amap.com/api/webservice/guide/api/georegeo/
        let _key = '22865bd225e8ce6a8dc04780e9d650c1';//高德API key类型:web服务
        uni.request({
          method: 'GET',
          url: 'https://restapi.amap.com/v3/geocode/regeo?parameters',
          data: {
            key: _key,
            location: `${longs},${lat}`,
            output: 'JSON'
          },
          success: async (res) => {
            console.log(res)
            const resData = res.data
            this.formData.addr = resData.regeocode.formatted_address
            this.latitude = lat
            this.longitude = longs
            this.markers[0].latitude = lat
            this.markers[0].longitude = longs
            this.showMap = true;
          },
          fail: r => {
            console.log(r);
          }
        });
      },
      callPhone() {
        uni.makePhoneCall({
          phoneNumber: this.formData.phone
        })
      }
    }
  }
</script>

<style lang="scss">
.contact{
  .img{
    width: 750rpx;
    height: 320rpx;
  }
  .info{
    padding: 10rpx 20rpx;
    font-size: 30rpx;
    view{
      line-height: 80rpx;
      border-bottom: 1px solid #eee;
    }
  }
  
  .map{
    width: 750rpx;
    height: 750rpx;
  }
}
</style>

注意:H5需要开启使用https协议,调试时不要使用:Chrome、火狐、安卓原生WebView等,会报错:Get geolocation timeout.Get ipLocation failed.

报错是定位超时,由于JSAPI 使用的是浏览器提供的定位服务,所以定位的准确度和成功率都会对浏览器有很大的依赖。由于Chrome在国内没有提供服务,因此使用Chrome定位服务的浏览器,比如:Chrome、火狐、安卓原生WebView等环境的原生定位通常都会定位失败;
建议更换浏览器测试,推荐使用Edge 浏览器,或者翻墙。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/691248.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

例54:Draw使用

建立一个控制台工程&#xff0c;输入代码&#xff1a; Screen 13 移动到&#xff08;50,50&#xff09;而不绘图 Draw "BM 50,50" B:移动但不绘制,M:移动到指定位置 将绘图颜色设置为2&#xff08;绿色&#xff09; Draw "C2" C将颜色改为n …

2024最新 Jenkins + Docker实战教程(八)- Jenkins实现集群并发构建

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

SEO之关键词分布

初创企业搭建网站的朋友看1号文章&#xff1b;想学习云计算&#xff0c;怎么入门看2号文章谢谢支持&#xff1a; 1、我给不会敲代码又想搭建网站的人建议 2、新手上云 经过核心关键词确定与关键词扩展&#xff0c;应该已经得到一个至少包含几百个相关关键词的大列表。这些关键…

解决 There is no getter for property named ‘null‘ in ‘class 报错

1. 问题 mybatis-plus在更新删除操作时报错 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession750ee72a] 2024-06-08 21:03:07 [http-nio-8080-exec-3] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servl…

人工智能在【肿瘤生物标志物】领域的最新研究进展|顶刊速递·24-06-08

小罗碎碎念 本期文献速递的主题是——人工智能在“肿瘤生物标志物”领域的最新研究进展。 重点关注 今天推荐的6篇文献中&#xff0c;第二篇和第三篇是小罗最喜欢的&#xff0c;因为对于临床来说&#xff0c;比较具有实际意义&#xff0c;也和自己的想法很契合。 尤其是第三篇…

python 多任务之多进程

多任务 优势 多个任务同时执行可以大大提高程序执行效率&#xff0c;可以充分利用CPU资源&#xff0c;提高程序的执行效率 概念 是指在同一时间内执行多个任务 多进程 概念 进程&#xff08;process&#xff09;是资源分配的最小单位&#xff0c;他是操作系统进行资源分配…

Vue3【十二】09Computed计算属性

Vue3【十二】09Computed计算属性 计算属性 获取全名 这种方式是只读的不能修改 这样定义fullName是一个计算属性&#xff0c;可读可写 案例截图 目录结构 代码 Person.vue <template><div class"person"><h1>我是 Person 组件</h1>姓&…

Latex中表格(3)

Latex中的表格 一、多行或多列单元格 这篇主要说Latex中表格出现多行或者多列单元格的形式. 一、多行或多列单元格 可能用到的宏包 \usepackage{booktabs}\usepackage{multirow} 代码&#xff1a; \begin{table}[h!] \centering \caption{Your caption here} \begin{tabul…

Vue学习day05笔记

day05 一、学习目标 1.自定义指令 基本语法&#xff08;全局、局部注册&#xff09;指令的值v-loading的指令封装 2.插槽 默认插槽具名插槽作用域插槽 3.综合案例&#xff1a;商品列表 MyTag组件封装MyTable组件封装 4.路由入门 单页应用程序路由VueRouter的基本使用 …

张量之力:人工智能的多维舞台

在人工智能&#xff08;AI&#xff09;的广阔天地里&#xff0c;张量&#xff08;Tensor&#xff09;这一数学概念如同璀璨的明星&#xff0c;以其独特的魅力和强大的功能&#xff0c;为AI技术的发展和应用注入了新的活力。张量&#xff0c;这个源自物理学的概念&#xff0c;如…

day32--Spring(一)

一、Spring简介 1 Spring课程介绍 问题导入 我们为什么要学习Spring框架&#xff1f; 1.1 为什么要学 Spring技术是JavaEE开发必备技能&#xff0c;企业开发技术选型命中率>90% 专业角度 简化开发&#xff0c;降低企业级开发的复杂性框架整合&#xff0c;高效整合其他技…

浅谈安全用电管理系统对重要用户的安全管理

1用电安全管理的重要性   随着社会经济的不断发展&#xff0c;电网建设力度的不断加大&#xff0c;供电的可靠性和供电质量日益提高&#xff0c;电网结构也在不断完善。但在电网具备供电的条件下&#xff0c;部分高危和重要电力用户未按规定实现双回路电源线路供电&#xff1…

nomachine使用记录以及录包以及自动画深度学习网络图

录包命令&#xff1a; rosbag record 话题名字&#xff08;可以是原相机话题和执行程序的话题&#xff09;rosbag play 包名&#xff08;可以离线播放包的数据&#xff09; rqt_image_view 话题可视化yolov8自动生成网络结构图&#xff1a; pip install tensorflowtensorboard…

高考后的职业规划:学习LabVIEW开发前景广阔

在今天的高考后&#xff0c;选择学习LabVIEW开发为未来职业规划将大有可为。LabVIEW以其图形化编程、强大的数据处理和硬件集成功能&#xff0c;广泛应用于工程、科研、自动化测试等领域。掌握LabVIEW开发技能&#xff0c;不仅就业前景广阔&#xff0c;还能参与前沿技术应用&am…

【web前端开发】标签(基础知识详解)

浏览器能识别的标签 编码 <meta charset"UTF-8"> title <title>helloshh</title> 标题 <h1>1级标签</h1> <h2>2级标签</h2> <h3>3级标签</h3> <h4>4级标签</h4> <h5>5级标签</h5> &…

Redis 实现持久化

Redis ⽀持 RDB ( 定期备份 ) 和 AOF ( 实时备份 ) 和 混合持久化 (结合RDB 和 AOF 的特点) 持久化机制&#xff0c;持久化功能有效地避免因进程退出造成数据丢失问题&#xff0c; 当下次重启时利⽤之前持久化的⽂件即可实现数据恢复。 RDB&#xff08;Redis DataBase&#xff…

网络编程之XDP技术介绍

一、简介 XDP&#xff1a;eXpress Data Path&#xff0c;快速数据面&#xff0c;听名字是不是很高大上。其实它就是一个快速处理Rx数据包的数据面技术。为什么现在对数据处理如此敏感&#xff1f;原因非常简单&#xff0c;随着网络的不断覆盖社会的各个层面&#xff0c;海量的…

手撕C语言题典——相交链表

目录 前言 一&#xff0c;思路 1&#xff09;暴力 2)同步指针 二&#xff0c;代码实现 前言 依旧是力扣上的一道题&#xff0c;有许多新思路提供给我们 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/intersection-of-two-linked-li…

烧写uboot、linux镜像、根文件系统到开发板

烧写uboot、linux镜像、根文件系统到开发板 环境介绍 本博客使用x6818开发板。 公司&#xff1a;三星 ARM架构 Cortex-A53核 型号&#xff1a;S5P6818 特性&#xff1a;8核&#xff0c;最高主频2GHz 烧写uboot 使用网络烧写 网络烧写上位机是Ubuntu虚拟机。 先利用上…

运 算 符

算术运算符 算术运算符包括&#xff1a;&#xff0c;-&#xff0c;*&#xff0c;/&#xff0c;%&#xff0c;&#xff0c;-- 当左右两边都是数值型时&#xff0c;则做加法运算。 当左右两边有一方为字符串&#xff0c;则做拼接运算。任何一个 Java 对象都可以转换为字符串。 …