利用Leaflet.js创建交互式地图:绘制多个多边形和点位

引言

        在地理信息系统(GIS)和地图可视化领域,Leaflet.js是一个轻量级但功能强大的JavaScript库,它提供了丰富的API来创建交互式地图。本文将通过一个实际的Vue组件示例,展示如何使用Leaflet.js在地图上绘制多边形和点位,并且实现多边形上文字的动态缩放效果。

功能概述

        1.地图初始化

                首先,我们需要在Vue组件中初始化地图,设置中心点、缩放级别,并添加地图瓦片。

        2.多边形绘制

                通过给定的坐标点数据,我们使用Leaflet.js的L.polygon方法在地图上绘制多边形区域。

        3.点位图标添加

                在地图上添加视频监控点位,使用自定义图标,并为每个点位添加点击事件。

        4.响应式文字显示

                根据地图的缩放级别,动态调整多边形上文字的显示和隐藏,提升用户体验。

实现步骤

        这里提供的代码块仅展示了部分关键功能,以帮助读者理解整个实现过程,完整的代码和项目资源可以在个人中心-资源库获取

        1. 地图初始化

                在Vue组件的mounted生命周期钩子中初始化地图,并添加地图瓦片

initMap() {
    this.map = L.map("mapRef", {
        center: [21.582007, 111.824558],
        zoom: 15,
        zoomControl: false,
        doubleClickZoom: false,
        attributionControl: false,
    });
    this.name = L.tileLayer(
        "http://{s}.tile.osm.org/{z}/{x}/{y}.png", {
            maxZoom: 19,
            attribution: '© OpenStreetMap contributors',
        }
    ).addTo(this.map);
}

        2. 绘制多边形

                使用setBethAlreadyArea方法,将多边形数据转换为Leaflet.js所需的格式,并在地图上绘制。

setBethAlreadyArea(arr) {
    arr.map((item) => {
        let options = item.berthCoordinate.split(";").map((p) => p.split(",").map(Number));
        let marker = L.polygon(options, {
            color: item.lineColor,
            weight: item.lineFineness,
            fillColor: item.berthColour,
            fillOpacity: 0.5,
        }).addTo(this.map);
        // ...省略文字添加和事件绑定代码
    });
}

        3. 添加点位图标

                使用setVideoIcon方法,为每个视频监控点位添加图标,并绑定点击事件。

setVideoIcon(arr) {
    let videoIcon = L.icon({
        iconUrl: require("@/assets/images/berth/videoIcon.png"),
        iconSize: [25, 25],
        iconAnchor: [0, 0],
        popupAnchor: [-3, -76],
    });
    arr.map((item) => {
        let video = L.marker(item.position, { icon: videoIcon })
            .addTo(this.map)
            .on("click", (e) => this.videoSurveillance(item));
    });
}

        4. 响应式文字显示

        根据地图的缩放级别,动态调整多边形上文字的显示。

handleZoomChange(e) {
    const zoomLevel = e.target._zoom;
    const minZoomToShowText = 15;
    this.map.eachLayer((layer) => {
        if (layer instanceof L.Marker && layer.options.icon.options.className === "my-div-icon") {
            layer.setOpacity(zoomLevel < minZoomToShowText ? 0 : 1);
        }
    });
}

        5. 自动调整地图大小

        使用MutationObserver监听DOM变化,自动调整地图大小以适应不同屏幕尺寸。

autoSize() {
    new MutationObserver(() => this.map.invalidateSize()).observe(this.$refs.mapRef, {
        attributes: true,
        attributeFilter: ["style"],
    });
}

结语

        通过上述步骤,我们成功实现了一个基于Vue.js和Leaflet.js的交互式地图组件,它不仅能够绘制多边形和点位,还能够根据用户的缩放操作动态调整文字的显示。这种类型的组件在渔业监控、城市管理、环境监测等领域有着广泛的应用前景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小金子J

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值