vue实现高德地图POI关键字搜索地点

1、安装引入高德地图,在需要的页面引入

npm i @amap/amap-jsapi-loader --save
npm install --save amap
import AMapLoader from '@amap/amap-jsapi-loader';
import Amap from 'amap';

 2、在pbulic 下的index.html 文件里引入高德JSAPI 及UI组件

    <script type="text/javascript">
      window._AMapSecurityConfig = {
          securityJsCode:'申请的密钥',
      }
    </script>

  <!--引入高德地图JSAPI -->
<script src="//webapi.amap.com/maps?v=2.0&key=申请的key"></script>

<!--引入UI组件库(1.1版本高德) -->
<script src="//webapi.amap.com/ui/1.1/main.js"></script>

3、写id="container" 的页面容器

 <el-button  type="primary" style="margin-left:60px;" @click="confirmPosition">点击确认位置</el-button> 

<div id="container" tabindex="10" class="mapContainer">
      <div id="pickerBox">
           <input id="pickerInput" placeholder="输入关键字选取地点" />
           <div id="poiInfo"></div>
       </div>
 </div>

4、在created里调用初始化

//<***********高德地图**********>

//设置DomLibrary,jQuery或者Zepto
 AMapUI.setDomLibrary($);
     var that=this
        //加载PositionPicker,loadUI的路径参数为模块名中 'ui/' 之后的部分
    AMapUI.loadUI(['misc/PositionPicker','misc/PoiPicker'], function(PositionPicker,PoiPicker) {
          var map = new AMap.Map('container',{
        zoom:16,
        center:[117.227308,31.820571]
    })

    var positionPicker = new PositionPicker({
        mode:'dragMap',//设定为拖拽地图模式,可选'dragMap'、'dragMarker',默认为'dragMap'
        map:map//依赖地图对象
    });
    //TODO:事件绑定、结果处理等
    positionPicker.on('success', function(positionResult) {
        console.log('成功',positionResult);
        that.positionResult=positionResult
        console.log('this.positionResult 11=',that.positionResult);
    });
    positionPicker.on('fail', function(positionResult) {
        console.log('失败',positionResult);
        that.$notify.error({
          title: "提示",
          message: "选取失败,请重新加载",
          showClose: true,
        });
    });
     //开启拖拽选址
      positionPicker.start();


// <************  地址搜索开始  ************>
       var poiPicker = new PoiPicker({
            //city:'北京',
            input: 'pickerInput'
        });

        //初始化poiPicker
       poiPickerReady(poiPicker);

        function poiPickerReady(poiPicker) {

        window.poiPicker = poiPicker;

        var marker = new AMap.Marker();

        var infoWindow = new AMap.InfoWindow({
            offset: new AMap.Pixel(0, -20)
        });

        //选取了某个POI
        poiPicker.on('poiPicked', function(poiResult) {

            var source = poiResult.source,
                poi = poiResult.item,
                info = {
                    source: source,
                    id: poi.id,
                    name: poi.name,
                    location: poi.location.toString(),
                    address: poi.address
                };

            marker.setMap(map);

            marker.setPosition(poi.location);
            
            map.setCenter(marker.getPosition());
            map.remove(marker)
        });

       
    }


},


);

5、按钮点击确定所选位置

//确认地图位置
    confirmPosition(){
      var that = this
        that.merchantInfo.longitude=that.positionResult.position.lng
        that.merchantInfo.latitude=that.positionResult.position.lat
        that.merchantInfo.storePlace=that.positionResult.address
        that.merchantInfo.storeLocation=that.positionResult.nearestJunction
    },

6、容器样式

 .mapContainer{
  width:700px;
  height:400px;
 margin-left: 60px;
}
#pickerBox {
        position: absolute;
        z-index: 9999;
        top: 10px;
        right: 5px;
        width: 220px;
    }
    
    #pickerInput {
        width: 200px;
        padding: 5px 5px;
    }
    
    #poiInfo {
        background: #fff;
    }
    
    .amap_lib_placeSearch .poibox.highlight {
        background-color: #CAE1FF;
    }
    
    .amap_lib_placeSearch .poi-more {
        display: none!important;
    }

7、效果

 

 

<think>好的,我需要帮助用户在Vue2项目中集成高德地图API,实现根据关键字搜索地理位置的功能。首先,我应该回顾用户提供的引用内容,看看有哪些已有的信息和可能的解决方案。 用户提供了三个引用,都是关于在Vue中使用高德地图API的。引用[1]和[2]提到了输入提示插件和如何显示搜索结果,引用[3]则提到了使用lodash的debounce函数以及POI搜索。用户现在想要在Vue2中根据关键字搜索位置,可能需要结合这些信息。 首先,我需要确认高德地图API的基本使用步骤。根据官方文档,通常需要引入JS API,设置安全密钥,然后初始化地图和插件。Vue项目中可能需要使用AMapLoader来异步加载API,避免阻塞。 接下来,用户需要在输入框中输入关键字,然后触发搜索。这里可以考虑使用输入提示插件(AMap.AutoComplete)或者直接调用POI搜索接口。输入提示插件更适合实时显示建议,而POI搜索可能更适用于用户输入后执行搜索。根据引用[2],用户可能想要输入时显示提示,所以输入提示插件更适合。 但是用户的问题是根据关键字搜索位置,这可能涉及到执行搜索并显示结果,而不仅仅是输入提示。这时候可能需要结合两种方法:使用输入提示来获取建议,然后当用户选择某个建议时,获取其详细信息,或者直接使用POI搜索接口根据关键字获取结果。 根据引用[3],他们使用了AMapLoader和debounce函数,可能是为了减少API请求频率,避免频繁触发搜索。因此,在实现时,应该考虑对输入事件进行防抖处理。 现在需要构建一个示例步骤: 1. 注册高德开发者账号并创建应用,获取key和安全密钥。 2.Vue项目中安装必要的依赖,比如amap-jsapi-loader和lodash的debounce。 3. 在组件中引入AMapLoader,并初始化地图。 4. 创建输入框,绑定到Vue的数据属性。 5. 使用debounce处理输入事件,当输入变化时触发搜索。 6. 调用高德的POI搜索接口或输入提示插件来获取结果。 7. 处理返回的数据并展示,比如在地图上打点或显示列表。 需要注意,高德地图JS API需要在有安全密钥的情况下使用,且可能需要配置Web服务的API Key。此外,组件的销毁阶段需要清理地图实例,避免内存泄漏。 可能遇到的问题包括:跨域问题,但高德API应该处理好了;正确加载API库;输入事件处理是否正确;以及如何将搜索结果显示在地图上或列表中。引用[2]中提到的问题是关于多个输入框使用输入提示插件,但用户的问题可能只需要一个输入框,所以可以直接参考官方示例,但需要适配到Vue2的响应式数据绑定。 总结步骤,编写示例代码,并确保使用$和$$格式的数学公式(如果有的话),但在这个问题中可能不涉及数学公式。需要检查是否有任何地方需要行内或独立公式,比如在计算坐标时的数学表达式,但可能不需要。不过用户要求所有数学表达式必须正确使用LaTeX,所以如果有任何地方需要,比如计算距离的公式,应该用$...$包裹。 最后,生成相关问题,可能涉及性能优化、错误处理、多个输入框的实现等。</think>在Vue2项目中集成高德地图API实现关键字搜索功能,需按照以下步骤操作: --- ### 一、准备工作 1. **注册高德开发者账号** 前往[高德开放平台](https://lbs.amap.com/)注册账号,创建应用并获取`Web端JS API Key`和安全密钥`securityJsCode`[^1]。 2. **安装依赖** ```bash npm install @amap/amap-jsapi-loader --save npm install lodash --save # 用于输入防抖 ``` --- ### 二、基础实现代码 #### 1. 初始化地图与搜索功能 ```html <template> <div> <input v-model="keyword" @input="handleSearch" placeholder="输入地点关键字" > <div id="mapContainer" style="width: 600px; height: 400px"></div> <ul v-if="results.length"> <li v-for="item in results" :key="item.id" @click="selectLocation(item)"> {{ item.name }} - {{ item.address }} </li> </ul> </div> </template> <script> import AMapLoader from '@amap/amap-jsapi-loader'; import { debounce } from 'lodash'; export default { data() { return { map: null, keyword: '', results: [] }; }, mounted() { this.initMap(); }, methods: { async initMap() { try { const AMap = await AMapLoader.load({ key: 'YOUR_JS_API_KEY', // 替换为实际Key securityJsCode: 'YOUR_SECURITY_JS_CODE', // 安全密钥 plugins: ['AMap.AutoComplete', 'AMap.PlaceSearch'] }); this.map = new AMap.Map('mapContainer', { zoom: 13, center: [116.397428, 39.90923] // 默认北京中心 }); } catch (error) { console.error('地图初始化失败:', error); } }, // 防抖处理搜索请求(300ms延迟) handleSearch: debounce(function() { if (!this.keyword.trim()) return; const AMap = window.AMap; const autoOptions = { city: '全国' }; const autoComplete = new AMap.AutoComplete(autoOptions); autoComplete.search(this.keyword, (status, result) => { if (status === 'complete' && result.tips) { this.results = result.tips.filter(item => item.location); } }); }, 300), // 选中地点并定位 selectLocation(item) { this.map.setCenter([item.location.lng, item.location.lat]); this.map.setZoom(15); } }, beforeDestroy() { if (this.map) this.map.destroy(); // 避免内存泄漏 } }; </script> ``` --- ### 三、关键配置说明 1. **安全密钥配置** 高德JS API v2.0需在`load`方法中添加`securityJsCode`参数,否则会触发`"AMap" is undefined`错误[^1]。 2. **输入防抖优化** 使用`lodash.debounce`控制输入频率,避免高频触发API请求[^3]。 3. **结果筛选逻辑** 通过`filter(item => item.location)`过滤掉无坐标数据,确保地图可定位。 --- ### 四、常见问题解决 - **跨域错误**:检查`securityJsCode`是否正确配置。 - **无法获取数据**:确认网络请求是否被浏览器插件拦截,或尝试使用`JSONP`模式。 - **多输入框场景**:参考引用[2]将功能封装为独立函数,通过`id`区分不同输入框。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值