Leaflet

一个开源并且对移动端友好的
交互式地图 JavaScript 库

← 教程


本教程假定你已经阅读了 Leaflet 类的继承原理

在 Leaflet 中,”图层(layer)”是任何能随地图移动的东西。与此相反,”控件(control)”是一个相对于地图容器保持静态的 HTML 元素,而 “处理程序(handler)”是一段改变地图行为的不可见代码。

处理程序(handler)

Map handlers 是 Leaflet 1.0 中的一个新概念,它们的功能是处理来自浏览器的 DOM 事件(例如 clickdblclickmousewheel)并改变地图的状态。

处理程序相对简单:它们只需要一个 addHooks() 方法(在映射中启用处理程序时运行)和一个 removeHooks() 方法(在禁用处理程序时运行)。处理程序的骨架是:

L.CustomHandler = L.Handler.extend({
	addHooks: function() {
		L.DomEvent.on(document, 'eventname', this._doSomething, this);
	},

	removeHooks: function() {
		L.DomEvent.off(document, 'eventname', this._doSomething, this);
	},

	_doSomething: function(event) { … }
});

这可以用一个简单的处理程序来说明,当移动设备倾斜时,通过 deviceorientation 事件来平移地图:

L.TiltHandler = L.Handler.extend({
	addHooks: function() {
		L.DomEvent.on(window, 'deviceorientation', this._tilt, this);
	},

	removeHooks: function() {
		L.DomEvent.off(window, 'deviceorientation', this._tilt, this);
	},

	_tilt: function(ev) {
		// Treat Gamma angle as horizontal pan (1 degree = 1 pixel) and Beta angle as vertical pan
		this._map.panBy( L.point( ev.gamma, ev.beta ) );
	}
});

处理程序可以用 map.addHandler('tilt', L.TiltHandler) 附加到地图上 —— 这将把 L.TiltHandler 的一个实例存储为 map.tilt。然而,更常见的是用 addInitHook 语法将处理程序附加到所有地图上:

L.Map.addInitHook('addHandler', 'tilt', L.TiltHandler);

我们的处理程序现在可以通过运行 map.tilt.enable() 来启用,并通过 map.tilt.disable() 来禁用

此外,如果地图具有与处理程序名称相同的属性,那么如果该选项为 true,则该处理程序将默认启用,因此这将默认启用我们的处理程序:

var map = L.map('mapDiv', { tilt: true });

如果要看这个例子,你需要一个支持 deviceorientation 事件 的移动浏览器 - 即使如此,这个事件也是特别不稳定和不明确的,因此你需要注意这一点。

查看单独示例。

根据事件的类型,地图处理程序可以将事件监听器附加到 documentwindow 或它所连接的 L.Map 的容器上。

控件(Controls)

您已经知道控件 - 左上角的缩放控件、左下角的缩放、右上角的图层切换器。本质上,L.Control 是一个 HTML 元素,位于地图容器中的静态位置。

要制作一个控件,只需继承 L.Control 并实现 onAdd()onRemove()。这些方法的工作方式与 L.Layer 对应的方法类似(每当控件被添加到地图或从地图中移除时,它们都会运行),除了 onAdd() 必须返回一个代表控件的 HTMLElement 实例。将元素添加到地图上是自动完成的,删除也是如此。

自定义控件的最简单示例是水印,它只是一个图像:

L.Control.Watermark = L.Control.extend({
	onAdd: function(map) {
		var img = L.DomUtil.create('img');

		img.src = '../../docs/images/logo.png';
		img.style.width = '200px';

		return img;
	},

	onRemove: function(map) {
		// Nothing to do here
	}
});

L.control.watermark = function(opts) {
	return new L.Control.Watermark(opts);
}

L.control.watermark({ position: 'bottomleft' }).addTo(map);
查看单独示例。

如果您的自定义控件具有可点击按钮等交互元素,请记得在 onAdd() 中使用 L.DomEvent.on(),在 onRemove()中使用 L.DomEvent.off()

如果您的自定义控件包含多个 HTML 元素(比如 L.Control.Zoom,它有两个按钮),则您必须创建元素的整个层次结构并返回最顶层的容器。

发布属于自己的插件

如果到目前为止你已经了解了所有内容,那么你就可以制作一些 Leaflet 插件了!但请务必阅读 PLUGIN-GUIDE.md 文件,因为它包含有关命名和发布插件的一些提示和最佳实践。