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

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. jvm源码解读--08 创建oop对象,将static静态变量放置在oop的96 offset处

    之前分析的已经加载的.Class文件中都没有Static 静态变量,所以也就没这部分的解析,自己也是不懂hotspot 将静态变量放哪里去了,追踪源码之后,看清楚了整个套路,总体上来说,可以举例来说对 ...

  2. Vue项目发布的问题--http://localhost:8088/static/fonts/fontawesome-webfont.af7ae50.woff2

    问题:ngnix将8080转成80对外访问,找不对woff2等文件 一\ 搭建环境 ngnix-->conf中 server { listen 80; server_name 10.9.240. ...

  3. 【阅读笔记】Java核心技术卷一 #6.Chapter8

    8 泛型程序设计 8.1 为什么要使用泛型程序设计 类型参数(type parameters)(E.T.S...) 通配符类型(wildcard type)(?) 注意这两者用法用处并不同. 8.2 ...

  4. [ZJOI2010]基站选址,线段树优化DP

    G. base 基站选址 内存限制:128 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较   题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离 ...

  5. 字节跳动五面都过了,结果被刷了,问了hr原因竟说是...

    说在前面,面试时最好不要虚报工资.本来字节跳动是很想去的,几轮面试也通过了,最后没offer,自己只想到几个原因:1.虚报工资,比实际高30%:2.有更好的人选,这个可能性不大,我看还在招聘.我是面试 ...

  6. 微信小程序测试点

    一.测试范围 1.权限测试 需要检查以下几种情况下微信用户访问的权限 1)未授权微信登录小程序 未授权时,一般使用一些业务功能的时候,都会弹出提醒:先授权再操作对应功能.or在提交数据到后台的时候,会 ...

  7. Redis是不是真的变慢了?

    大家好,今天我们来学习一下如何确定Redis是不是真的变慢了. 我们在使用redis时一定会遇到变慢的时候,那我们如何来判断Redis是否真的变慢了呢, 一个最直接的方法就是查看Redis的响应延迟, ...

  8. Shell-07-文本处理grep

    文本处理sed sed:流编辑器,过滤和替换文本 工作原理:sed命令将当前处理的行读入模式空间进行处理,处理完把结果输出,并且清空模式空间. 然后再将下一行读入模式空间进行处理输出,以此类推,直到最 ...

  9. IP笔记

    自动专用IP地址APIPA的范围是B类地址块169.254.0.0--169.254.255.255

  10. 使用Java8改造出来的模板方法真的是yyds

    GitHub 21.3k Star 的Java工程师成神之路,不来了解一下吗! GitHub 21.3k Star 的Java工程师成神之路,真的不来了解一下吗! 我们在日常开发中,经常会遇到类似的场 ...