Leaflet:控件Control相关
Leaflet官方文档中只给出了4种控件:Zoom、Attribution、Layers、Scale;它们都是继承自Control类,具体可以参考Control。
Control
Zoom、Scale、Layer、Attribution的父类
1、参数
position //Map控件的位置,只能位于Map四个角落中的一个,
//即值只能是'topleft', 'topright', 'bottomleft' , 'bottomright',
//默认是topleft左上角
2、方法
//子类继承的方法
getPosition() //获取控件位置
setPosition(position) //设置控件的位置,还是只能取参数中所说的四个值
getContainer() //返回包含了这个Control的HTMLElement
addTo(<Map>map) //把这个控件加到map上
remove() //从该空间当前活动的map上移除该控件

control.zoom
一个缩放控件;有两个按钮分别是放大(Zoom in)和缩小(Zoom out)。其实这个按钮在我们创建的Map上是默认存在的,除非在通过L.map初始化Map时,把参数zoomControl设置为了false,这样才不会显示最初的缩放控件。
L.control.zoom({
position:'topright',
zoomInTitle:'放大',
zoomOutTitle:'缩小'
}).addTo(leafletMap);
默认位置为左上角。如果要设置位置,可通过修改从父类Control继承而来的属性position设置。
control.attribution
一个展示Layer属性信息的文本块的控件;这个控件是默认显示的,除非在L.map初始化Map时,把参数attributionControl设置为了false。
L.control.attribution({
position:'bottomleft',
prefix:'This is an attribution'
}).addTo(leafletMap);
这时就会在Map左下角显示出来。

可以通过attribution动态显示出坐标信息:
//暂未实现
control.scale
比例尺控件
L.control.scale({
position:'topleft',
maxWidth:'100',
imperial:false
}).addTo(leafletMap);
参数imperial标识英制长度,默认是true,这里修改为false不让显示。
设置完成后,在Map左上角显示一个比例尺scale:

control.layer
一个Layer控件,可以叠加多个Layer,可以在该控件中选择显示哪个。
这个控件我认为是最高级、最炫酷、最难的一个控件了,这里多花一点篇幅细细说明。以下内容来自Leaflet官方文档之Layer Groups and Layers Control
假如你有一组Map元素(Circle、Marker、Polygon等),想把它们作为一个整体加入到Layer中,而不是作为一个个单独的元素加入。
这时你可以把它们布置到一个另外的Layer(区别于底图的Layer,该Layer只有这些元素)中,方法是L.layerGroup( [ 元素A , 元素B , 元素C ... ] )
var littleton = L.marker([39.61, -105.02]).bindPopup('This is Littleton, CO.'),
denver = L.marker([39.74, -104.99]).bindPopup('This is Denver, CO.'),
aurora = L.marker([39.73, -104.8]).bindPopup('This is Aurora, CO.'),
golden = L.marker([39.77, -105.23]).bindPopup('This is Golden, CO.');
//把上述元素加入到一个额外的Layer cities中
var cities=L.layerGroup( [ littleton, denver, aurora, golden ] );
现在就有了一个citiesLayer,其中结合了所有的Marker元素。这时,你就可以将这些Marker元素作为一个整体,加入到Map或者从Map中删除了。
之后就是显示了,我们要用到Layers Control,负责控制显示/隐藏哪个Layer。
在Leaflet中,有两种Layer:(1)base layers——底图(在我们的GIS系统中一次只能显示一张底图,比如之前的代码中一直显示的mapbox的tile layer);(2)overlays——覆盖Layer(放在底图上的Layer,比如上文的citiesLayer)。
在下边的例子中,我们要创建两个底图:一个是streets——街道图,另一个是satellite——卫星图;然后在其上覆盖一个Layer——我们之前创建的citiesLayer。
var map1 = L.tileLayer(url, {
maxZoom: 18,
id: 'mapbox.satellite'
}),
map2 = L.tileLayer(url, {
maxZoom: 18,
id: 'mapbox.streets'
}).addTo(leafletMap);
cities.addTo(leafletMap);
把底图map2和覆盖Layer cities都加入到leafletMap中,这些Layer也可以在通过L.map初始化Map时通过属性layers : [ map2 , cities ]进行添加。
之后,我们要创建两个对象——一个包含了我们所有的底图;另一个包含了我们的覆盖Layer。这两个对象都是以key:value形式创建的。Key是我们在Layer控件中显示的这些Layer名字,Value就是这些名字对应的Layer对象。
注:Key/Value的写法类似于之前创建某种元素时的属性的写法,都是{ name1 : value1 ,...}
var baseMaps={
'Satellite' : map1,
'Streets': map2
};
var overlayMaps={
'Cities' : cities
};
现在,与Layer控件相关的准备工作都已经做好了,包括控件上显示的内容(Layer名)以及这些内容实际对应的Layer对象。剩下的就是生成控件并把它加入到Map中了。通过L.control.layers()创建一个Layer Control;
两个参数:
第一个参数是之前创建的包含了所有底图的对象baseMaps;
第二个参数则是覆盖Layer对象overlayMaps。
这两个参数都是可选的,你可以不写第二个参数而只用一个底图对象;也可以用null代替第一个参数而只用一个覆盖Layer对象。在这两种情况下,省略的Layer都不会显示出来。
L.control.layers( baseMaps , overlayMaps ).addTo(leafletMap);
当然,你也可以通过在创建时设置其父类Control的属性position来设置该控件的位置,但是补充的参数要放在上边所说的两个参数后边:
L.control.layers( baseMaps , overlayMaps ,
{position:'topleft'}).addTo(leafletMap);
结果:



写在Layer相关的最后:
1、虽然我们应用了多个底图(base map),但是在初始化Map时只有一个参与了(即L.map时的layers属性中只有一个底图,或者只有一个底图在创建时addTo(leafletMap)),但是当我们使用Layer控件时,仍要把所有的底图都以Key/Value的形式给放在一个底图对象中,该对象就是创建控件时L.control.layers()的第一个参数。
2、上文的Key可以赋予相应的样式,比如把Satellite变成红色:
var baseMaps = {
"<span style='color: red'>Satellite</span>": map1,
"Streets": map2
};

Leaflet:控件Control相关的更多相关文章
- AnjularJS系列2 —— 表单控件功能相关指令
第二篇,表单控件功能相关指令. ng-checked控制radio和checkbox的选中状态 ng-selected控制下拉框的选中状态 ng-disabled控制失效状态 ng-multiple控 ...
- 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~ 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
看两个例子,一个是在一个进程里设置另外一个进程中控件的属性.另外一个是在一个进程里获取另外一个进程中控件的属性. 第一个例子 最近,在做一个使用线程控制下载文件的小程序(使用进度条控件显示下载进度)时 ...
- 【AnjularJS系列2 】— 表单控件功能相关指令
第二篇,表单控件功能相关指令. ng-checked控制radio和checkbox的选中状态 ng-selected控制下拉框的选中状态 ng-disabled控制失效状态 ng-multiple控 ...
- C# WinForm窗体 控件Control 的 Invalidate、Update、Refresh的区别
Control.Refresh - does an Control.Invalidate followed by Control.Update.Refresh: 强制控件使其工作区无效并立即重绘自己和 ...
- Qt界面(控件)相关设计
(转自:http://blog.chinaunix.net/uid-25799257-id-600157.html) 引言 最近在做数据库相关课程设计,所以就借此机会,先熟悉一下Qt的一些编程,同时 ...
- AngularJS form $addControl 注冊控件control
需求背景: 在form中使用编写的某component directive时.想通过form's name来对form中控件进行操作, 如使用$invalid等来ng-disabled btn. 解决 ...
- Andriod常用控件介绍&相关属性(初学方便查询)
一.TextView(显示控件) android:id(给当前控件定义唯一的标识符)——示例:android:id = "@+id/text_view" android:layou ...
- WebBrowser控件使用相关
修改WebBrowser控件的内核解决方案 http://www.cnblogs.com/sung/p/3391264.html C#中的WebBrowser控件的使用 http://www.cnbl ...
- WPF DataGrid列设置为TextBox控件的相关绑定
在wpf的DataGrid控件中,某一列的数据模板为TextBox控件的话,绑定Text="{Binding TxtSn, UpdateSourceTrigger=PropertyChang ...
随机推荐
- MySQL基本数据类型之枚举与集合类型
目录 一:枚举 1.枚举 2.创建表(使用枚举) 3.表内添加数据 二:集合 1.集合 2.创建表(使用集合) 3.表内添加数据 一:枚举 1.枚举 枚举作用: 提前定义好数据之后 后续录入只能录定义 ...
- python20day
昨日回顾 正则表达式 元字符 量词 贪婪非贪婪 转义符 re模块 findall 会优先显示分组内容 取消优先显示(?: ) search 只能返回第一个符合条件的项 得到的结果需要.group()取 ...
- SIFT,SuperPoint在图像特征提取上的对比实验
SIFT,SuperPoint都具有提取图片特征点,并且输出特征描述子的特性,本篇文章从特征点的提取数量,特征点的正确匹配数量来探索一下二者的优劣. 视角变化较大的情况下 原图1 原图2 SuperP ...
- AGC004 部分简要题解
E 首先问题可以转化为:每次将出口带着边界走,出了边界的机器人立马消失,最大化出口碰到的机器人数量. 考虑哪些机器人是已经出界了的,不难有观察: 当前出界的机器人只与当前出口往四个方向走过的最远距离有 ...
- String存放位置
简介 字符串在不同的JDK版本中,存放的位置不同,创建方式不同,存放的位置也不同. 存放位置 JDK1.7以下,无论何种方法创建String对象,位置都位于方法区. JDK1.8及1.8以上,new ...
- 抓包神器 tcpdump 使用介绍 (转)
tcpdump 命令使用简介 简单介绍 tcpdump 是一款强大的网络抓包工具,运行在 linux 平台上.熟悉 tcpdump 的使用能够帮助你分析.调试网络数据. 要想使用很好地掌握 tcpdu ...
- Java泛型T与?
感谢大佬:http://m.mamicode.com/info-detail-2657551.html 一.区别 单独的T 代表一个类型 ,而 Class<T>代表这个类型所对应的类, C ...
- 云端iclound使用-陈棚
使用NSmetadataQuery查询文档,增加,删除,编辑 界面设计完成后效果如图: 程序清单:FKDiary.h @interface FKDiary : UIDocument @property ...
- CABasicAnimation动画
使用CABasicAnimation动画: CALayer *znzLayer; = [[CALayer alloc]init]; //创建不断该表CALayer的transform属性动画 CABa ...
- Python--变量和简单数据类型
Python--变量和简单数据类型 目录 Python--变量和简单数据类型 一.Python脚本运行过程 二.变量 1. 变量的命名和使用 2. Python关键字和内置函数 2.1 Python关 ...