高德地图模糊搜索地址(elementUI)

时间:2024-02-18 13:25:14
首先引入AMap:
1、在index.html引入AMap
<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.6&key=你申请的key&plugin=AMap.Geocoder"></script>
<script src="http://webapi.amap.com/ui/1.0/main.js"></script>

2、在build/webpack.base.conf.js中找到module.exports,在末尾添加以下代码:

externals: {
   \'AMap\': \'AMap\'
}

3、在需要调用地图的文件中导入AMap,就可以直接调用AMap的API

import AMap from \'AMap\'

注意:

本例中只用到了AMap.Geocoder插件,如果要调用其他的plugin,如AMap.Driving,需要在index.html相应加载(多个plugin用逗号隔开):

<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.6&key=你申请的key&plugin=AMap.Driving,AMap.Geocoder"></script>

 

下面介绍高德地图模糊搜索地址的使用:

 
<template>
    <el-form class="wrapper" ref="orderForm" :model="orderForm" :rules="addRules" label-width="100px">
        <el-form-item label="上车地点:" prop="sname">
            <el-input id="sname" v-model="orderForm.sname" type="text"
                      @focus="initAuto(\'sname\')"
                      @input="snameSearch"
                      @keyup.delete.native="deletePlace(\'sname\')"
                      placeholder="请输入上车地点">
                <i
                    class="el-icon-location-outline el-input__icon"
                    slot="suffix" title="上车地点">
                </i>
            </el-input>
        </el-form-item>
        <el-form-item label="下车地点:" prop="dname">
            <el-input id="dname" v-model="orderForm.dname" type="text"
                      @focus="initAuto(\'dname\')"
                      @input="dnameSearch"
                      @keyup.delete.native="deletePlace(\'dname\')"
                      placeholder="请输入下车地点">
                <i
                    class="el-icon-location-outline el-input__icon"
                    slot="suffix" title="下车地点">
                </i>
            </el-input>
        </el-form-item>
        <el-form-item>
            <el-button type="primary" size="small" @click="toSubmit">提交</el-button>
        </el-form-item>
        <el-form-item v-if="infoVisible">
            <div>上车地点:{{orderForm.sname}},经度:{{orderForm.slon}},纬度:{{orderForm.slat}}</div>
            <div>下车地点:{{orderForm.dname}},经度:{{orderForm.dlon}},纬度:{{orderForm.dlat}}</div>
        </el-form-item>
    </el-form>
</template>
<script>
    import AMap from \'AMap\'

    export default {
        data() {
            let validatePlace = (rules, value, callback) => {
                if(rules.field===\'sname\'){
                    if (value === \'\') {
                        callback(new Error(\'请输入上车地点\'));
                    } else {
                        if(!this.orderForm.slat || this.orderForm.slat===0) {
                            callback(new Error(\'请搜索并选择详细上车地点\'));
                        } else {
                            callback();
                        }
                    }
                } else if(rules.field===\'dname\'){
                    if (value === \'\') {
                        callback(new Error(\'请输入下车地点\'));
                    } else {
                        if(!this.orderForm.dlat || this.orderForm.dlat===0) {
                            callback(new Error(\'请搜索并选择详细下车地点\'));
                        } else {
                            callback();
                        }
                    }
                }
            };
            return {
                orderForm: {
                    sname: \'\', // 上车地点
                    slat: 0, // 上车地点纬度
                    slon: 0, // 上车地点经度
                    dname: \'\', // 下车地点
                    dlat: 0, // 下车地点纬度
                    dlon: 0 // 下车地点经度
                },
                addRules: {
                    sname: [{required: true, validator: validatePlace, trigger: \'change\'}],
                    dname: [{required: true, validator: validatePlace, trigger: \'change\'}]
                },
                snameAuto: null, // 上车地点Autocomplete
                dnameAuto: null, // 下车地点Autocomplete
                snameAutoListener: null,// 上车地点Autocomplete监听器
                dnameAutoListener: null,// 下车地点Autocomplete监听器
                infoVisible: false // 选中地址信息显示
            }
        },
        methods: {
            // 实例化Autocomplete
            toInitAuto(inputId) {
                var auto = null;
                AMap.plugin(\'AMap.Autocomplete\',function(){//回调函数
                    //实例化Autocomplete
                    let autoOptions = {
                        city: "", //城市,默认全国
                        input:inputId //使用联想输入的input的id
                    };
                    auto= new AMap.Autocomplete(autoOptions);
                    //TODO: 使用autocomplete对象调用相关功能
                });
                return auto;
            },
            // 初始化搜索地址弹层
            initAuto(inputId) {
                if(inputId==="sname" && this.snameAuto==null) {
                    this.snameAuto = this.toInitAuto(inputId);
                } else if(inputId==="dname" && this.dnameAuto==null){
                    this.dnameAuto = this.toInitAuto(inputId);
                }
            },
            // 上车地点搜索
            snameSearch() {
                if(AMap.event && this.snameAuto){
                    this.snameAutoListener = AMap.event.addListener(this.snameAuto, "select", (e) => {  //注册监听,当选中某条记录时会触发
                        if(e.poi.location && e.poi.location.getLat()){
                            this.orderForm.slat = e.poi.location.lat;
                            this.orderForm.slon = e.poi.location.lng;
                            this.orderForm.sname = e.poi.name;
                            this.$refs.orderForm.validateField("sname"); // 触发选择时验证字段
                        } else {
                            this.geocoder(e.poi.name, "sname");
                        }
                    });
                }
            },
            // 下车地点搜索
            dnameSearch() {
                if(AMap.event && this.dnameAuto){
                    this.dnameAutoListener = AMap.event.addListener(this.dnameAuto, "select", (e) => {  //注册监听,当选中某条记录时会触发
                        if(e.poi.location && e.poi.location.getLat()) {
                            this.orderForm.dlat = e.poi.location.lat;
                            this.orderForm.dlon = e.poi.location.lng;
                            this.orderForm.dname = e.poi.name;
                            this.$refs.orderForm.validateField("dname");// 触发选择时验证字段
                        } else {
                            this.geocoder(e.poi.name, "dname");
                        }
                    });
                }
            },
            geocoder(keyword, inputValue) {
                let geocoder = new AMap.Geocoder({
                    //city: "010", //城市,默认:“全国”
                    radius: 1000 //范围,默认:500
                });
                //地理编码,返回地理编码结果
                geocoder.getLocation(keyword, (status, result) => {
                    if (status === \'complete\' && result.info === \'OK\') {
                        let geocode = result.geocodes;
                        if(geocode.length > 0){
                            if(inputValue === "sname") {
                                this.orderForm.slat = geocode[0].location.getLat();
                                this.orderForm.slon = geocode[0].location.getLng();
                                this.orderForm.sname = keyword;
                                this.$refs.orderForm.validateField("sname");
                            } else if(inputValue === "dname") {
                                this.orderForm.dlat = geocode[0].location.getLat();
                                this.orderForm.dlon = geocode[0].location.getLng();
                                this.orderForm.dname = keyword;
                                this.$refs.orderForm.validateField("dname");
                            }
                        }
                    }
                });
            },
            // 做删除操作时还原经纬度并验证字段
            deletePlace(inputId){
                if(inputId === "sname"){
                    this.orderForm.slat = 0;
                    this.orderForm.slon = 0;
                    this.$refs.orderForm.validateField("sname");
                } else if(inputId === "dname"){
                    this.orderForm.dlat = 0;
                    this.orderForm.dlon = 0;
                    this.$refs.orderForm.validateField("dname");
                }
            },
            toSubmit(){
                this.$refs.orderForm.validate((valid) => {
                    if(valid){
                        // submit code...
                        console.info(this.orderForm);
                        this.infoVisible = true;
                    }
                });
            },
        },
        beforeDestroy: function () {
            // 释放内存
            if(this.snameAutoListener){
                AMap.event.removeListener(this.snameAutoListener);
            }
            if(this.dnameAutoListener){
                AMap.event.removeListener(this.dnameAutoListener);
            }
        }
    }
</script>
<style>
    .wrapper {
        margin: 50px;
        width: 450px;
    }
</style>

 

 效果图如下: