iClient for Leaflet实现多屏地图联动

作者:LX

在实际项目中用多个屏幕地图联动来实现地图信息对比查看的应用还是挺多的,下面我就给大家简单介绍一下如何基于iClient for Leaflet来实现多屏地图联动的效果。
先上效果:
在这里插入图片描述

实现思路:

1、分屏:这里的分屏其实是将地图分别加载到不同的地图容器,分多少屏就创建多少个地图容器
2、联动:首先要监听地图的缩放和拖拽事件,事件触发的时候获取当前地图的中心点和缩放级别,然后把获取的中心点和地图缩放级别设置给需要联动的地图,让联动的地图中心点和缩放级别一致从而达到视图范围一致实现分屏联动的效果。

实现代码:

1、引入leaflet的js库

<script type="text/javascript" src="../../dist/leaflet/include-leaflet.js"></script>

2、建立map容器,分几屏就建立几个map容器,这里以两个为例

<div id="mapcontainer">
    <p id="map0"></p>
    <p id="map1"></p>
</div>

3、根据map容器的个数创建map对象,每个容器对应一个map对象

 var maps=[];
 var divnum = document.getElementById('mapcontainer').children.length;
 for(var i=0;i<divnum;i++){
     //地图容器id值
    idvalue="map"+i;
    //map对象数组
     maps[i]=L.map(idvalue, {
        preferCanvas: true,
        crs: L.CRS.EPSG4326,
        center: [-10, 40],
        maxZoom: 18,
        zoom: 3
    });
}

4、图层添加到地图上(图层可以根据实际需求添加)

//添加底图
 L.supermap.tiledMapLayer(url).addTo(maps[0]);//左屏添加地图
 L.supermap.tiledMapLayer(url1).addTo(maps[1]); //右屏添加地图
//添加叠加图层
 addLayers();
 function addLayers() {
     //创建一个热力图在左屏上显示
     heatMapLayer = L.supermap.heatMapLayer(
         "heatMap",
         {
             // "map": maps[0],
             "id": "heatmap",
             "radius": 45,
             "featureWeight": "value",
         }
     ).addTo(maps[0]);
     var num = parseInt(200);
     var radius = parseInt(30);
     var unit = "px";
     heatMapLayer.useGeoUnit = false;
     heatMapLayer.radius = radius;

     //创建一个要素组在右屏上显示
     featureGroup = L.featureGroup().addTo(maps[1]);

     //给图层添加要素
     var features = [];
     for (var i = 0; i < num; i++) {
         var point = [Math.random() * 160 - 80, Math.random() * 340 - 170];
         var marker = L.circleMarker(point, { color: "blue", radius: 5, stroke: false, fillcolor: "blue", fillOpacity: 1 });
         featureGroup.addLayer(marker);
         var geometry = L.point(Math.random() * 340 - 170, Math.random() * 160 - 80);
         var attributions = {
             "value": Math.random() * 9,
         };
         features[i] = L.supermap.heatMapFeature(geometry, attributions);

         heatMapLayer.addFeatures(features);
     }
 }

5、联动实现

 function maplink(e) {
       var _this = this;
       maps.map(function (t) {
       //拖动和缩放地图的时候获取当前地图的中心点和缩放级别并设置给maps数组中的地图实现联动
           t.setView(_this.getCenter(), _this.getZoom())
       })
   }
   //绑定拖动和缩放地图事件
   maps.map(function (t) {
       t.on({ drag: maplink, zoom: maplink })
   })

完整代码:

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title data-i18n="resources.title_tiledMapLayer4326"></title>
    <script type="text/javascript" src="../js/include-web.js"></script>
</head>
<style>
    #map0 {
        height: 500px;
        width: 500px;
        margin: 0px;
    }

    #map1 {
        position: fixed;
        left: 505px;
        top: 0;
        height: 500px;
        width: 500px;
        margin: unset;
    }
</style>
</head>

<body style="background: #fff;width: 100%;height:100%;position: absolute;top: 0;margin: unset;">
    <div id="mapcontainer">
        <p id="map0"></p>
        <p id="map1"></p>
    </div>
    <script type="text/javascript" src="../../dist/leaflet/include-leaflet.js"></script>
    <script type="text/javascript">
        var host = window.isLocal ? window.server : "http://support.supermap.com.cn:8090",
        url = host + "/iserver/services/map-world/rest/maps/World",
        url1 = host + "/iserver/services/map-world/rest/maps/世界地图_Night";
        var divnum = document.getElementById('mapcontainer').children.length;
        var maps = [];
        for (var i = 0; i < divnum; i++) {
            //地图容器id值
            idvalue = "map" + i;
            //map对象数组
            maps[i] = L.map(idvalue, {
                preferCanvas: true,
                crs: L.CRS.EPSG4326,
                center: [-10, 40],
                maxZoom: 18,
                zoom: 3
            });
        }
        //图层添加到地图上
        //添加底图
        L.supermap.tiledMapLayer(url).addTo(maps[0]);//左屏添加地图
        L.supermap.tiledMapLayer(url1).addTo(maps[1]); //右屏添加地图
        addLayers();
        function addLayers() {
            //创建一个热力图在左屏上显示
            heatMapLayer = L.supermap.heatMapLayer(
                "heatMap",
                {
                    // "map": maps[0],
                    "id": "heatmap",
                    "radius": 45,
                    "featureWeight": "value",
                }
            ).addTo(maps[0]);
            var num = parseInt(200);
            var radius = parseInt(30);
            var unit = "px";
            heatMapLayer.useGeoUnit = false;
            heatMapLayer.radius = radius;

            //创建一个要素组在右屏上显示
            featureGroup = L.featureGroup().addTo(maps[1]);

            //给图层添加要素
            var features = [];
            for (var i = 0; i < num; i++) {
                var point = [Math.random() * 160 - 80, Math.random() * 340 - 170];
                var marker = L.circleMarker(point, { color: "blue", radius: 5, stroke: false, fillcolor: "blue", fillOpacity: 1 });
                featureGroup.addLayer(marker);
                var geometry = L.point(Math.random() * 340 - 170, Math.random() * 160 - 80);
                var attributions = {
                    "value": Math.random() * 9,
                };
                features[i] = L.supermap.heatMapFeature(geometry, attributions);

                heatMapLayer.addFeatures(features);
            }
        }


        //地图联动实现
        function maplink(e) {
            var _this = this;
            maps.map(function (t) {
                t.setView(_this.getCenter(), _this.getZoom())
            })
        }
        //绑定拖动和缩放地图事件
        maps.map(function (t) {
            t.on({ drag: maplink, zoom: maplink })
        })


    </script>
</body>

</html>

ps:将上面的代码直接粘贴到http://iclient.supermap.io站点上任意一个范例中即可看到运行效果。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值