Uniapp实现地图获取定位功能

摘要 :本文将手把手教你如何在Uniapp项目中集成地图功能、实现定位获取,并解决微信小程序、APP、H5三端的兼容性问题🚀🚀🚀


一、环境准备

  1. 地图平台选择

    • 微信小程序:腾讯地图(强制使用)
    • H5/APP:可自由选择(高德/百度/谷歌地图)
    • 推荐方案:H5/APP使用高德地图(API免费额度高)
  2. 申请开发者密钥


二、配置地图基础功能

2.1 微信小程序配置

  1. manifest.json配置

    json 复制代码
    "mp-weixin": {
      "appid": "你的小程序ID",
      "setting": {
        "urlCheck": false
      },
      "usingComponents": true,
      "permission": {
        "scope.userLocation": {
          "desc": "需要获取您的位置以提供地图服务"
        }
      },
      "requiredPrivateInfos": ["getLocation"]
    }
  2. 页面中使用map组件

    html 复制代码
    <map 
      id="myMap" 
      style="width: 100%; height: 300px;" 
      :latitude="latitude" 
      :longitude="longitude"
      show-location
    ></map>

2.2 H5/APP配置(以高德地图为例)

  1. manifest.json注入SDK

    json 复制代码
    "h5": {
      "sdkConfigs": {
        "maps": {
          "amap": {
            "key": "你的高德Web端Key"
          }
        }
      }
    },
    "app": {
      "maps": {
        "amap": {
          "iosKey": "iOS端Key",
          "androidKey": "Android端Key"
        }
      }
    }
  2. 通过uni.chooseLocation调用地图

    javascript 复制代码
    uni.chooseLocation({
      success: (res) => {
        console.log('位置名称:' + res.name);
        console.log('经纬度:', res.latitude, res.longitude);
      }
    });

三、获取用户定位

3.1 基础定位实现

javascript 复制代码
// 获取经纬度
uni.getLocation({
  type: 'wgs84', // 微信小程序必须为wgs84
  success: (res) => {
    this.latitude = res.latitude;
    this.longitude = res.longitude;
  },
  fail: (err) => {
    uni.showToast({ title: '获取定位失败', icon: 'none' });
  }
});

3.2 定位转具体地址(逆地理编码)

javascript 复制代码
// 需配合高德API(H5/APP示例)
import amap from '@/common/amap-wx.js'; // 从高德官网下载SDK

const amapPlugin = new amap.AMapWX({
  key: '你的高德Web端Key'
});

amapPlugin.getRegeo({
  location: `${longitude},${latitude}`,
  success: (data) => {
    console.log('详细地址:', data[0].regeocodeData.formatted_address);
  }
});

四、多平台适配要点

4.1 条件编译处理差异

html 复制代码
<!-- 微信小程序使用原生map组件 -->
<!-- #ifdef MP-WEIXIN -->
<map ...></map>
<!-- #endif -->

<!-- H5/APP使用第三方地图 -->
<!-- #ifdef H5 || APP -->
<web-view :src="amapUrl"></web-view>
<!-- #endif -->

4.2 权限配置

  • Android :在manifest.json中添加:

    json 复制代码
    "android": {
      "permissions": [
        "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
        "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>"
      ]
    }
  • iOS :需在manifest.json中勾选Location usage description


五、常见问题及解决方案

问题现象 原因分析 解决方案
微信小程序地图不显示 未配置mapKey 在微信公众平台申请并配置mapKey
H5定位失败 非HTTPS环境 本地开发使用Chrome开启--unsafely-treat-insecure-origin-as-secure
APP返回错误代码LOCATION_FAILED 未开启定位权限 检查manifest配置并引导用户手动开启权限
逆地理编码返回null 未绑定安全域名(H5) 在高德控制台添加当前域名白名单

注意点

  1. 统一坐标系 :微信小程序使用wgs84,高德地图用gcj02,需注意转换
  2. 错误兜底:定位失败时显示手动选择位置按钮
  3. 性能优化 :使用<map>组件的@regionchange事件懒加载标记点
相关推荐
头发还在的女程序员17 小时前
基于 Spring Boot + Vue 3 + uni-app 的灵活用工系统:四端架构与业务流程设计
vue.js·spring boot·uni-app·灵活用工·灵工系统
Dumbness3 天前
订阅消息弹窗必须在用户点击里调:联调实验室里 timing 和 Mock 支付通知踩的坑
javascript·uni-app
码间留白4 天前
uni-app 鸿蒙离线打包:一个改动从源码到真机要穿过几条链
uni-app·鸿蒙·deveco·离线打包·uts插件
多客:duokelijie4 天前
代练订单系统选型思路:跨品类游戏接入、订单分层管理、自动结算逻辑拆解!
数据库·mysql·微信小程序·前端框架·uni-app·php·持续部署
码间留白5 天前
鸿蒙端对接 BLE 血压计:从一次握手到读数入库(二)设备篇
物联网·uni-app·鸿蒙·蓝牙ble·血压计
华玥作者6 天前
Vue 3 + TypeScript + uni-app 组件库推荐:hy-app(华玥组件库)
vue.js·typescript·uni-app
FinelyYang6 天前
uniapp使用kkfileview在线预览ppt,excel,word,pdf类型文件
pdf·uni-app·powerpoint
2501_916008896 天前
iPhone 设备信息查看,用 KeyMob 看型号、序列号、电池健康和 UDID
android·ios·小程序·https·uni-app·iphone·webview
ModyQyW6 天前
vite-plugin-uni-manifest 0.7:在 uni-app 读取之前生成
前端·uni-app
lyz2468596 天前
uniapp vue3 小程序开发注意事项
uni-app