zoukankan      html  css  js  c++  java
  • 百度地图显示行政区划/自定义覆盖物示例

    功能1:行政区划范围区域

    功能2:自定义覆盖物

    不说废话,直接上图

    <!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
        <style type="text/css">
            body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
        </style>
        <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=你自己的百度地图AK"></script>
        <title>添加行政区划</title>
        <style scoped>
    
    /* .cooperate{
       100%;
      height: 100%;
    } */
    
    .haeder_box{
      width: 100%;
      height: 47px;
      border-bottom: 1px solid #EEEEEE;
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 0px 15px;
      box-sizing: border-box;
      overflow: hidden;
    }
    
    .haeder_title{
      display: flex;
    
    }
    .haeder_title p{
      margin-left: 8px;
    }
    
    .content_box{
      width: 100%;
      height: 100%;
      /* background: #ccc; */
      padding: 10px;
      position: relative;
    }
    
    .bian{
        width: 100px;
        height: 30px;
        position: absolute;
        top: 15px;
        right: 15px;
    }
    .tableData{
        width: 420px;
        position: absolute;
        top: 50px;
        right: 15px;
    }
    
    /* .ivu-form{
        display: flex;
        flex-wrap: wrap;
    } */
    .ivu-form-item{
        margin-bottom: 5px;
    }
    
    .hidden_box{
        width: 100%;
        height: 40px;
    }
    #allmap{
        background: red;
        height: 600px;
    }
    
    .meteorological{
      height: 150px;
      margin-bottom: 10px;
      border: 1px solid #e8eaec;
    }
    </style>
    
    </head>
    <body>
        <div id="allmap"></div>
    </body>
    </html>
    
    <script type="text/javascript">
        
        var province="广东省";
        // 百度地图API功能
        var zoom=10;
        /**
        0: 表示查询省份数据,以地市纬度汇总
        1:表示查询地市数据,以区汇总
        2:表示查询区数据,以街道汇总
        3:表示查看街道,直接打点显示
        */
        var lastType=0;
        var mousePoint;
        var geocoder = new BMap.Geocoder();  //初始化,Geocoder类
        var map = new BMap.Map("allmap");
        map.centerAndZoom(province, zoom);
        map.enableScrollWheelZoom();
        var top_left_control = new BMap.ScaleControl({anchor: BMAP_ANCHOR_TOP_LEFT});// 左上角,添加比例尺
        var top_left_navigation = new BMap.NavigationControl();  //左上角,添加默认缩放平移控件
        map.addControl(top_left_control);        
        map.addControl(top_left_navigation);     
        
        
         /*注册事件*/
         /*
         if(document.addEventListener){
             document.addEventListener('DOMMouseScroll',scrollFunc,false);
         }
         window.onmousewheel=document.onmousewheel=scrollFunc;//IE/Opera/Chrome
         */
        map.addEventListener("zoomend",scrollFunc);
        
        map.addEventListener("mousemove",mousemoveFunc);
        
        function mousemoveFunc(e)
        {
            mousePoint=e.point;
        }
        
        function scrollFunc(e)
        {
            e=e || window.event;
    
            console.log(map.getZoom());
    
            var zoom = map.getZoom();
    
            var newType = getMapType(zoom);
            if(newType==lastType)
            {    
                console.log(e.target.getCenter());
                return;
            }
    
            lastType=newType;
            
            clearOverlays();
            
            
            
    
            if(mousePoint==null)
            {
                var center =e.target.getCenter();
                mousePoint = new BMap.Point(e.target.dc.lng, e.target.dc.lat);
            }
            
        
            geocoder.getLocation(mousePoint, function (rs) {   //getLocation函数用来解析地址信息,分别返回省市区街等
            
                var addComp = rs.addressComponents,
                province = addComp.province,//获取省份
                city = addComp.city,//获取城市
                district = addComp.district,//
                street = addComp.street,//
                streetNumber = addComp.streetNumber ;
                
                location_name = province + city + district + street + streetNumber;
                console.log(location_name)
                if(lastType==0)
                {
                    statisticsCity(province);//市汇总
                }
                else if(lastType==1)
                {
                    statisticsDistrict(province,city);//区汇总
                }
                /*else if(lastType==2)
                {
                    
                    loadPoint(province,city,district);//地图海量打点
                }*/
                
                
                return location_name;
            }); 
            
        }
    
        
        statisticsCity(province);
        
        function statisticsCity(province)
        {
            console.log("市汇总");
            //clearOverlays();
            //#TODO 异步加载数据
            var data = [
                {"id":"0cf21f99968711ea9a37005056360d90","province":"广东省","city":"佛山","total":2,"yellow":0,"red":1,"createdOn":null,"createdByUserName":null,"updatedOn":null,"updatedByUserName":null},
                {"id":"0cf32f61968711ea9a37005056360d90","province":"广东省","city":"中山","total":1,"yellow":0,"red":0,"createdOn":null,"createdByUserName":null,"updatedOn":null,"updatedByUserName":null},
                {"id":"0cf3c8a1968711ea9a37005056360d90","province":"广东省","city":"广州","total":3,"yellow":1,"red":1,"createdOn":null,"createdByUserName":null,"updatedOn":null,"updatedByUserName":null}
            ];
            
            for(var i=0;i<data.length;i++)
            {
                var item=data[i];
                var province = item.province;
                var city = item.city;
                setRegion(item,lastType);
                setComplexCustomOverlay(province,city,null,null,lastType,item);
             }
        }
        
        function statisticsDistrict(province,city)
        {
            console.log("区汇总");
            //clearOverlays();
            //#TODO 异步加载数据
            var data = [
            {
              "id": "2e79c1369f2011ea9a37005056360d90",
              "province": "广东省",
              "city": "广州市",
              "district": "天河区",
              "total": 1,
              "green": 1,
              "yellow": 0,
              "red": 0,
              "createdOn": "2020-05-26T20:11:55.000+0000",
              "createdByUserName": "HUJUNMIN",
              "updatedOn": "2020-05-26T20:11:55.000+0000",
              "updatedByUserName": "HUJUNMIN"
            },
            {
              "id": "b838c71f9f1f11ea9a37005056360d90",
              "province": "广东省",
              "city": "广州市",
              "district": "越秀区",
              "total": 1,
              "green": 1,
              "yellow": 0,
              "red": 0,
              "createdOn": "2020-05-26T20:08:37.000+0000",
              "createdByUserName": "HUJUNMIN",
              "updatedOn": "2020-05-26T20:08:37.000+0000",
              "updatedByUserName": "HUJUNMIN"
            }
          ];
            
            for(var i=0;i<data.length;i++)
            {
                var item=data[i];
                var province = item.province;
                var city = item.city;
                var district = item.district;
                
                setRegion(item,lastType);
                setComplexCustomOverlay(province,city,district,null,lastType,item);
             }
        }
        
        
        
        function loadPoint(province,city,district,street)
        {
            console.log("地图打点");
            //clearOverlays();
            //#TODO 异步加载数据
            var data ={
            "normal": [],
            "yellow": [
              {
                "id": "5dfbe9bc964e11ea9a37005056360d90",
                "historyLocationId": null,
                "equipmentId": "35331a5395ac11ea9a37005056360d90",
                "no": "bd-gz-001",
                "longitude": 113.271393,
                "latitude": 23.136333,
                "province": null,
                "city": null,
                "address": "广州市政府1塔",
                "monitorOn": "2020-05-14T08:17:01.000+0000",
                "level": "YELLOW",
                "createdOn": null,
                "createdByUserName": null,
                "updatedOn": null,
                "updatedByUserName": null
              }
            ],
            "red": []
          };
          
            addOverlays(data.normal,"#008000")
            addOverlays(data.yellow,"#ffff00")
            addOverlays(data.red,"#ff0000")
        }
        
        function addOverlays(data,color)
        {
            if(data==null || data.length==0)
            {
                return;
            }
    
            if (document.createElement('canvas').getContext) {  // 判断当前浏览器是否支持绘制海量点
                var points = [];  // 添加海量点数据
                for (var i = 0; i < data.length; i++) {
                 var point = new BMap.Point(data[i].longitude, data[i].latitude);
                 point.mydata = data[i];
                  points.push(point);
                }
                var options = {
                    size: BMAP_POINT_SIZE_HUGE,
                    shape: BMAP_POINT_SHAPE_RHOMBUS,
                    color: color
                }
                var pointCollection = new BMap.PointCollection(points, options);  // 初始化PointCollection
                
                pointCollection.addEventListener('click', function (e) {
                      //alert('单击点的坐标为:' + e.point.lng + ',' + e.point.lat);  // 监听点击事件
                      var opts = {
                      width : 200,     // 信息窗口宽度
                      height: 170,     // 信息窗口高度
                      title : "<b>站点信息</b>" , // 信息窗口标题
                      enableMessage:true,//设置允许信息窗发送短息
                      message:""
                    }
                    var item =e.point.mydata;
                    var message ="编号: <b>"+item.no+"</b><br/>地址: "+item.address+"<br/>经度: "+item.longitude+"<br/>纬度: "+item.latitude+"<br/>级别: "+item.level+"<br/>时间: "+item.monitorOn+"<br/>";
                    var infoWindow = new BMap.InfoWindow(message, opts);  // 创建信息窗口对象 
                
                    map.openInfoWindow(infoWindow,point); //开启信息窗口
                });
                map.addOverlay(pointCollection);  // 添加Overlay
            } else {
                alert('请在chrome、safari、IE8+以上浏览器查看本示例');
            }
        }
        
        function clearOverlays(){
            map.clearOverlays();
        }
        
        
        // 复杂的自定义覆盖物
        function ComplexCustomOverlay(point, data,mapType) {
            this._point = point;
            this._data = data;        
            this._mapType=mapType;
        }
        ComplexCustomOverlay.prototype = new BMap.Overlay();
        ComplexCustomOverlay.prototype.initialize = function (map) {
            this._map = map;
            var div = this._div = document.createElement("div");
            div.style.position = "absolute";
            div.style.zIndex = BMap.Overlay.getZIndex(this._point.lat);
            div.style.backgroundColor = "#059c49";
            // div.style.border = "1px solid #EF1B1C";
            div.style.borderRadius = "50%";
            div.style.display = "flex";
            div.style.flexDirection = "column";
            div.style.justifyContent = "center";
            div.style.alignItems = "center";
            div.style.color = "#FFFFFF";
            div.style.height = "65px";
            div.style.width = "65px";
            div.style.padding = "2px";
            div.style.whiteSpace = "nowrap";
            div.style.MozUserSelect = "none";
            div.style.fontSize = "12px";
            div.style.opacity = ".9";
            
        
            
            
            var region =getRegion(this._mapType,this._data);
            
            div.setAttribute("region", region);
    
            var pTitle = document.createElement("p");
            var spanTitle = document.createElement("span");
            spanTitle.setAttribute("name", "title")
            spanTitle.appendChild(document.createTextNode(region));
            pTitle.appendChild(spanTitle);
            div.appendChild(pTitle);
    
            var pNumber = document.createElement("p");
            var spanpNumber = document.createElement("span");
            spanpNumber.setAttribute("name", "number")
            spanpNumber.appendChild(document.createTextNode(this._data.total));
            pNumber.appendChild(spanpNumber);
            div.appendChild(pNumber);
    
            var that = this;
    
            div.onmouseover = function () {
                // this.style.borderColor = "#EF1B1C";
                this.style.backgroundColor = "#EF1B1C";
                this.style.color = "#FFFFFF";
                this.style.opacity = ".9";
                this.style.zIndex = 99999
    
                var overlays = map.getOverlays();
                for (var i = 0; i < overlays.length; i++) {
                    var item = overlays[i];
                    if ((item instanceof ComplexCustomOverlay) == false) {
                        if (item.region == getRegion(that._mapType,that._data))
                            item.show();
                        else
                            item.hide()
                    }
                }
            }
    
            div.onmouseout = function () {
                this.style.backgroundColor = "#059c49";
                this.style.color = "#ffffff";
                this.style.opacity = ".9";
                // this.style.borderColor = "#059c49";
                this.style.zIndex = 9999      
    
                var overlays = map.getOverlays();
                for (var i = 0; i < overlays.length; i++) {
                    var item = overlays[i];
                    if ((item instanceof ComplexCustomOverlay) == false) {
                        item.hide()
                    }
                }
            }
    
            div.onclick = function () {
                var region = that._data.province+" "+that._data.city;
                if(that._data.district != null && that._data.district  != "")
                    region = region+" "+that._data.district;
                if(that._data.street != null && that._data.street != "")
                    region = region+" "+that._data.street;
                //alert(region);
            }
    
            map.getPanes().labelPane.appendChild(div);
    
            return div;
        }
        ComplexCustomOverlay.prototype.draw = function () {
            var map = this._map;
            var pixel = map.pointToOverlayPixel(this._point);
            //alert(this._div.style.width)
            this._div.style.left = pixel.x  -33 + "px";
            this._div.style.top = pixel.y  -33 + "px";
        }
        
        function getRegion (mapType,data){
                var region = "";
                if(mapType==0)
                {
                    region=data.city;
                }
                else if(mapType==1)
                {
                    region=data.district;
                }
                else if(mapType==2)
                {
                    region=data.street;
                    if(region==null || region=="")
                    {
                        region=data.district;
                    }
                }
                return region;
            }
            
            function getAddress (mapType,data){
                var address = "";
                if(mapType==0)
                {
                    address=data.province + data.city;
                }
                else if(mapType==1)
                {
                    address=data.province + data.city +data.district;
                }
                else if(mapType==2)
                {
                    address=data.province + data.city +data.district;
                    if(data.street!=null && data.street!="")
                    {
                        address+=data.street;
                    }
                }
                return address;
            }
            
        /*
        根据地址获取中心店坐标
        */
        function setComplexCustomOverlay(province,city,district,street,lastType,item) 
        {
            
            var address = null;
            /*
            0: 表示查询省份数据,以地市纬度汇总
            1:表示查询地市数据,以区汇总
            2:表示查询区数据,以街道汇总
            3:表示查看街道,直接打点显示
            */
            if(lastType==0)
            {
                address=province+city;
            }
            else if(lastType==1)
            {
                if(district==null || district=="")
                {
                    district = street;
                }
                address=province+city+district;
            }
            else if(lastType==2)
            {
                address=province+city+district+street;
            }
            else
            {
                console.log("setComplexCustomOverlay 不正确的lastType:"+lastType );
            }
            
            // 创建地址解析器实例
            var myGeo = new BMap.Geocoder();
            // 将地址解析结果显示在地图上,并调整地图视野
            myGeo.getPoint(address, function(point){
                if (point) {
                        var compOverlay = new ComplexCustomOverlay(point,item,lastType);
                        map.addOverlay(compOverlay);
                        
                        //map.setCenter(point);
                }else{
                    console.log("setComplexCustomOverlay 地址:"+address+" 没有解析到结果!");
                }
            }, province);
        }
        
        function setRegion(item,lastType) {
        
            var region = getRegion(lastType,item);
            var address =getAddress(lastType,item);
            var bdary = new BMap.Boundary();
            bdary.get(address, rs => {
                var count = rs.boundaries.length;
                for (let i = 0; i < count; i++) {
                    var ply = new BMap.Polygon(rs.boundaries[i], {
                        strokeWeight: 2, strokeColor: '#ff0000'
                    });
                    ply.region = region;
                    ply.hide();
                    this.map.addOverlay(ply);
                }
            });
        }
        
        /**
        0: 表示查询省份数据,以地市纬度汇总
        1:表示查询地市数据,以区汇总
        2:表示查询区数据,以街道汇总
        3:表示查看街道,直接打点显示
        */
        function getMapType(zoom)
        {
            if(zoom<=10)
            {
                return 0;
            }
            else if(zoom<=12)
            {
                return 1;
            }
            else
            {    
                return 2;
            }
        }
        
    </script>
  • 相关阅读:
    页面调用百度地图但是使用了https证书之后不显示
    JAVA查询类别(菜单)下的所有子类别(递归)
    summernote富文本的简单使用
    thymeleaf标签在js中调用转义变量与不转义变量写法
    SpringBoot使用@Async实现异步调用
    JAVA使用多线程进行数据处理
    MapReduce-TextInputFormat 切片机制
    BootstrapTable 导出数据
    BootstrapTable 加载数据
    CDN 常用静态资源公共库
  • 原文地址:https://www.cnblogs.com/hujunmin/p/12918292.html
Copyright © 2011-2022 走看看