• 玩转Leaflet-带你吃透Control知识


    前言

           周所周知,在LeafLet.js实现的地图应用中,通过control控件可以用于切换不同的底图。但是如果采用默认的样式进行展示,它的效果是比较难看的。随着大家对审美的发展,也随着更多灵活的自定义功能的需要,比如需要集成更多美观的底图,通常需要进行扩展。那么如何扩展Leaflet的control功能,满足大家的实际需要呢?本文将介绍一种基于Leaflet的插件# Leaflet-IconLayers,通过# Leaflet-IconLayers来实现自动切换图层的功能,文中重点介绍Control组件以及如何扩展这些组件,并给出实例代码。

    一、Control是什么?

            L.Control是Leaflet中一个实现地图控件的基类。负责处理定位。 所有其他的控件都是从这个类中延伸出来的。

    1、Control的选项配置

    选项类型默认值说明
    positionString'topright'控件的位置(地图的一个角)。可能的值是 'topleft'、 'topright'、 'bottomleft' 或 'bottomright'

    2、Control的方法

    方法返回值说明
    getPosition()string返回控件的位置。
    setPostionthis设置控件的位置。
    getContainer()HTMLElement返回包含该控件的 HTMLElement。
    addTo( map)this将控件添加到给定的地图中。
    remove()this将控件从当前活动的地图上删除。

     3、Control默认效果

             通过以上的效果可以看到,它的默认图层控制器放置在右上角,展示的效果也比较一般。

    二、Leaflet-IconLayers是什么?

    1、定义

           Leaflet-IconLayers是一个基于Leaflet的带图标的切换控制器,它需要在Leaflet0.7.3以上的版本上使用,浏览器需要在IE9+以上才可以正常访问。感兴趣的可以自行下载:Leaflet-IconLayers。使用git将代码下载之后可以看到如下工程:

     2、新建html页面

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>Leflet-IconLayers demotitle>
    6. <link rel="stylesheet" href="https://unpkg.com/leaflet@1.2.0/dist/leaflet.css" integrity="sha512-M2wvCLH6DSRazYeZRIm1JnYyh22purTM+FDB5CsyxtQJYeKq83arPe5wgbNmcFXGqiSH2XR8dT/fJISVA1r/zQ==" crossorigin=""/>
    7. <script src="https://unpkg.com/leaflet@1.2.0/dist/leaflet.js" integrity="sha512-lInM/apFSqyy1o6s89K4iQUKg6ppXEgsVxT35HbzUupEVRh2Eu9Wdl4tHj7dZO0s1uvplcYGmt3498TtHq+log==" crossorigin="">script>
    8. <script type="text/javascript" src="providers.js">script>
    9. <script type="text/javascript" src="../src/iconLayers.js">script>
    10. <link rel="stylesheet" href="../src/iconLayers.css">
    11. <style>
    12. body {
    13. margin: 0;
    14. padding: 0;
    15. width: 100%;
    16. height: 100%;
    17. }
    18. #map {
    19. position: absolute;
    20. top: 0;
    21. bottom: 0;
    22. left: 0;
    23. right: 0;
    24. }
    25. style>
    26. head>
    27. <body>
    28. body>
    29. html>

           图上iconLayers.js就是扩展的源码。

    3、底图配置

          在providers.js中定义了相关底图的配置,详细源码如下,比如在最前面增加了本地的离线瓦片底图。

    1. providers['local_tile'] = {
    2. title: 'local_tile',
    3. icon: 'icons/local_tile.png',
    4. layer: L.tileLayer('http://localhost:8086/data/basemap_water/{z}/{x}/{y}.png', {
    5. minZoom: 0,
    6. maxZoom: 16,
    7. attribution: local_tile demo'
    8. })
    9. };
    1. (function(factory) {
    2. if (typeof module !== 'undefined' && module.exports) {
    3. module.exports = factory(require('leaflet'));
    4. } else {
    5. window.providers = factory(window.L);
    6. }
    7. })(function(L) {
    8. var providers = {};
    9. providers['OpenStreetMap_Mapnik'] = {
    10. title: 'osm',
    11. icon: 'icons/openstreetmap_mapnik.png',
    12. layer: L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    13. maxZoom: 19,
    14. attribution: OpenStreetMap'
    15. })
    16. };
    17. providers['OpenStreetMap_BlackAndWhite'] = {
    18. title: 'osm bw',
    19. icon: 'icons/openstreetmap_blackandwhite.png',
    20. layer: L.tileLayer('http://{s}.tiles.wmflabs.org/bw-mapnik/{z}/{x}/{y}.png', {
    21. maxZoom: 18,
    22. attribution: OpenStreetMap'
    23. })
    24. };
    25. providers['OpenStreetMap_DE'] = {
    26. title: 'osm de',
    27. icon: 'icons/openstreetmap_de.png',
    28. layer: L.tileLayer('http://{s}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png', {
    29. maxZoom: 18,
    30. attribution: OpenStreetMap'
    31. })
    32. }
    33. providers['Stamen_Toner'] = {
    34. title: 'toner',
    35. icon: 'icons/stamen_toner.png',
    36. layer: L.tileLayer('http://stamen-tiles-{s}.a.ssl.fastly.net/toner/{z}/{x}/{y}.png', {
    37. attribution: 'Map tiles by Stamen Design, CC BY 3.0 — Map data © OpenStreetMap',
    38. subdomains: 'abcd',
    39. minZoom: 0,
    40. maxZoom: 20,
    41. ext: 'png'
    42. })
    43. };
    44. providers['Esri_OceanBasemap'] = {
    45. title: 'esri ocean',
    46. icon: 'icons/esri_oceanbasemap.png',
    47. layer: L.tileLayer('http://server.arcgisonline.com/ArcGIS/rest/services/Ocean_Basemap/MapServer/tile/{z}/{y}/{x}', {
    48. attribution: 'Tiles © Esri — Sources: GEBCO, NOAA, CHS, OSU, UNH, CSUMB, National Geographic, DeLorme, NAVTEQ, and Esri',
    49. maxZoom: 13
    50. })
    51. };
    52. providers['HERE_normalDay'] = {
    53. title: 'normalday',
    54. icon: 'icons/here_normalday.png',
    55. layer: L.tileLayer('http://{s}.{base}.maps.cit.api.here.com/maptile/2.1/maptile/{mapID}/normal.day/{z}/{x}/{y}/256/png8?app_id={app_id}&app_code={app_code}', {
    56. attribution: 'Map © 1987-2014 HERE',
    57. subdomains: '1234',
    58. mapID: 'newest',
    59. app_id: 'Y8m9dK2brESDPGJPdrvs',
    60. app_code: 'dq2MYIvjAotR8tHvY8Q_Dg',
    61. base: 'base',
    62. maxZoom: 20
    63. })
    64. };
    65. providers['HERE_normalDayGrey'] = {
    66. title: 'normalday grey',
    67. icon: 'icons/here_normaldaygrey.png',
    68. layer: L.tileLayer('http://{s}.{base}.maps.cit.api.here.com/maptile/2.1/maptile/{mapID}/normal.day.grey/{z}/{x}/{y}/256/png8?app_id={app_id}&app_code={app_code}', {
    69. attribution: 'Map © 1987-2014 HERE',
    70. subdomains: '1234',
    71. mapID: 'newest',
    72. app_id: 'Y8m9dK2brESDPGJPdrvs',
    73. app_code: 'dq2MYIvjAotR8tHvY8Q_Dg',
    74. base: 'base',
    75. maxZoom: 20
    76. })
    77. };
    78. providers['HERE_satelliteDay'] = {
    79. title: 'satellite',
    80. icon: 'icons/here_satelliteday.png',
    81. layer: L.tileLayer('http://{s}.{base}.maps.cit.api.here.com/maptile/2.1/maptile/{mapID}/satellite.day/{z}/{x}/{y}/256/png8?app_id={app_id}&app_code={app_code}', {
    82. attribution: 'Map © 1987-2014 HERE',
    83. subdomains: '1234',
    84. mapID: 'newest',
    85. app_id: 'Y8m9dK2brESDPGJPdrvs',
    86. app_code: 'dq2MYIvjAotR8tHvY8Q_Dg',
    87. base: 'aerial',
    88. maxZoom: 20
    89. })
    90. };
    91. providers['CartoDB_Positron'] = {
    92. title: 'positron',
    93. icon: 'icons/cartodb_positron.png',
    94. layer: L.tileLayer('http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', {
    95. attribution: OpenStreetMap © CartoDB',
    96. subdomains: 'abcd',
    97. maxZoom: 19
    98. })
    99. };
    100. return providers;
    101. });

    4、map对象添加

    1. var map = L.map('map').setView([29.052934, 104.0625], 5);
    2. var layers = [];
    3. for (var providerId in providers) {
    4. layers.push(providers[providerId]);
    5. }
    6. layers.push({
    7. layer: {
    8. onAdd: function() {},
    9. onRemove: function() {}
    10. },
    11. title: 'empty'
    12. })
    13. var ctrl = L.control.iconLayers(layers).addTo(map);

    5、最终效果

           通过以上步骤基本完成了control的自定义扩展功能,来看一下最终的效果,如果不满意的话,还可以根据自己项目的实际需要来进行扩展哦。

     三、总结

           以上就是今天要讲的内容,本文主要简单介绍了Leaflet中Control的定义,常用的方法,然后重点介绍Leaflet-IconLayers以及具体使用,如果在工作中需要进行扩展不妨采用这种方式。除了这个插件外,Leaflet还有许多的插件来帮助实现具体的特效。心动不如行动,赶紧学起来吧。

  • 相关阅读:
    驱动开发 platfrom总线驱动的三种方式
    报错的解决 sqlite3.OperationalError: unrecognized token: “630008.OF“
    Springboot自行车在线租赁系统毕业设计源码101157
    java计算机毕业设计西安财经大学校园一卡通管理系统源代码+数据库+系统+lw文档
    坚忍型性格分析,坚忍型人格的职业发展
    Qt Xml文件的创建和解析[xml和dom方式]
    MySQL数据库增删改查进阶(联合查询聚合查询)
    Android系统10 RK3399 init进程启动(三十五) 属性文件介绍和生成过程
    数据结构——栈的详细介绍
    【JAVA-Day49】Java LinkedList集合详解
  • 原文地址:https://blog.csdn.net/yelangkingwuzuhu/article/details/127721133