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

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. 忘记oracle的sys和system的密码

    step1:通过cmd打开命令提示符, sqlplus /nolog step2:输入conn /as sysdba step3:输入alter user system identified by 新 ...

  2. Verilog定点数计算

    https://blog.csdn.net/maxwell2ic/article/details/80620991 https://blog.csdn.net/mdpsdhr/article/deta ...

  3. C++调试总结

    一.参考: 本文主要参考<C++编程调试秘笈>一书. 在编写C++代码时,我们不应该自己捕捉缺陷,而是由编译器和可执行代码为我们做这些事情,该书便提供了这样的一个思考.作者以"调 ...

  4. Maven-内部多个项目依赖自动升级版本的部署

    需要自动升级版本的AAA项目发布 (有内部依赖时) 步骤比较复杂, 有一些需要根据实际情况调整. 考虑了以下几种可能性: 依赖模块的版本有更新 依赖模块版本没更新 依赖模块的版本号: 直接定义, 用属 ...

  5. Java8 Lambda表达式(一)

    目录 一.应用场景引入 优化一:使用策略模式 优化二:使用匿名内部类 优化三:使用Lambda表达式 优化四:使用Stream API 二.Lambda运算符和对应语法 语法格式 Lambda表达式需 ...

  6. DL基础补全计划(五)---数值稳定性及参数初始化(梯度消失、梯度爆炸)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  7. shell $? 状态码含义

    Linux 使用了$? 来保存上个执行的命令的退出状态码. 0                命令成功结束 1                通用未知错误 2                误用she ...

  8. 对HashMap的一次记录

    HashMap的具体学习,认识了解. 前言 也是最近开始面试才发现,HashMap是问的真多.以前听学长或自己在网上看到过一些面试资料都在说集合.线程这块比较重要,面试的重点.自己也是有那抵触情绪,所 ...

  9. Java基础——变量与常量及命名规范

    变量 ()  public class Demon04{     //类变量 static     static double salary=2500;     //属性: 变量 ​     //实例 ...

  10. 剖析虚幻渲染体系(10)- RHI

    目录 10.1 本篇概述 10.2 RHI基础 10.2.1 FRenderResource 10.2.2 FRHIResource 10.2.3 FRHICommand 10.2.4 FRHICom ...