基于高德地图的地图选点获取经纬度组件

基于高德地图的地图选点获取经纬度组件

在开发项目的过程中,业务中有需求需要获取地址及经纬度,故编写此组件以便后续使用。
组件采用Vue,ElementUI,高德地图API

先看一下成果:
位置选择按钮
弹框
接下来,我们看一下代码
1.首先需要引入高德地图

npm i @amap/amap-jsapi-loader --save

2.建一个组件,我把组件放在了项目中components文件夹中,创建MapView

<template>
  <div>
    <!-- 触发按钮 -->
    <el-button @click="openDialog" type="primary" plain>选择位置</el-button>

    <!-- 选点弹窗 -->
    <el-dialog
      title="选择位置"
      :visible.sync="dialogVisible"
      width="60%"
      @closed="handleClose"
    >
      <div class="map-container">
        <!-- 搜索框 -->
        <div class="search-box">
          <el-input
            v-model="searchKey"
            placeholder="请输入地点关键词"
            @keyup.enter.native="handleSearch"
          >
            <el-button
              slot="append"
              icon="el-icon-search"
              @click="handleSearch"
            />
          </el-input>
        </div>

        <!-- 地图容器 -->
        <div id="map-container" style="height: 400px"></div>

        <div>经度:{
  
  {selectedLngLat.lng}},纬度:{
  
  {selectedLngLat.lat}}</div>
        <div>位置:{
  
  {address}}</div>
      </div>

      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type
<think>好的,我现在需要帮用户解决在UniApp中使用高德地图实现地图选点功能的问题。用户想要示例代码,所以我得先理清楚步骤和可能的解决方案。 首先,用户提到的是UniApp和高德地图的结合,可能需要参考已有的引用内容。比如引用[2]提到了pc端vue2+高德地图选点的实现,但存在卡顿和bug。用户可能是在PC端或H5环境下使用,所以需要确保代码兼容性。 然后,引用[3]和[4]都涉及到UniApp中使用map组件和定位功能。尤其是引用[4]提到,如果没有传递经纬度会导致地图白屏,这可能是一个关键点。因此,在示例代码中必须确保获取到当前的经纬度,并传递给地图组件选点接口。 接下来,UniApp的chooseLocation API可能需要高德地图的配置。根据引用[3],H5/APP需要配置高德地图的key,这需要在manifest.json中进行设置。所以示例代码应该包括配置步骤。 另外,用户可能需要地图选点的交互,比如点击按钮打开地图选择位置,然后返回选择的地址信息。引用[4]中的代码展示了使用uni.chooseLocation的方法,但需要传递经纬度。如果用户没有当前位置,可能需要先调用获取定位的API,如uni.getLocation,确保有默认的经纬度。 还需要考虑不同平台的兼容性,比如H5和APP端的区别。在H5端可能需要额外引入高德地图的JS库,或者配置安全域名等。但UniApp的文档提到,使用uni.chooseLocation会自动处理这些,所以可能需要检查配置是否正确。 然后,整理步骤:配置高德地图Key -> 获取当前位置 -> 打开选点界面 -> 处理返回数据。示例代码需要涵盖这些步骤,并处理可能的错误,比如定位权限被拒绝。 可能遇到的问题包括地图白屏(如未传递经纬度)、权限问题、跨平台差异。因此,在代码中需要添加错误处理,并提示用户开启权限。 最后,确保代码语法正确,使用uniapp的API,并参考官方文档。可能需要测试代码在不同环境下的运行情况,确保示例可靠。</think>以下是在UniApp中使用高德地图实现地图选点功能的示例代码和实现步骤: ### 一、前置配置 1. 在`manifest.json`中添加高德地图配置 ```json "h5": { "sdkConfigs": { "maps": { "amap": { "key": "您的高德地图web端密钥" } } } }, "app": { "maps": { "amap": { "key": "您的高德地图Android/iOS端密钥" } } } ``` ### 二、基础实现代码 ```vue <template> <view class="container"> <button @click="openMapPicker">选择位置</button> <view v-if="selectedAddress" class="result-box"> <text>位置名称:{{ selectedAddress.name }}</text> <text>详细地址:{{ selectedAddress.address }}</text> <text>经纬度:{{ selectedAddress.latitude }},{{ selectedAddress.longitude }}</text> </view> </view> </template> <script> export default { data() { return { selectedAddress: null, defaultLocation: { // 默认定位(北京) latitude: 39.90923, longitude: 116.397428 } }; }, methods: { async openMapPicker() { try { // 先获取当前位置 const location = await this.getCurrentLocation(); // 打开地图选点 const res = await uni.chooseLocation({ latitude: location.latitude, longitude: location.longitude, keyword: "地标名" // 可选搜索关键词 }); if (res) { this.selectedAddress = { name: res.name, address: res.address, latitude: res.latitude, longitude: res.longitude }; } } catch (error) { console.error("选点失败:", error); uni.showToast({ title: "位置选择失败", icon: "none" }); } }, async getCurrentLocation() { return new Promise((resolve, reject) => { uni.getLocation({ type: "gcj02", // 必须使用高德坐标系 success: (res) => resolve(res), fail: (err) => { console.warn("获取定位失败,使用默认位置", err); resolve(this.defaultLocation); // 降级处理 } }); }); } } }; </script> <style> .container { padding: 20px; } .result-box { margin-top: 20px; padding: 15px; background: #f5f5f5; border-radius: 8px; } .result-box text { display: block; margin: 5px 0; } </style> ``` ### 三、关键点说明 1. **坐标系必须使用`gcj02`**(高德火星坐标系),使用其他坐标系会导致位置偏移[^3] 2. **双端密钥分离**:Web端和APP端需要分别申请密钥 3. **定位失败降级**:当用户拒绝定位权限时,使用默认坐标保证功能可用性 4. **H5端特殊处理**:需要在高德控制台配置H5域名白名单[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值