H5中实现高德地图位置搜索,地图选点

文章介绍了如何在H5页面中使用高德地图API进行位置搜索,并通过输入框获取关键字,实现地图点击选择点和显示经纬度、城市和详细地址的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求是在 H5 页面中实现地图位置搜索,并且选点

实现过程:

如果没有高德的 key 请先申请

获取高德 Map

const amap = function (key) {
  return new Promise((resolve) => {
    let url = `https://webapi.amap.com/maps?v=1.4.5&key=${key}&callback=AMapLoad`;
    let script = document.createElement("script");
    script.src = url;
    script.charset = "utf-8";

    document.body.appendChild(script);
    window.AMapLoad = function () {
      resolve(window.AMap);
    };
  });
};
amap("高德的key").then((amap) => {
  this.searchAddressMethod(amap); //这个amap就是高德的地图对象Map
});

定义模板

<view class="item">
  <view>搜索:</view>
  <input type="text" id="keyword" style="height: 64rpx; line-height: 64rpx; width: 560rpx;" placeholder="关键字:如杭州市萧山区" @input="onInput" />
  </view>
  <view id="mapContainer"></view>

  <view class="item">
    <view>经纬度:</view>
    <view class="content" v-if="lng && !loadFail">{{ lng }},{{ lat }}</view>
  </view>

  <view class="item">
    <view>城市:</view>
    <view class="content">{{ city }} </view>
  </view>

  <view class="item">
  <view>地址:</view>
  <view class="content">{{ selectAddress }}</view>
</view>

onInput

function onInput(e) {
  const that = this;
  if (that.timeout) clearTimeout(that.timeout);
  this.timeout = setTimeout(() => {
    let placeSearch = new AMap.PlaceSearch({
      map: that.map,
      pageSize: 1, // 设置提醒点数量
    });
    placeSearch.search(e.detail.value);
  }, 300);
}

searchAddressMethod 方法

function searchAddressMethod() {
  const self = this;
  let apis = [
    "AMap.CitySearch",
    "AMap.Autocomplete",
    "AMap.PlaceSearch",
    "AMap.Geocoder",
    "AMap.ToolBar",
  ];
  AMap.plugin(apis, function () {
    var citySearch = new AMap.CitySearch();
    var map;
    // 城市定位 begin
    citySearch.getLocalCity(function (status, result) {
      if (status === "complete" && result.info === "OK") {
        // 查询成功,result即为当前所在城市信息
        console.log(result);
        let rectangle = result.rectangle.split(";")[1].split(",");
        self.lnglat = rectangle.map(Number);
        // 初始化地图 begin
        map = new AMap.Map("mapContainer", {
          resizeEnable: true,
          // center: self.lnglat,//地图中心点
          zoom: self.zoom, //地图显示的缩放级别
          keyboardEnable: false,
        });
        self.map = map;
        map.addControl(new AMap.ToolBar());
        // 初始化地图 end

        // 绑定点击事件 begin
        let marker, geocoder;
        AMap.event.addListener(map, "click", function (e) {
          // 创建标记 begin
          if (marker != null) {
            marker.setMap(null);
          }
          // 修改
          var icon = new AMap.Icon({
            icon: "//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png",
            imageOffset: new AMap.Pixel(0, -60),
            // 图像相对展示区域的偏移量,适于雪碧图等
            imageSize: new AMap.Size(35, 40), // 根据所设置的大小拉伸或压缩图片
          });

          marker = new AMap.Marker({
            icon: icon, // 添加 Icon 实例
            position: e.lnglat,
            offset: new AMap.Pixel(-10, -10),
          });
          marker.setMap(map);
          // 创建标记 end

          // 解析位置 begin
          // 获取经纬度
          self.lat = e.lnglat.lat;
          self.lng = e.lnglat.lng;
          if (!geocoder) {
            geocoder = new AMap.Geocoder({
              // city: "010", //城市设为北京,默认:“全国”
              radius: 1000, //范围,默认:500
            });
          }

          geocoder.getAddress(e.lnglat, function (status, result) {
            if (status === "complete" && result.regeocode) {
              console.log(result);
              var address = result.regeocode.formattedAddress;
              var province = result.regeocode.addressComponent.province;
              var city = result.regeocode.addressComponent.city || province;
              console.log(address);
              self.selectAddress = address;
              self.city = city;
            } else {
              log.error("根据经纬度查询地址失败");
            }
          });
          // 解析位置 end
        });
        // 绑定点击事件 end
      } else {
        self.loadFail = 1;
        self.lng = 0.0001;
        self.lat = 0.0001;
      }
    });
    // 城市定位 end
  });
}

实现效果

在这里插入图片描述

<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]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值