百度地图 ( 二 ) 添加覆盖物

3.增加覆盖物

有如下几种覆盖物:

  • Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法。
  • Marker:标注表示地图上的点,可自定义标注的图标。
  • Label:表示地图上的文本标注,您可以自定义标注的文本内容。
  • Polyline:表示地图上的折线。
  • Polygon:表示地图上的多边形。多边形类似于闭合的折线,另外您也可以为其添加填充颜色。
  • Circle : 表示地图上的圆。
  • InfoWindow:信息窗口也是一种特殊的覆盖物,它可以展示更为丰富的文字和多媒体信息。注意:同一时刻只能有一个信息窗口在地图上打开。

可以使用map.addOverlay方法向地图添加覆盖物,使用map.removeOverlay方法移除覆盖物,注意此方法不适用于InfoWindow。

3.1.添加标注 Marker

显示多个标注点, 自定义icon

var spList = [
    {
        spLongitude:116.26165756693067,
        spLatitude:40.038813377487905,
        spName:"图标A",
        spId:"tagA"
    },
    {
        spLongitude:116.10819372972905,
        spLatitude:40.00842014047728,
        spName:"图标B",
        spId:"tagB"
    }
]

$(function () {
    map = new BMap.Map("allmap");

    var point = new BMap.Point(116.449562,39.926373);
    map.centerAndZoom(point, 12);


    map.enableScrollWheelZoom();    //启用滚轮放大缩小,默认禁用
    map.enableContinuousZoom();    //启用地图惯性拖拽,默认禁用
    map.addControl(new BMap.NavigationControl());  //添加默认缩放平移控件
    map.addControl(new BMap.ScaleControl());          //比例尺
    map.addControl(new BMap.OverviewMapControl()); //添加默认缩略地图控件
    map.addControl(new BMap.OverviewMapControl({isOpen: true, anchor: BMAP_ANCHOR_BOTTOM_RIGHT}));   //右下角,打开缩略地图
    // map.addControl(new BMap.MapTypeControl());        //地图类型 三维方式 有错误


    // 增加标记点
    for (var i = 0; i < spList.length; i++) {
        var lng = spList[i].spLongitude;
        var lat = spList[i].spLatitude;
        var myIcon = new BMap.Icon("http://api.map.baidu.com/img/markers.png"  //标注图片
                     	, new BMap.Size(23, 25)  // 图片大小
                        , { offset: new BMap.Size(10, 30), imageOffset: new BMap.Size(0,0-i*25)});   //偏移
        // 创建标注,为要查询的地方对应的经纬度
        var marker = new BMap.Marker(new BMap.Point(lng, lat)
                                     , { title: spList[i].spName, icon: myIcon });
        //点可拖拽
        marker.enableDragging();
        // 标注 跳动
        marker.setAnimation(BMAP_ANIMATION_BOUNCE);
        map.addOverlay(marker);

        (function () {
            var shop = spList[i];
            marker.addEventListener("dragend", function () {
                //拖拽释放事件
                updatePosition(this, shop);
            });
            marker.addEventListener("click", function () {
                // 点击事件
                updateShop(shop);
            });
        })();
    }
})


//拖拽释放事件
function updatePosition(marker, shop) {
    alert(shop.spId)
    alert(marker.getPosition().lng)
    alert(marker.getPosition().lat)

}

//更新商铺信息
function updateShop(shop) {
    alert(shop.spId)
}

3.2.圆形Circle

添加 圆形覆盖物 , point 是圆心的坐标 , 5000 是半径

// 创建圆形覆盖物
var circle = new BMap.Circle(point, 5000, {
    strokeColor: "blue",
    strokeWeight: 2,
    strokeOpacity: 0.5
}); //创建圆
map.addOverlay(circle);

3.2.1.在查询到的点上添加圆形覆盖物

先在html中添加 半径输入框

范围:<input type="number" name="signonRadio" value="300">

添加后如下:

地名:<input type="text" name="modalAddr">
范围:<input type="number" name="signonRadio" value="300">
<input type="button" value="查询"  onclick="searchByStationName()">
经度:<input name="acLng" type="text">
纬度:<input name="acLat" type="text">
    <div id="allmap"></div> <!--地图div-->

在查询代码中创建圆形覆盖物, 代码如下 :

// 得到圆形覆盖物半径
var radio = $("input[name='signonRadio']").val();
// 创建圆形覆盖物
var circle = new BMap.Circle(new BMap.Point(poi.point.lng, poi.point.lat), radio, {
    strokeColor: "blue",
    strokeWeight: 2,
    strokeOpacity: 0.5
}); 

// 标注 绑定拖拽事件
marker.addEventListener("dragging", function (msg) {
    //设置圆形覆盖物圆心 随标注拖拽而与标注同时移动
    circle.setCenter(msg.point);
    $("input[name='acLng']").val(msg.point.lng);
    $("input[name='acLat']").val(msg.point.lat);
});
// 显示 覆盖物
map.addOverlay(marker);
// 显示 圆形 覆盖物
map.addOverlay(circle);

3.3.地区范围

按坐标点作为顶点生成任意形状的覆盖物

// 定义 范围的经纬度
 var range = "116.449562,39.926373; 116.409562,40.026373; 116.549562,40.076373; 116.699562,40.026373;  116.649562,39.926373;"
 // 创建 自定义覆盖物
 var polygon = new BMap.Polygon(range, {
     strokeWeight: 2,
     strokeColor: "#ff0000",
     strokeOpacity:0,
     fillColor:"#fff",
     fillOpacity:"0.8"
 });
// 显示 自定义覆盖物
map.addOverlay(polygon);

3.3.1.根据地址生成反向覆盖物

将北京市以外的地区覆盖上半透明效果


$(function () {
    map = new BMap.Map("allmap");

    // var point = new BMap.Point(116.449562,39.926373);
    map.centerAndZoom("北京市", 12);


    map.enableScrollWheelZoom();    //启用滚轮放大缩小,默认禁用
    map.enableContinuousZoom();    //启用地图惯性拖拽,默认禁用
    map.addControl(new BMap.NavigationControl());  //添加默认缩放平移控件
    map.addControl(new BMap.ScaleControl());          //比例尺
    map.addControl(new BMap.OverviewMapControl()); //添加默认缩略地图控件
    map.addControl(new BMap.OverviewMapControl({isOpen: true, anchor: BMAP_ANCHOR_BOTTOM_RIGHT}));   //右下角,打开缩略地图
    map.addControl(new BMap.MapTypeControl());        //地图类型 三维方式 有错误

    // 调用生成 遮罩的函数
    rangeMap("北京市");

})

    
function rangeMap( area ) {

    var bdary = new BMap.Boundary();  // 边界
    bdary.get(area, function(rs){        //获取行政区域
        console.log( "rs:", rs )
        map.clearOverlays();                 //清除地图覆盖物
        var count = rs.boundaries.length;    //行政区域的点有多少个
        console.log( "count:", count)
        if (count === 0) {
            alert('未能获取当前输入行政区域');
            return ;
        }

        var strs = new Array();
        strs = rs.boundaries[0].split(";");//!!!!这里只适用于rs.boundaries.length=1的省市(如北京等)
        var ENWS = "";
        for (var i=0;i<strs.length;i++) {
            ENWS += strs[i] + ";"
        }

        // 自定义[外围]边框点的集合
        var EN_JW = "180, 90;";//东北角
        var NW_JW = "-180,  90;";//西北角
        var WS_JW = "-180, -90;";//西南角
        var SE_JW = "180, -90;";//东南角

        // 添加遮罩层
        var ply1 = new BMap.Polygon(ENWS + SE_JW + SE_JW + WS_JW + NW_JW + EN_JW + SE_JW, {
            strokeColor:"none",strokeOpacity:0,fillColor:"#fff",fillOpacity:"0.8"
        }); //建立多边形覆盖物
        
        map.addOverlay(ply1);//遮罩物是半透明的,如果需要纯色可以多添加几层

        // 选中区域的边框
        var pointArray = [];
        for (var i = 0; i < count; i++) {
            var ply = new BMap.Polygon(rs.boundaries[i], {strokeWeight: 2, strokeColor: "#ff0000",fillColor:""}); //建立多边形覆盖物
            map.addOverlay(ply);  //添加覆盖物
            pointArray = pointArray.concat(ply.getPath());
        }

        map.setViewport(pointArray);    //调整视野
    });
    console.log("bdary: ",bdary)

}

百度地图添加复杂覆盖物的步骤包括以下几个部分: 1. 引入百度地图 JavaScript API,并在 Vue 组件中加载地图。 2. 定义复杂覆盖物的构造函数,包括需要的参数和方法。 3. 在 Vue 组件中创建复杂覆盖物对象,并添加到地图中。 下面是一个简单的示例代码,可以帮助您理解如何在 Vue 中添加复杂覆盖物: ``` <template> <div class="map-container"> <div class="map" ref="map"></div> </div> </template> <script> export default { name: 'MapContainer', data() { return { map: null, complexOverlay: null }; }, mounted() { // 加载地图 this.initMap(); }, methods: { initMap() { this.map = new BMap.Map(this.$refs.map); this.map.centerAndZoom(new BMap.Point(116.404, 39.915), 11); // 创建复杂覆盖物 this.createComplexOverlay(); // 添加复杂覆盖物到地图中 this.map.addOverlay(this.complexOverlay); }, createComplexOverlay() { function ComplexOverlay(point, text) { this._point = point; this._text = text; } ComplexOverlay.prototype = new BMap.Overlay(); ComplexOverlay.prototype.initialize = function(map) { this._map = map; var div = document.createElement('div'); div.style.position = 'absolute'; div.style.zIndex = BMap.Overlay.getZIndex(this._point.lat); div.style.backgroundColor = 'red'; div.style.color = 'white'; div.style.padding = '5px'; div.style.borderRadius = '5px'; div.innerText = this._text; map.getPanes().labelPane.appendChild(div); this._div = div; return div; }; ComplexOverlay.prototype.draw = function() { var pixel = this._map.pointToOverlayPixel(this._point); this._div.style.left = pixel.x + 'px'; this._div.style.top = pixel.y + 'px'; }; var point = new BMap.Point(116.404, 39.915); var text = '这是一个复杂的覆盖物'; this.complexOverlay = new ComplexOverlay(point, text); } } }; </script> <style scoped> .map-container { width: 100%; height: 100vh; } .map { width: 100%; height: 100%; } </style> ``` 在这个示例代码中,我们首先在 Vue 组件中加载了百度地图,并创建了一个 `MapContainer` 组件。在 `initMap()` 方法中,我们创建了一个复杂覆盖物对象,并在地图中添加了这个覆盖物。 复杂覆盖物是通过定义一个构造函数来创建的,并继承了 `BMap.Overlay` 类的原型。这个构造函数包括一个表示位置的坐标点和一个文本字符串。在 `initialize()` 方法中,我们创建了一个 DOM 元素,并设置了样式和文本内容。然后,我们将这个 DOM 元素添加到地图的 `labelPane` 图层上,最后将这个 DOM 元素返回,以便在地图上显示。在 `draw()` 方法中,我们更新了 DOM 元素的位置,以确保它始终位于正确的位置。 这只是一个简单的示例,您可以根据您的需求来定义更复杂的覆盖物,并实现更多的方法和属性。希望这能帮到您。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值