このチュートリアルでは、Leafletのクラス継承の理論を読んでいることを前提としています。
Leafletでは、「レイヤー」はマップと一緒に移動するものです。これとは対照的に、「コントロール」はマップコンテナに対して静的な位置にあるHTML要素であり、「ハンドラー」はマップの動作を変更する目に見えないコードの一部です。
ハンドラー
マップハンドラーはLeaflet 1.0の新機能であり、ブラウザからのDOMイベント(click
、dblclick
、mousewheel
など)を処理してマップの状態を変更する機能があります。
ハンドラーは比較的シンプルです。 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
イベントをサポートするモバイルブラウザが必要です。それでも、このイベントは特に不安定で仕様が不明確なので、注意してください。
この例をスタンドアロンでご覧ください。 |
イベントの種類によっては、マップハンドラーはdocument
、window
、またはアタッチされているL.Map
のコンテナにイベントリスナーをアタッチできます。
コントロール
コントロールは既に知っているはずです。左上のズームコントロール、左下のスケール、右上のレイヤースイッチャーなどです。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要素で構成されている場合(2つのボタンを持つL.Control.Zoom
など)、要素全体の階層を作成し、最上位のコンテナを返す必要があります。
プラグインの公開
ここまで理解していれば、Leafletプラグインを作成する準備ができました!ただし、命名とプラグインの公開に関するヒントとベストプラクティスが含まれているPLUGIN-GUIDE.mdファイル
を読むことを確認してください。