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

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调优实战+代码优化

    类加载机制 Java源代码经过编译器编译成字节码之后,最终都需要加载到虚拟机之后才能运行.虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直 ...

  2. Linux[Manjaro] 小新15笔记本AMD ryzen锐龙4800U,在安装系统后出现的随即死机冻屏问题

    Linux[Manjaro] 小新15AMD ryzen锐龙4800U,在安装系统后出现的随即死机冻屏问题解决办法 年初尝试将manjaro安装在我的笔记本上就存在这个问题,也一度将我劝退.系统安装在 ...

  3. upload-lab 靶场实战

    文件上传/下载 漏洞 冲冲冲,好好学习 2020.02.13 淦靶场之前,先来点知识铺垫铺垫. 文件上传漏洞 前端Js绕过. MIME类型绕过 后缀名大写写绕过 / php4 .php5 00截断 覆 ...

  4. C# Get和Post请求接口类

    public class HttpHelper {/// <summary> /// Get请求 /// </summary> /// <param name=" ...

  5. 自学linux——2.认识目录及常用指(命)令

    认识目录及常用指(命)令 1.备份: 快照(还原精灵):短期备份  频繁备份  可关可开.可能会影响系统的操作. 备份时:虚拟机--快照 还原时:虚拟机--快照--快照管理器--相应位置--转到 克隆 ...

  6. 【NLP学习其四】如何构建自己用于训练的数据集?什么是词性标注?

    数据集与词性标注 数据集是NLP中的重要一环. 但是提到数据集,很多人的第一个想法可能是:"这玩意从网上下载就好了,不用管". 真的不用管?最开始我也是这么认为的 于是我直奔CoN ...

  7. 利用MySQL原数据信息批量转换指定库数据表生成Hive建表语句

    1.写出文件工具类 package ccc.utile; import java.io.*; /** * @author ccc * @version 1.0.0 * @ClassName Write ...

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

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

  9. 工资8000以下的Android程序员注意了!接下来要准备面对残酷现实了……

    最近在知乎看到一个测试,特扎心: 以下三种情况,哪个最让你绝望? ❶ 每月工资去掉开销还存不到3千: ❷ 家人突然急病住院,医药费10万: ❸ 同班的家长都在争先恐后给孩子报名各种辅导班.兴趣班,但一 ...

  10. UserControl 加载动画

    效果:实现加载UserControl动画效果 cs代码如下 public class BaseModuleView : UserControl { private TranslateTransform ...