在vue项目中使用百度地图,并添加覆盖物,多个点标注

本文介绍如何在Vue项目中集成百度地图并实现街道级地图边界展示。通过自定义点标注和街道覆盖物,实现了详细的地图功能。文章提供了具体实现步骤及代码示例。

在vue项目中使用百度地图,并添加覆盖物,多个点标注

介绍

众所周知百度地图只有区级边界覆盖物数据,因为项目需要街道级的地图边界展示,所以需要自己引入街道数据。如果刚好需要宁波市镇海区的几个街道数据可以看我主页有上传。
以下是效果图
效果图

引入

在index.html中直接引入

<script type="text/javascript"
    src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=你的密钥"></script>

在main.js 中将百度组件注入到Vue的原型里

Vue.prototype.BMapGL = window.BMapGL

正文

//街道JSON数据=格式[{"lng": 121.62442102480463, "lat": 30.014421231162792},{...}]
import Jd_zs from '../assets/json/ZhuangShi.json'
import Jd_gs from '../assets/json/GuiSi.json'
import addicon1 from '../assets/img/add.svg'//自定义点标注的图片

data() {
    return {
      staticLocation: [121.60304, 29.970944],
      JieDaoJson: [//覆盖物数据
        {
          name: '庄市街道',//名字
          site: [121.633417, 29.941699],//坐标中心点
          value: Jd_zs,//街道对应json数据
          opacity: 0.7,//对应覆盖物透明度
        },
        {
          name: '贵驷街道',
          site: [121.624393, 29.985423],
          value: Jd_gs,
          opacity: 0.5,
        },
        //此处省略其他街道数据
      ],
    }
},
mounted() {
    this.initBmap()//初始化地图
    this.initPoint()//批量创建点
    this.funStreet()//批量创建覆盖物
},

methods: {
	//初始化地图
	initBmap() {
	      const that = this
	      const pt = this.staticLocation
	      this.map = new this.BMapGL.Map('allmap')
	      this.map.centerAndZoom(new this.BMapGL.Point(pt[0], pt[1]), 10)
	      this.map.enableScrollWheelZoom(true)
	},
	//批量创建点
	initPoint() {
      const that = this
      this.pointArr.forEach(function (v) {
        createPoint(that, v, addicon1)
      })

      //创建点
      function createPoint(that, data, addicon) {
        // 创建图标
        var myIcon = new that.BMapGL.Icon(addicon, new that.BMapGL.Size(32, 32))
        // 创建Marker标注,使用图标
        var pt = new that.BMapGL.Point(data.site[0], data.site[1])
        that.marker = new that.BMapGL.Marker(pt, {
          icon: myIcon,
        })

        // 设置标签 内容 偏移量
        const label = new that.BMapGL.Label(data.title, {
          offset: new that.BMapGL.Size(10, -10),
        })
        // 标签样式
        label.setStyle({
          border: 'none',
          borderRadius: '3px',
          background: 'rgba(33, 224, 255,0.6)',
          transform: 'translate(0%,0)',
          fontSize: '14px',
          padding: '0 3px',
          color: '#fff',
        })
        // 设置标签
        that.marker.setLabel(label)
        // 将标注添加到地图
        that.map.addOverlay(that.marker)
      }
    },
    // 添加街道覆盖物
    funStreet() {
      const that = this
      this.JieDaoJson.forEach((v) => {
        // 层
        let Str = []
        v.value.forEach((k) => {
          Str.push(new this.BMapGL.Point(k.lng, k.lat))
        })
        var myPolygon = new this.BMapGL.Polygon(Str, {
          fillColor: '#428ffc',
          fillOpacity: v.opacity,
          trokeColor: '#fff',
        })
        myPolygon.disableMassClear()//禁止被清楚
        // 字
        var textLabel = new this.BMapGL.Label(v.name, {
          offset: new this.BMapGL.Size(-30, 0),
          position: new this.BMapGL.Point(v.site[0], v.site[1]),
          enableMassClear: false,//禁止被清楚
        })
        textLabel.setStyle({
          color: '#fff',
          background: 'rgba(0,0,0,0.2)',
          border: 'none',
          padding: '3px 5px',
          borderRadius: '3px',
          fontSize: '22px',
        })
        this.ls4 = setTimeout(() => {
          that.map.addOverlay(myPolygon)
          that.map.addOverlay(textLabel)
        }, 100)
      })
    },
}
<think>好的,我现在需要帮助用户解决在百度地图上批量标注多个生成自定义地图的问题。首先,用户的问题是如何使用百度地图API来实现这一点。我需要参考用户提供的引用内容,看看有没有相关的代码示例或者步骤说明。 首先,用户给出的引用1提到在Vue项目中引入百度地图JS,展示多个点位用marker标注,同时设置中心区域。引用2中的代码示例展示了如何循环创建多个标注点,使用T.Marker类,将它们添加到地图上。引用3则详细说明了如何绘制单个覆盖物,包括创建点、设置标签样式,以及如何将标签添加到地图。引用4讨论了在Vue使用闭包来为每个标注点添加点击事件,避免事件被覆盖的问题。引用5提到了使用MarkerClusterer来处理大量标注的渲染和信息框显示。 综合这些信息,我应该按照以下步骤来回答用户的问题: 1. **初始化地图**:引用1和2都提到了需要引入百度地图JS库,初始化地图对象,设置中心点和缩放级别。这是基础步骤,必须包括。 2. **批量创建标注点**:用户需要批量标注多个点,所以需要循环遍历坐标数组,为每个坐标创建Marker对象,添加到地图上。引用2和3中的代码示例展示了如何循环创建标注,引用3还提到了如何自定义标签内容,这可能对用户有用。 3. **自定义标注样式**:引用3详细说明了如何通过设置Label的样式来自定义标注的外观,比如使用HTML内容、调整偏移量等。用户可能需要自定义标签显示的信息,比如名称、数量等,这部分需要详细说明。 4. **设置地图显示区域**:用户希望根据标注点自动调整地图的显示区域,确保所有点都能显示出来。引用1提到了这一点,可以通过计算所有点的范围,然后使用setViewport方法调整地图视图。 5. **性能优化(可选)**:如果用户需要处理大量标注点,引用5提到的MarkerClusterer可以用来聚合标注,提升性能。虽然用户当前可能不需要,但作为优化建议提供会更好。 6. **事件处理**:引用4中的闭包方法可以避免循环中添加事件时的覆盖问题,用户可能需要为每个标注点添加点击事件,这部分需要包含在回答中。 接下来,我需要将这些步骤组织成一个清晰的流程,结合代码示例,确保每个部分都参考了用户提供的引用内容。同时,要使用中文回答,按照系统级指令中的格式要求,正确使用$...$和$$...$$,不过在这个问题中可能数学公式较少,但需要注意代码块的格式。 可能的问题点是确保代码示例正确无误,且适配用户的环境,比如Vue项目。引用1和4都提到了Vue中的注意事项,比如闭包处理事件,需要在代码中体现出来。此外,标注点的坐标转换可能需要根据用户使用的地图类型进行调整,这一点在引用1的说明中有提到,需要提醒用户注意。 最后,生成相关问题,帮助用户进一步了解相关主题,比如性能优化、事件交互、样式自定义等,这些问题应基于回答内容中的关键点提出。</think>### 百度地图批量标注多点的实现方法 以下是使用百度地图API批量标注多个生成自定义地图的步骤,结合Vue框架和性能优化建议: --- #### **1. 初始化地图** ```html <!-- 引入百度地图API --> <script type="text/javascript" src="//api.map.baidu.com/api?v=3.0&ak=你的AK密钥"></script> <div id="mapContainer" style="width:100%; height:600px;"></div> ``` ```javascript // Vue中初始化 export default { mounted() { this.initMap(); }, methods: { initMap() { const map = new BMap.Map("mapContainer"); // 设置默认中心点和缩放级别(后续会动态调整) map.centerAndZoom(new BMap.Point(116.404, 39.915), 12); this.map = map; } } } ``` --- #### **2. 批量创建标注点** 假设有一个坐标数组`points`,格式为`[{ lng: 116.404, lat: 39.915, label: "北京", count: 100 }, ...]`: ```javascript addMarkers(points) { const markers = []; points.forEach(point => { const { lng, lat, label, count } = point; // 创建坐标点 const position = new BMap.Point(lng, lat); // 创建标注对象 const marker = new BMap.Marker(position); // 添加自定义标签 this.setCustomLabel(marker, label, count); markers.push(marker); }); // 批量添加到地图 this.map.addOverlays(markers); // 调整地图显示区域(见步骤4) this.adjustViewport(markers); } ``` --- #### **3. 自定义标注样式** 通过`BMap.Label`实现文本标注: ```javascript setCustomLabel(marker, labelText, count) { const content = ` <div class="custom-label"> <div>${labelText}</div> <p>${count}套</p> </div> `; const opts = { position: marker.getPosition(), offset: new BMap.Size(-30, -30) // 调整偏移量 }; const label = new BMap.Label(content, opts); label.setStyle({ border: "none", padding: "0", backgroundColor: "transparent" }); marker.setLabel(label); } ``` > 需配合CSS定义`.custom-label`样式实现圆角背景、字体颜色等[^3]。 --- #### **4. 自动调整地图显示区域** ```javascript adjustViewport(markers) { const points = markers.map(marker => marker.getPosition()); const viewport = this.map.getViewport(points, { margins: [50, 50, 50, 50] }); this.map.setViewport(viewport); } ``` 此方法会根据所有标注点的位置自动计算最佳视野[^1]。 --- #### **5. 性能优化(可选)** 处理海量点(如1000+)时使用聚合标注: ```javascript import MarkerClusterer from 'path/to/MarkerClusterer.js'; // 替换addOverlays方法 const clusterer = new MarkerClusterer(this.map, { markers: markers }); ``` 需提前加载`MarkerClusterer`库[^5]。 --- #### **6. 添加点击事件** 通过闭包避免事件覆盖: ```javascript markers.forEach((marker, index) => { marker.addEventListener("click", (e) => { const targetPoint = e.target.getPosition(); console.log("点击坐标:", targetPoint.lng, targetPoint.lat); // 可在此处显示信息窗口 }); }); ``` Vue中建议使用`闭包`或`自定义属性`绑定数据[^4]。 --- ### 完整代码示例 ```javascript // Vue组件中 export default { data() { return { map: null, points: [ { lng: 116.404, lat: 39.915, label: "北京", count: 200 }, { lng: 121.473, lat: 31.23, label: "上海", count: 150 } ] }; }, mounted() { this.initMap(); this.addMarkers(this.points); }, methods: { // 初始化地图、添加标注等方法同上 } } ``` --- ### 注意事项 1. **坐标转换**:若数据源为其他地图坐标系(如WGS84),需调用`BMap.Convertor`进行转换[^1] 2. **AK密钥**:需在百度地图开放平台申请替换 3. **样式冲突**:Vue中建议使用`scoped CSS`或穿透样式`::v-deep`
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值