使用Vue3+ElementPlus+高德地图实现在浏览器中搜索地点并被标记在地图中

效果描述

在页面的输入框中输入想要查询的地点,在输入框的下方会提示跟输入的关键字有关地点,然后按下回车键或者选择下方罗列的地点即可让地图跳转到搜索的位置。

效果展示

页面渲染完成的时候
输入想要查询的地点
按下回车键之后

代码实现

<template>
  <div>
    <div id="container" style="width: 100%; height: 500px"></div>
    <div id="myPageTop">
      <!-- clearable:是否显示清除按钮,只有当 type 不是 textarea时生效 -->
      <!-- @keyup.enter:当回车键按下的时候触发 -->
      <el-input
        id="tipinput"
        v-model="searchKeyword"
        placeholder="请输入关键字"
        clearable
        @keyup.enter="searchLocation"
      ></el-input>
    </div>
  </div>
</template>

<script>
import { onMounted, ref } from "vue";
// 引入高德地图API
import { load } from "@amap/amap-jsapi-loader";

export default {
  setup() {
    // 用户输入的地点关键字
    const searchKeyword = ref("");
    let map = null; //初始化地图
    let placeSearch = null; // 声明placeSearch变量

    onMounted(async () => {
      // 设置高德地图的安全配置【此处一定要配置,否则会搜索失败】
      window._AMapSecurityConfig = {
        securityJsCode: "换成你的密钥",
      };
      // 初始化地图
      map = await initMap();
      // 加载插件并绑定事件
      ({ placeSearch } = await loadPluginsAndBindEvents(map)); // 返回并解构出placeSearch
    });

    // 初始化高德地图实例
    async function initMap() {
      // 加载搞得地图API,包括指定的版本和插件
      const AMap = await load({
        key: "换成你的key", // 高德地图API Key
        version: "2.0",
        plugins: ["AMap.PlaceSearch", "AMap.AutoComplete"],
      });
      // 创建地图实例,设置容器ID和允许自适应窗口大小
      return new AMap.Map("container", {
        resizeEnable: true,
      });
    }

    // 加载插件并绑定事件
    async function loadPluginsAndBindEvents(map) {
      const autoOptions = {
        input: "tipinput", //绑定到输入框的ID
      };
      // 创建自动完成实例
      const auto = new AMap.AutoComplete(autoOptions);
      // 创建地点搜索实例,关联到地图
      const ps = new AMap.PlaceSearch({
        map: map,
      });
      // 绑定自动完成的选中事件,根据选中的地点设置城市并执行搜索
      auto.on("select", (e) => {
        ps.setCity(e.poi.adcode); //设置搜索城市为选中地点的城市编码
        ps.search(e.poi.name); //搜索选中地点的名称
      });

      return { placeSearch: ps }; // 返回placeSearch实例
    }

    // 处理地点搜索逻辑
    async function searchLocation() {
      // 判断用户是否输入了关键字
      if (!searchKeyword.value.trim()) {
        ElMessage.error("请输入搜索内容!");
        return;
      }

      // 执行地点搜索,并处理搜索结果
      placeSearch.search(searchKeyword.value, (status, result) => {
        console.log(status, result);
        if (status === "complete" && result.info === "OK") {
          // 如果搜索成功且有搜索结果
          if (result.poiList.pois.length > 0) {
            // 取第一个搜索结果,设置地图中心和缩放级别
            const poi = result.poiList.pois[0];
            map.setCenter([poi.location.lng, poi.location.lat]);
            map.setZoom(15); //缩放级别
          } else {
            ElMessage.error("未找到相关地点!");
          }
        } else {
          ElMessage.error("搜索失败!");
        }
      });
    }

    return {
      searchKeyword,
      searchLocation,
    };
  },
};
</script>

<style>
/* 引入高德地图样式 */
@import url("https://cache.amap.com/lbs/static/main1119.css");
</style>

设置高德地图Key

登录高德地图开放平台

点击标题栏中的控制台,进入到控制台界面

点击应用管理 ==》我的应用,如果有应用的话创建个应用,也可以用之前的应用,然后点击添加Key,写入key的名称 ==》服务平台选择Web端(JS API) ==》勾选阅读并同意 ==》点击提交按钮,即可创建一个新的Key

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用高德地图实现模糊搜索定位,你需要先在项目引入高德地图JavaScript API,并且需要获取高德地图的 API key。接下来,你可以使用 Autocomplete 插件实现模糊搜索,具体实现步骤如下: 1. 在 Vue 3 安装高德地图JavaScript API。 ```bash npm install @amap/amap-jsapi-loader --save ``` 2. 在 main.ts 文件引入高德地图JavaScript API,并在创建 Vue 实例之前加载 JavaScript API。 ```typescript import { createApp } from 'vue' import App from './App.vue' import AMapLoader from '@amap/amap-jsapi-loader' AMapLoader.load({ key: 'your_amap_api_key', version: '2.0', plugins: ['AMap.Autocomplete'] }).then(() => { createApp(App).mount('#app') }) ``` 3. 在组件使用 Autocomplete 插件实现模糊搜索。 ```vue <template> <div> <input v-model="address" placeholder="请输入地址" /> <ul> <li v-for="suggestion in suggestions" :key="suggestion.id">{{ suggestion.name }}</li> </ul> </div> </template> <script lang="ts"> import { defineComponent, ref } from 'vue' import AMapLoader from '@amap/amap-jsapi-loader' export default defineComponent({ name: 'AutoCompleteDemo', setup() { const address = ref('') const suggestions = ref([]) const search = async () => { const AMap = await AMapLoader.load({ key: 'your_amap_api_key', version: '2.0', plugins: ['AMap.Autocomplete'] }) const autoComplete = new AMap.Autocomplete({ city: '全国' }) autoComplete.search(address.value, (status, result) => { if (status === 'complete' && result.tips) { suggestions.value = result.tips } }) } return { address, suggestions, search } } }) </script> ``` 在这个例子,我们使用了 ref 函数来创建了两个响应式变量 address 和 suggestions,分别用于存储输入的地址和搜索结果。我们还定义了一个 search 函数,在用户输入时触发,它会通过 AMapLoader.load() 方法加载 Autocomplete 插件,并使用 Autocomplete.search() 方法进行模糊搜索。当搜索完成时,Autocomplete.search() 的回调函数会返回搜索结果,我们将结果存储在 suggestions 变量,并在页面渲染出来。 注意,这里我们设置了 city 属性为全国,表示搜索范围为全国。你也可以根据需要修改为特定的城市或区域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值