通常、2D マップを使用しますが、実際にはopenlayers、leaflet、またはmapbox-gl-jsなどの利用可能なウェブマップライブラリがあります。openlayers で水平のみのマップを作成する方法を紹介します。
マップを水平のみに制御するには、次のインタラクションをフックする必要があります:pan
、wheel scroll zoom
。
openlayers が上記で使用するデフォルトのインタラクションは、次のリンクで見つけることができます:
- dragPan:DragPan.js
- mouseWheelZoom:MouseWheelZoom.js
デフォルトのインタラクションを無効にする#
最初のステップでは、マップのデフォルトのインタラクションを無効にします。
const map = new Map({
...
interactions: defaultInteractions({
dragPan: false,
mouseWheelZoom: false,
doubleClickZoom: false
})
...
}
このオプションを適用すると、マップはもはや制御できなくなります。これが私たちが想定していることです。
インタラクションをフックする#
ドラッグパン#
まず、DragPan
から拡張されたカスタムのパンインタラクションを作成します。
デフォルトのインタラクションは、Drag Event
、Pointer Up
、Pointer Down
イベントを処理するための 3 つのメソッドを実装しています。Drag Event
ハンドラには座標の計算が含まれています。つまり、新しいhandleDragEvent
をオーバーライドする必要があります。
class Drag extends DragPan {
constructor() {
super();
this.handleDragEvent = function (mapBrowserEvent) {
...
const delta = [
this.lastCentroid[0] - centroid[0],
// centroid[1] - this.lastCentroid[1],
0
];
...
}
セントロイドの 2 番目の要素には y 座標が格納されているため、y デルタに関する行をコメントアウトし、0 を設定します。
const map = new Map({
...
interactions: defaultInteractions({
dragPan: false,
mouseWheelZoom: false,
doubleClickZoom: false
}).extend([new Drag()]),
...
})
defaultInteractions
関数の後にカスタムのドラッグインタラクションを追加し、マウスドラッグでマップをパンできるようにします。
マウスホイールズーム#
ドラッグパンのセクションに従って、MouseWheelZoom
の座標計算行を簡単に見つけることができます。
それらはL187-L189で表示され、handleEvent
メソッドで少し調整を行います:
const coordinate = mapBrowserEvent.coordinate;
const horizontalCoordinate = [coordinate[0], 0]
this.lastAnchor_ = horizontalCoordinate;
dragPan と同様に、デフォルトのインタラクションの後にカスタムのMouseWheelZoom
インタラクションZoom
を追加します。
const map = new Map({
...
interactions: defaultInteractions({
dragPan: false,
mouseWheelZoom: false,
doubleClickZoom: false
}).extend([new Drag(),new Zoom]),
...
})
これでマップはマウスホイールでズームできるようになり、水平方向のみで動作します。