// 完整版高德地图,可以复制代码直接使用

index.html

<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key= 这里的key 自行去高德地图申请 &plugin=AMap.DistrictSearch"></script>

template

<el-cascader size="large"
                        :options="init_list"
                        v-model="selectedOptions"
                        :props="props"
                        @visible-change="show_init"
                        @change="change"
                        change-on-select // 可以跳转二级 ---》 市区的视野
                        placeholder="请选择省/市/区" >
                    </el-cascader>
 
<!-- 高德地图 -->
            <div id="amap-main">
            </div>
 
script 部分

var map, district,polygons = [],
citycode;
import request from '../../api/request'
let node=[]
 
data 
selectedOptions:[],
init_list:[
                {value:1,
                    label:1,
                    level:1
                }
            ],

props : {
                lazy: true,
                lazyLoad (node, resolve) {
                    if(node.data.level){
                        if(node.data.level==="district"){
                            // console.log(node.pathLabels)
                            this.selectedOptions = node.pathLabels
                            map.setZoomAndCenter(13,[node.data.center.lng,node.data.center.lat]);
                            return resolve();
                        }
                    }
                    setTimeout(() => {
                        let nodes=[]
                        district.search(node.value, function(status, result) {
                            if(status === 'complete'){
                                 // console.log(result.districtList[0].level)
                                nodes=result.districtList[0].districtList.map(item=>{
                                    return{
                                        value:item.adcode,
                                        label:item.name,
                                        ...item,
                                        level:result.districtList[0].level,
                                        leaf:result.districtList[0].level==='city'
                                    }
                                })
                                // console.log(nodes)
                                // 通过调用resolve将子节点数据返回,通知组件数据加载完成
                                resolve(nodes);
                            }
                        })
                    },100);
                },
            },
 
created() {
 
        // 获取地图
        this.requestMap()
 
    },
 
methods:
// 根据经纬度向后端请求数据
        requestMap(){
            let that =this
            let url =` 后端接口 ?zoom=14&lat=22.52500873&lng=113.93763613`
            request.get(url).then((res)=>{
                that.updateMap(res)
            })
        },

updateMap(res){
            let that=this
            let array =res.data;
            map = new AMap.Map('amap-main',
                {resizeEnable: true,zoom:14,
                center: new AMap.LngLat(113.95379912288666, 22.535850238935417)
            })
            that.show_init()
            var markers;
            creatMaker(array)
            function creatMaker(array){
                markers = [];
                for(let item of array){
                    var marker = new AMap.Marker({
                        position: new AMap.LngLat(item.longitude,item.latitude),
                        // offset: new AMap.Pixel(-10, -10),
                        // icon: '//vdata.amap.com/icons/b18/1/2.png', // 添加 Icon 图标 URL
                    });
                    markers.push(marker)
                }
                map.add(markers);
            }
            map.on('moveend', mapMoveend);
            function mapMoveend (){
                var zoom = map.getZoom(); //获取当前地图级别
                var center = map.getCenter(); //获取当前地图级别
                // console.info(zoom,center);
                map.remove(markers);
                let url
                if(zoom<11||zoom>16){
                    url =` 后端接口api ?lat=${center.lat}&lng=${center.lng}`;
                }else{
                    url =` 后端接口api ?zoom=${zoom}&lat=${center.lat}&lng=${center.lng}`;
                }
                request.get(url).then((res)=>{
                    // console.info(res)
                    creatMaker(res.data)
                })
            }
        },

change(){
            let that=this
            district.search(that.selectedOptions.slice(-1)[0], function(status, result) {
                if(status === 'complete'){
                    // console.log(result)
                    let res=result.districtList[0];
                    if(res.level==='province'){
                        map.setZoomAndCenter(7,[res.center.lng,res.center.lat]);
                    }
                    if(res.level==='city'){
                        map.setZoomAndCenter(11,[res.center.lng,res.center.lat]);
                    }
                    if(res.level==='district'){
       

      // console.info("获取到当前区的中心点的经纬度:  ",res.center.lng,res.center.lat)
                        // console.info(res.name) // 获取到当前选中的区
                        // console.info(res.adcode)  // 获取到当前区域的 adcode
                        map.setZoomAndCenter(13,[res.center.lng,res.center.lat]);
                    
      <!-- 支持地图逆解,可以用adCode(城市的编码,还可以用 经纬度 ) --!>  

      // AMap.plugin('AMap.Geocoder', function() {
                    //     var geocoder = new AMap.Geocoder({
                    //         // city 指定进行编码查询的城市,支持传入城市名、adcode 和 citycode
                    //         city: '010'
                    //     })
                        
                    //     var lnglat = [116.396574, 39.992706]
                    //     geocoder.getAddress(lnglat, function(status, result) {
                    //         if (status === 'complete' && result.info === 'OK') {
                    //             // result为对应的地理位置详细信息
                    //         }
                    //     })
                    // })
 
 
      }
                }
            })
        },
        // 出现下拉框时 触发请求
        show_init(status){
            if(status){
                //行政区划查询
                let that=this
                var opts = {
                    subdistrict: 1,   //返回下一级行政区
                    showbiz:false  //最后一级返回街道信息
                };
                
                district = new AMap.DistrictSearch(opts);//注意:需要使用插件同步下发功能才能这样直接使用
                district.search('中国', function(status, result) {
                    if(status=='complete'){
                        // console.log(result.districtList[0])  中国地图的所有区域
                        that.init_list=result.districtList[0].districtList.map(item=>{
                            return {
                                value: item.adcode,
                                label: item.name,
                                ...item,
                                level:''
                            }
                        })
                    }
                });
            }
        },
 
 
 

vue+Element-ui 的 el-cascader 做高德地图的省市区三级联动并且是异步加载,点击省市区跳转到对应的区(地图可以通过后端返回的点进行标点)的更多相关文章

  1. vue+element ui项目总结点(一)select、Cascader级联选择器、encodeURI、decodeURI转码解码、mockjs用法、路由懒加载三种方式

    不多说上代码: <template> <div class="hello"> <h1>{{ msg }}</h1> <p> ...

  2. vue + element ui 实现实现动态渲染表格

    前言:之前需要做一个页面,能够通过表名动态渲染出不同的表格,这里记录一下.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9786326.html 网站地址:我的 ...

  3. vue+element ui 的tab 动态增减,切换时提示用户是否切换

    前言:工作中用到 vue+element ui 的前端框架,动态添加 Tab,删除 Tab,切换 Tab 时提示用户是否切换等,发现 element ui  有一个 bug,这里记录一下如何实现.转载 ...

  4. vue + element ui 表格自定义表头,提供线上demo

    前言:工作中用到 vue+element ui 的前端框架,需要使用自定义表头,需要使用 re.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9710826.h ...

  5. vue+element ui 的上传文件使用组件

    前言:工作中用到 vue+element ui 的前端框架,使用到上传文件,则想着封装为组件,达到复用,可扩展.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9 ...

  6. vue+element ui 的表格列使用组件

    前言:工作中用到 vue+element ui 的前端框架,有这个场景:很多表格的列有许多一样的,所以考虑将列封装为组件.转载请注明出处:https://www.cnblogs.com/yuxiaol ...

  7. vue + element ui 阻止表单输入框回车刷新页面

    问题 在 vue+element ui 中只有一个输入框(el-input)的情况下,回车会提交表单. 解决方案 在 el-form 上加上 @submit.native.prevent 这个则会阻止 ...

  8. vue+element ui 的时间控件选择 年月日时分

    前言:工作中用到 vue+element ui 的前端框架,需要选择年月日时分,但element ui官网demo有没有,所以记录一下.转载请注明出处:https://www.cnblogs.com/ ...

  9. Vue+Element UI 实现视频上传

    一.前言 项目中需要提供一个视频介绍,使用户能够快速.方便的了解如何使用产品以及注意事项. 前台使用Vue+Element UI中的el-upload组件实现视频上传及进度条展示,后台提供视频上传AP ...

随机推荐

  1. DC-8 靶机渗透测试

    DC-8 渗透测试 冲冲冲 ,好好学习 . 核心:cms上传添加存在漏洞组件,利用该组件getshell 操作机:kali 172.66.66.129 靶机:DC-4 172.66.66.137 网络 ...

  2. 什么是软件的CLI安装

    Websoft9 在进行开源软件的集成与自动化安装研究过程中发现有些软件有CLI安装模式,例如Gitlab CLI版本.Ghost CLI.PHP CLI等,CLI安装是什么意思? CLI(Comma ...

  3. Java预科:DOS命令及电脑快捷键

    Java预科:DOS命令及电脑快捷键 1.快捷键 常用快捷键 a/t +f4关闭窗口 cmd窗口打开快捷方式 1.开始+系统+命令提示符 2.win+r 输入cmd 3.在任意文件夹下面,按住shif ...

  4. pwnable.kr之unlink

    pwnable.kr之unlink 之前在看别的东西,学习的随笔也没有写完......颓了几天. 由于最近在看堆,就把pwnable.kr上unlink这道题做一下,学习一下. 1.程序分析 #inc ...

  5. Nat Comm | 中科院动物所张勇团队合作揭示动物中DNA转座子介导基因重复的机制

    1950年Barbara Mclintock 首次在玉米中发现转座子(TEs),并由此获得诺贝尔奖.尽管长期被认为是垃圾DNA,但现在TEs被广泛认可是宿主基因组演化的重要推动力.它们可引起包含基因重 ...

  6. 靶机DC-2 rbash绕过+git提权

    这个靶机和DC-1一样,一共5个flag.全部拿到通关. root@kali:/home/kali# nmap -sP 192.168.1.* 先扫一下靶机的IP地址,拿到靶机的地址为192.168. ...

  7. 最全总结 | 聊聊 Python 数据处理全家桶(PgSQL篇)

    1. 前言 大家好,我是安果! Python 数据处理全家桶,截止到现在,一共写过 6 篇文章,有兴趣的小伙伴可以去了解一下! 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇) 最全 ...

  8. 保存Total Commander的列宽

    Total Commander的默认列宽经常显示不全内容,需要手工调整,用"Menu -> Configuration -> Save Position"可以永久保存列 ...

  9. linux虚拟机环境快速搭建redis5.x版本的主从集群总结

    文/朱季谦 我在阿里云服务器上曾参与过公司redis集群的搭建,但时间久了,都快忘记当时的搭建过程了,故而决定在虚拟机centOS 7的环境,自行搭建一套redis5.x版本的集群,该版本集群的搭建比 ...

  10. filter,interceptor,controllerAdvice,aspect,controller执行顺序

    1.filter,这是java的过滤器,和框架无关的,是所有过滤组件中最外层的,从粒度来说是最大的. 配置方式,有直接实现Filter+@component,@Bean+@configuration( ...