• LeaFlet学习之聚合效果


    leaflet实现聚合效果是通过插件进行的,虽然leaflet是轻量级的但是,许多功能都是没有依赖插件来完成,关于这有缺点也有有点,通过这几天对leaflet感觉一直都在依靠插件完成,本身就两个主题类,map和layer,如果是小型项目展示地图一类的,做一些基本的功能leaflet非常适合,给我最大的感觉leaflet生态环境很好。这里用的不是纯聚合插件,实在聚合插件基础上衍生出的动态移动的聚合插件,也能做静态插件下载:点我查看

    一、js和css

    这里需要引入的css样式:

        <link href="Script/leaflet/leaflet.css" rel="stylesheet" />
        <link href="Script/leaflet/LeafletStyleSheet.css" rel="stylesheet" />

    js:

        <script src="Script/leaflet/leaflet.js"></script>
         <script src="Script/leaflet/PruneCluster.js"></script>

    在这里我还用了一个加载中国地图插件该插件封装好集中地图加载

    <script src="Script/leaflet/leaflet.ChineseTmsProviders.js"></script>

    二、使用说明

    1、声明一个PruneClusterForLeaflet类

    var leafletView = new PruneClusterForLeaflet();

    2、循环加载数据

        for (var i = 0; i < data.length; ++i) {
            //声明marker输入经纬度
            var marker = new PruneCluster.Marker(data[i].y, data[i].x);
            //给marker添加一个点击提示框
            marker.data.popup = data[i].attribute.proname +"省" +data[i].attribute.name;
            console.log(marker);
            //放到刚才声明的PruneClusterForLeaflet类对象中
            leafletView.RegisterMarker(marker);
        }

    3、添加到地图

     map.addLayer(leafletView);

    三、全部源码

    <!DOCTYPE html>
    <html>
    
    <head>
        <title>天地图聚合</title>
        <meta charset="utf-8">
        <link href="Script/leaflet/leaflet.css" rel="stylesheet" />
        <link href="Script/leaflet/LeafletStyleSheet.css" rel="stylesheet" />
        <style type="text/css">
        body {
            padding: 0;
            margin: 0;
        }
        
        html,
        body,
        #map {
            height: 100%;
        }
        </style>
        <script src="Script/leaflet/leaflet.js"></script>
         <script src="Script/leaflet/PruneCluster.js"></script>
        <script src="Script/leaflet/leaflet.ChineseTmsProviders.js"></script>
       
        <script src="data/data.js"></script>
        
    </head>
    
    <body>
        <div id='map'></div>
    </body>
    <script type="text/javascript">
        
    
        var data = county.items;
    
    
       
            var normalm = L.tileLayer.chinaProvider('TianDiTu.Normal.Map', {
            maxZoom: 18,
            minZoom: 1
        }),
            normala = L.tileLayer.chinaProvider('TianDiTu.Normal.Annotion', {
                maxZoom: 18,
                minZoom: 1
            }),
            imgm = L.tileLayer.chinaProvider('TianDiTu.Satellite.Map', {
                maxZoom: 18,
                minZoom: 1
            }),
            imga = L.tileLayer.chinaProvider('TianDiTu.Satellite.Annotion', {
                maxZoom: 18,
                minZoom: 1
            });
    
        var normal = L.layerGroup([normalm, normala]);
        image = L.layerGroup([imgm, imga]);
        var leafletView = new PruneClusterForLeaflet();
        var baseLayers = {
            "地图": normal,
            "影像": image,
        }
    
        var overlayLayers = {
    
        }
    
        var map = L.map("map", {
            center: [31.59, 120.29],
            zoom: 12,
            layers: [normal],
            zoomControl: false
    
        });
       
        
        L.control.layers(baseLayers, overlayLayers).addTo(map);
        L.control.zoom({
            zoomInTitle: '放大',
            zoomOutTitle: '缩小'
        }).addTo(map);
    
        
        var size = data.length;
        var markers = [];
        for (var i = 0; i < data.length; ++i) {
            var marker = new PruneCluster.Marker(data[i].y, data[i].x);
            marker.data.popup = data[i].attribute.proname +"省" +data[i].attribute.name;
            console.log(marker);
            markers.push(marker);
            leafletView.RegisterMarker(marker);
        }
        //window.setInterval(function () {
        //    for (i = 0; i < size / 2; ++i) {
        //        var coef = i < size / 8 ? 10 : 1;
        //        var ll = markers[i].position;
        //        ll.lat += (Math.random() - 0.5) * 0.00001 * coef;
        //        ll.lng += (Math.random() - 0.5) * 0.00002 * coef;
        //    }
    
            
        //}, 1000);
        //leafletView.ProcessView();
        map.addLayer(leafletView);
    </script>
    
    </html>

    注释掉的部分实际是为了让marker动态移动,也是该插件的特色,有兴趣的可以试试。

    四、效果图

    五、总结

    相比较arcgis api 和open layer实现聚合效果更为方便,样式图标都可以自定义,聚合效果一直有个问题就是点太多了就会出现加载时候的卡顿,不知道有什么改进措施。

  • 相关阅读:
    游戏编程模式之原型模式
    游戏编程模式之观察者模式
    游戏编程模式之享元模式
    游戏编程模式之命令模式
    数据库系统概论(二):关系数据库
    数据库系统概论(一):绪论
    [Unity] Unity Cursor 设置和API解析
    HDU 5492 Find a path
    HDU 1317 XYZZY
    Codeforces 508D Tanya and Password
  • 原文地址:https://www.cnblogs.com/tuboshu/p/10752338.html
Copyright © 2020-2023  润新知