百度地图仅显示一个省并有多个标注点,自定义标注点

百度地图仅显示一个省并有多个标注点

今天拿到一个需求,要求做一个地图,只能显示当前省,并且标注多个点,标注点不能用它自带的红色的标记==;

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>

    <script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=DD279b2a90afdf0ae7a3796787a0742e ~~此处填写密钥~~ "></script>
    <script type="text/javascript" src="http://api.map.baidu.com/library/AreaRestriction/1.2/src/AreaRestriction_min.js"></script>

    <style type="text/css">
        html {
            height: 100%;
        }

        body {
            height: 100%;
            margin: 0px;
            padding: 0px;
        }

        #container {
            height: 100%;
        }
    </style>
</head>

<body>
<div id="container"></div>



<script type='text/javascript'>
    //提示:下面的代码用jquery,所以如果有不能运行的情况请引用后尝试
    //百度地图api container对应前端div名称 前端要引用2.0版本的百度地图api
    //需引用api.map.baidu.com/library/AreaRestriction/1.2/src/AreaRestriction_min.js
    var map = new BMap.Map("container", { enableMapClick: false }); // 创建地图实例,禁止点击地图底图
    //设置样式
    map.setMapStyle({
        styleJson: [
            {//不显示点信息
                "featureType": "poi",
                "elementType": "all",
                "stylers": {
                    "color": "#ffffff",
                    "visibility": "off"
                }
            }
        ]
    });

    // map.disableDragging();//禁止拖动
    // map.disableDoubleClickZoom();//禁止双击缩放
    map.enableScrollWheelZoom(true);
    var blist = [];
    var districtLoading = 0;

    function getBoundary() {
        addDistrict("广西");
    }

    /**
     * 添加行政区划
     * @param {} districtName 行政区划名
     * @returns  无返回值
     */
    function addDistrict(districtName) {
        //使用计数器来控制加载过程
        districtLoading++;
        var bdary = new BMap.Boundary();
        bdary.get(districtName, function (rs) {       //获取行政区域
            var count = rs.boundaries.length; //行政区域的点有多少个
            if (count === 0) {
                alert('未能获取当前输入行政区域');
                return;
            }
            for (var i = 0; i < count; i++) {
                blist.push({ points: rs.boundaries[i], name: districtName });
            };
            //加载完成区域点后计数器-1
            districtLoading--;
            if (districtLoading == 0) {
                //全加载完成后画端点
                drawBoundary();
            }
        });
    }

    var point = new BMap.Point(109.020648,23.312585);
    var arrDF = [
        109.020648,23.312585,"南宁洋桥",
        108.316709,22.764052,"南宁古辣",
        108.993439,22.975105,"南宁甘棠",
        108.850473,23.266358,"南宁宾州",
        108.758163,23.216363,"南宁新桥",
        
    ];
     //仅展示部分数据
    map.centerAndZoom(point, 15);
    // 编写自定义函数,创建标注
    function addMarker(point,zd){
        var greenIcon = new BMap.Icon('images/012.png',new BMap.Size(15,15));
        var marker = new BMap.Marker(point,{icon:greenIcon});
        map.addOverlay(marker);
        var label = new BMap.Label(zd,{offset:new BMap.Size(20,-10)});
        label.setStyle({
            color : "#000",
            fontSize : "12px",
            // height : "20px",
            // lineHeight : "20px",
            fontFamily:"微软雅黑",
        })
        marker.setLabel(label);
    }
    // addMarker(point);
    // 随机向地图添加25个标注
    var bounds = map.getBounds();
    var sw = bounds.getSouthWest();
    var ne = bounds.getNorthEast();
    var lngSpan = Math.abs(sw.lng - ne.lng);
    var latSpan = Math.abs(ne.lat - sw.lat);
    for (var i = 0; i < arrDF.length; i += 3) {
        var point = new BMap.Point(arrDF[i],arrDF[i+1]);
        addMarker(point,arrDF[i+2]);

    }

    /**
     * 各种鼠标事件绑定
     */
    function click(evt) {
        alert(evt.target.name);
    }

    function mouseover(evt) {
        evt.target.label.setZIndex(99);
        evt.target.label.setPosition(evt.point);
        evt.target.label.show();
    }

    function mousemove(evt) {
        evt.target.label.setPosition(evt.point);
    }

    function mouseout(evt) {
        evt.target.label.hide();
    }

    function drawBoundary() {
        //包含所有区域的点数组
        var pointArray = [];

        /*画遮蔽层的相关方法
        *思路: 首先在中国地图最外画一圈,圈住理论上所有的中国领土,然后再将每个闭合区域合并进来,并全部连到西北角。
        *      这样就做出了一个经过多次西北角的闭合多边形*/
        //定义中国东南西北端点,作为第一层
        var pNW = { lat: 59.0, lng: 73.0 }
        var pNE = { lat: 59.0, lng: 136.0 }
        var pSE = { lat: 3.0, lng: 136.0 }
        var pSW = { lat: 3.0, lng: 73.0 }
        //向数组中添加一次闭合多边形,并将西北角再加一次作为之后画闭合区域的起点
        var pArray = [];
        pArray.push(pNW);
        pArray.push(pSW);
        pArray.push(pSE);
        pArray.push(pNE);
        pArray.push(pNW);
        //循环添加各闭合区域
        for (var i = 0; i < blist.length; i++) {
            //添加显示用标签层
            var label = new BMap.Label(blist[i].name, { offset: new BMap.Size(20, -10) });
            label.hide();
            map.addOverlay(label);

            //添加多边形层并显示
            var ply = new BMap.Polygon(blist[i].points, { strokeWeight: 5, strokeColor: "#FF0000", fillOpacity: 0.01, fillColor: " #FFFFFF" }); //建立多边形覆盖物
            ply.name = blist[i].name;
            ply.label = label;
            ply.addEventListener("click", click);
            ply.addEventListener("mouseover", mouseover);
            ply.addEventListener("mouseout", mouseout);
            ply.addEventListener("mousemove", mousemove);
            map.addOverlay(ply);

            //添加名称标签层
            var centerlabel = new BMap.Label(blist[i].name, { offset: new BMap.Size(0, 0) });
            centerlabel.setPosition(ply.getBounds().getCenter());
            map.addOverlay(centerlabel);

            //将点增加到视野范围内
            var path = ply.getPath();
            pointArray = pointArray.concat(path);
            //将闭合区域加到遮蔽层上,每次添加完后要再加一次西北角作为下次添加的起点和最后一次的终点
            pArray = pArray.concat(path);
            pArray.push(pArray[0]);
        }

        //限定显示区域,需要引用api库
        var boundply = new BMap.Polygon(pointArray);
        BMapLib.AreaRestriction.setBounds(map, boundply.getBounds());
        map.setViewport(pointArray);    //调整视野

        //添加遮蔽层
        var plyall = new BMap.Polygon(pArray, { strokeOpacity: 0.0000001, strokeColor: "#000000", strokeWeight: 0.00001, fillColor: "#ffffff", fillOpacity: 0.9 }); //建立多边形覆盖物
        map.addOverlay(plyall);
    }

    setTimeout(function () {
        getBoundary();
    }, 100);
</script>
</body>

所展示出来的地图为
在这里插入图片描述

你可以使用 matplotlib 的 event handling 来实现曲线上击鼠标显示自定义标注的功能。具体步骤如下: 1. 导入必要的库和数据: ```python import numpy as np import matplotlib.pyplot as plt # 生成数据 x = np.linspace(0, 2*np.pi, 100) y1 = np.sin(x) y2 = np.cos(x) ``` 2. 创建一个 figure 和两个子图,并画出两条曲线: ```python # 创建 figure 和两个子图 fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True) # 在第一个子图上画出第一条曲线 ax1.plot(x, y1) ax1.set_ylabel('sin(x)') # 在第二个子图上画出第二条曲线 ax2.plot(x, y2) ax2.set_ylabel('cos(x)') ax2.set_xlabel('x') ``` 3. 定义一个函数 `on_click`,用于处理鼠标击事件。在该函数中,首先获取当前鼠标击的坐标,并将其转换为数据坐标。然后根据数据坐标找到最近的,并在该添加一个文本标注: ```python def on_click(event): if event.inaxes is not None: ax = event.inaxes x, y = event.xdata, event.ydata index = np.argmin(np.abs(x - xdata)) x_near, y_near = xdata[index], ydata[index] text = ax.text(x_near, y_near, f'({x_near:.2f}, {y_near:.2f})', fontsize=10, ha='center', va='bottom', color='red') fig.canvas.draw() ``` 在该函数中,`event.inaxes` 表示当前鼠标击的坐标所在的子图对象,如果为 `None` 则表示鼠标击位置不在任何一个子图对象上。`event.xdata` 和 `event.ydata` 分别表示鼠标击位置的横坐标和纵坐标,需要将其转换为数据坐标。在这里我们没有保存每个子图对应的数据集,而是使用了前面定义的 `x` 和 `y1, y2`,因此需要在函数中先将这些数据集取出来: ```python xdata, ydata = ax.lines[0].get_data() ``` 然后使用 `np.argmin` 找到最近的的下标,再根据下标取出该的坐标,最后在该添加一个文本标注。 4. 将 `on_click` 函数绑定到 figure 上的 `button_press_event` 事件: ```python cid = fig.canvas.mpl_connect('button_press_event', on_click) ``` 5. 运行程序并击曲线上的,可以看到在最近的添加一个文本标注。此时如果再击其他,则新的文本标注会覆盖之前的文本标注。如果要保留之前的文本标注,可以将每个文本标注的对象保存在一个列表中,再在 `on_click` 函数中先清除所有的文本标注,再重新添加新的文本标注: ```python # 在程序开始时定义一个空的列表 texts = [] # 修改 on_click 函数 def on_click(event): if event.inaxes is not None: ax = event.inaxes x, y = event.xdata, event.ydata index = np.argmin(np.abs(x - xdata)) x_near, y_near = xdata[index], ydata[index] # 先清除所有的文本标注 for text in texts: text.remove() texts.clear() # 添加新的文本标注 text = ax.text(x_near, y_near, f'({x_near:.2f}, {y_near:.2f})', fontsize=10, ha='center', va='bottom', color='red') texts.append(text) fig.canvas.draw() ``` 这样就可以在曲线上保留多个文本标注了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值