【实战教程】Uni-App开发:轻松集成高德地图,实现精准位置选点功能

上周接到腾讯客服的电话,说是要收取5万一年的服务费,如果不交,就要停掉我们相关的腾讯地图服务。公司不想交这个钱,就临时决定把项目中的所有腾讯地图改为高德地图(距离项目上线还有3天的时间🙃🙃🙃,当时也没说要收费…)🤢🤮🤮
在这里插入图片描述

没得办法又得加班搞了,😫😫😫心累ing…

先来看看效果图吧

在这里插入图片描述

(本项目是uni-app + vue3 + pinia + js)

完成代码我会放在文章的最下面

正文开始~

引入高德地图小程序插件

我们需要到高德地图微信小程序插件文档入门指南-微信小程序插件|高德地图API (amap.com)里面下载插件amap-wx.js 文件plugin文件夹或者utils文件夹中。

在这里插入图片描述

我们需要稍微修改一下代码否则就会出现下面的问题

在amap-wx.js文件的底部修改一下导出

// module.exports.AMapWX = AMapWX;
export default { AMapWX };

在amap-wx.js文件的上面手动导出一个函数

export function AMapWX(a) {
    this.key = a.key;
    this.requestConfig = { key: a.key, s: 'rsx', platform: 'WXJS', appname: a.key, sdkversion: '1.2.0', logversion: '2.0' };
    this.MeRequestConfig = { key: a.key, serviceName: 'https://restapi.amap.com/rest/me' };
}

如果在开发中还会遇到问题,可以尝试着把amap-wx.js文件中的所有wx.改为uni.(网上的偏方🧑‍⚕️🧑‍⚕️🧑‍⚕️)

在这里插入图片描述

初始化地图

申请高德地图key的方法我就不介绍了,网上有很多的,申请完key后,我们在在vue3的onMounted创建高德地图实例,并调用获取地址描述信息的方法

高德地图文档👇👇👇👇👇👇

基础类-参考手册-微信小程序插件 | 高德地图API (amap.com)

<template>
    <view>
        <view class="map_container">
            <map
                :class="['map']"
                :id="'map'"
                :longitude="longitude"
                :latitude="latitude"
                :scale="14"
                :show-location="true"
                :markers="markers"
                @click="handleMarkerTap"></map>
        </view>
    </view>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import * as amapFile from '../../plugin/amap-wx.130';

const longitude = ref(null); // 经度
const latitude = ref(null); // 纬度
const markers = ref([]); //
const textData = ref({});
const myAmapFun = ref(null);
const key = ref('自己申请的key'); // 高德地图key
const addressList = ref([]); // 周边列表
const searchAddressList = ref([]); // 搜索返回的周边列表
const activeId = ref(-1); // 当前选中的周边id
const isSearch = ref(false); // 是否搜索状态
const searchKey = ref(''); // 用户搜索的内容

onMounted(() => {
    myAmapFun.value = new amapFile.AMapWX({ key: key.value });
    getRegeo(true);
});

const getRegeo = (isUseResAddress) => {
    let location = null;
    if (longitude.value != null && latitude.value != null) {
        location = longitude.value + ',' + latitude.value;
    }

    myAmapFun.value.getRegeo({
        iconPath: '../../static/marker.png',
        iconWidth: 22,
        iconHeight: 32,
        location: location,
        success: (data) => {
            console.log('成功的数据', data[0].regeocodeData);
            if (isUseResAddress) {
               latitude.value = data[0].latitude;
               longitude.value = data[0].longitude;
           }
            
        },
        fail: function (info) {
            wx.showModal({ title: info.errMsg });
        },
    });
};
// 用户点击地图
const handleMarkerTap = (ev) => {
    console.log('点击标记点触发', ev);
    latitude.value = ev.detail.latitude;
    longitude.value = ev.detail.longitude;
    getRegeo();
};
<style lang="scss" scoped>
.map_container {
    position: relative;
    top: 0;
    bottom: 80px; /* 底部留出的空间 */
    left: 0;
    right: 0;
}
.map {
    width: 100%;
    /* 计算总的高度,减去底部空间,然后取45% */
    height: calc((100vh - 80px) * 0.45);
}
</style>

这样你就可以看到地图组件初始化的界面和取得的相关数据了。

在这里插入图片描述
在这里插入图片描述
如果项目中出现了这样的报错:

在这里插入图片描述

那么你需要到manifest.json文件中找到mp-weixin的增加一些配置
在这里插入图片描述

"mp-weixin": {
    "appid": "自己申请的小程序appid",
    "setting": {
        "urlCheck": false
    },
    "permission": {
        "scope.userLocation": {
            "desc": "你的位置信息将用于小程序位置接口的效果展示"
        },
        "scope.userProfile": {
            "desc": "获取用户信息"
        }
    },
    "requiredPrivateInfos": ["chooseLocation", "getLocation"],
    "usingComponents": true,
    "lazyCodeLoading": "requiredComponents",
    "libVersion": "latest"
},

更改后记得重新编译小程序❗❗❗(如果还是没有解决,清空一下微信开发者工具缓存。

根据数据中POI数组渲染周围地址信息

在返回的信息中可以看到pois数组,这个数组就是我们要遍历的显示在下面的数据

### 如何在 UniApp 微信小程序中使用高德地图 API 实现地图功能 #### 了解基础概念 在 UniApp 或者原生微信小程序框架中使用高德地图,并不是 UI 层面直接调用高德地图,而是 API 调用了高德地图的服务。UI 显示部分仍然依赖于框架内置的地图组件,在微信小程序里即为腾讯地图[^1]。 #### 准备工作 为了能够顺利集成并使用高德地图的 API 功能开发者需要先申请相应的 API Key 并确保该 key 已经被授权可以在指定的应用程序内合法访问服务接口[^2]。 #### 接入高德地图 API 的具体实现方法 ##### 获取当前位置坐标 可以利用 `wx.getLocation` 方法来获得用户的当前地理位置信息,之后再转换成适用于高德地图的数据格式以便后续处理: ```javascript // 获取位置信息 uni.getLocation({ type: 'gcj02', // 返回可以用于 amap api 的火星坐标系下的经纬度数据 success(res) { console.log('当前位置:', res); const latitude = res.latitude; const longitude = res.longitude; // 将获取到的位置发送给服务器端或者其他逻辑操作... } }); ``` ##### 发起 HTTP 请求至高德 RESTful Web Service 当有了地理坐标后就可以向高德开放平台提供的各种在线服务发起请求了,比如查询 POI (Point of Interest),逆/正地理编码等功能。这里以搜索周边兴趣点为例展示如何构建 URL 和解析返回的结果集: ```javascript function searchPOIs(keyword, location){ let url = `https://restapi.amap.com/v3/place/text?key=YOUR_API_KEY&keywords=${keyword}&location=${location}&output=json`; uni.request({ url, method:'GET', success(response){ if(response.statusCode === 200 && response.data.status==='1'){ var pois=response.data.pois; console.log(pois); }else{ console.error("Error:",response.errMsg||'未知错误'); } }, fail(err){console.error(err);} }); } ``` 请注意替换上述代码中的 YOUR_API_KEY 字符串为你自己从高德官网申请得到的有效密钥字符串[^3]。 ##### 处理跨域问题 如果遇到因安全策略限制而无法正常加载资源的情况,则需按照官方指引配置好业务域名白名单设置以及 CORS 支持选项,从而允许来自特定源站发出的 AJAX 请求成功到达目标地址完成交互过程。 #### 结合实际案例说明 假设现在要在一个简单的页面上显示附近餐馆的信息列表,那么可以根据上面介绍的方法编写如下完整的 JavaScript 文件内容: ```html <template> <view class="container"> <!-- 这里放置其他视图元素 --> </view> </template> <script> export default { data() { return {}; }, onLoad(){ this.searchNearbyRestaurants(); }, methods:{ async searchNearbyRestaurants(){ try{ await new Promise((resolve,reject)=>{ wx.getLocation({type:"gcj02",success:(res)=>{resolve(`${res.longitude},${res.latitude}`)},fail:reject}) }).then(location=>{ return searchPOIs('餐厅',location); }); }catch(error){ console.warn(`未能取得有效定位:${error.message}`); } } } }; </script> ``` 以上便是关于怎样在 UniApp 构建的小程序项目里面加入高德地图 API 来增强应用特性的基本指导[^3].
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值