小言_互联网的博客

玩转Leaflet-带你吃透Control知识

270人阅读  评论(0)

前言

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

一、Control是什么?

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

1、Control的选项配置

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

2、Control的方法

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

 3、Control默认效果

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

二、Leaflet-IconLayers是什么?

1、定义

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

 2、新建html页面


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Leflet-IconLayers demo </title>
  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: '&copy; <a href="http://www.openstreetmap.org/copyright">local_tile demo</a>'
  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: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
  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: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
  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: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
  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 <a href="http://stamen.com">Stamen Design</a>, <a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a> &mdash; Map data &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
  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 &copy; Esri &mdash; 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 &copy; 1987-2014 <a href="http://developer.here.com">HERE</a>',
  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 &copy; 1987-2014 <a href="http://developer.here.com">HERE</a>',
  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 &copy; 1987-2014 <a href="http://developer.here.com">HERE</a>',
  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: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> &copy; <a href="http://cartodb.com/attributions">CartoDB</a>',
  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还有许多的插件来帮助实现具体的特效。心动不如行动,赶紧学起来吧。


转载:https://blog.csdn.net/yelangkingwuzuhu/article/details/127721133
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场