meface/docs/article/gis/openlayers/63olevent.md

100 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 事件监听与解除
date: 2020-11-2
author: ac
tags:
- OpenLayers
- Interactions
categories:
- GIS
---
## 1 Interactions
`ol`中与地图交互相关的类都封装在`ol.interaction`命名空间下。
在`Interactions`模块中有一个`defaults`交互组件对象, 它是`Map`中默认交互组件的集合。在创建`Map`实例时,可以添加`interactions`参数设置默认交互组件的是否加载到`Map`实例中。这些默认的交互控件,提供基础的地图展示功能。
### 1.1 Default Interactions
- [`ol/interaction/DragRotate~DragRotate`](https://openlayers.org/en/latest/apidoc/module-ol_interaction_DragRotate-DragRotate.html):拖动旋转。按住`Shift`和`Alt`键,鼠标拖动地图,会绕当前视图中心旋转。
- [`ol/interaction/DoubleClickZoom~DoubleClickZoom`](https://openlayers.org/en/latest/apidoc/module-ol_interaction_DoubleClickZoom-DoubleClickZoom.html):双击放大。按住`Shift`键双击是缩小。
- [`ol/interaction/DragPan~DragPan`](https://openlayers.org/en/latest/apidoc/module-ol_interaction_DragPan-DragPan.html):拖动地图。
- [`ol/interaction/PinchRotate~PinchRotate`](https://openlayers.org/en/latest/apidoc/module-ol_interaction_PinchRotate-PinchRotate.html):允许用户通过两个手指在触摸屏上旋转地图。
- [`ol/interaction/PinchZoom~PinchZoom`](https://openlayers.org/en/latest/apidoc/module-ol_interaction_PinchZoom-PinchZoom.html):允许用户通过在触摸屏上用两个手指捏来缩放地图。
- [`ol/interaction/KeyboardPan~KeyboardPan`](https://openlayers.org/en/latest/apidoc/module-ol_interaction_KeyboardPan-KeyboardPan.html)允许用户使用键盘箭头平移地图。请注意尽管这种交互在默认情况下包含在map中但只有当浏览器的焦点放在附加键盘事件的元素上时才能使用这些键。简单点说就是焦点在map上时才可以使用箭头点击一下map上的放大缩小或attributes属性控件让可以map获取焦点。
- [`ol/interaction/KeyboardZoom~KeyboardZoom`](https://openlayers.org/en/latest/apidoc/module-ol_interaction_KeyboardZoom-KeyboardZoom.html):使用数字键盘上的`+`、`-`控制地图的缩放(`Shift`+`=+`也可以放大。同样需要map获取焦点后才有效可以点击map上的放大缩小或attributes属性控件让可以map获取焦点。
- [`ol/interaction/MouseWheelZoom~MouseWheelZoom`](https://openlayers.org/en/latest/apidoc/module-ol_interaction_MouseWheelZoom-MouseWheelZoom.html):允许使用滚轮滑动控制地图缩放。
- [`ol/interaction/DragZoom~DragZoom`](https://openlayers.org/en/latest/apidoc/module-ol_interaction_DragZoom-DragZoom.html):允许用户通过按`Shift`键在地图上框选来放大地图。
可以看出默认控件主要功能是地图的导航相关的操作,通过键盘或鼠标对地图进行平移、旋转、缩放等功能。
### 1.2 数据交互
除了这些默认的交互控件外,`ol`还提供跟用户在线编辑相关的交互控件,如:
- [`ol/interaction/Draw`](https://openlayers.org/en/latest/apidoc/module-ol_interaction_Draw-Draw.html):用于绘制几何对象的交互控件。
- [`ol/interaction/Modify`](https://openlayers.org/en/latest/apidoc/module-ol_interaction_Modify-Modify.html):用于修改要素几何对象的交互控件。必须使用`source`或`feature`选项来构建,当要修改已经添加到`source`中的要素,需要在构造参数`option`中指定`source`,当要修改`feature`集合中的要素时,需要在在构造参数`option`中指定`features`
- [`ol/interaction/Select`](https://openlayers.org/en/latest/apidoc/module-ol_interaction_Select-Select.html):用于选择矢量要素的交互控件。
- [`ol/interaction/Snap`](https://openlayers.org/en/latest/apidoc/module-ol_interaction_Snap-Snap.html):在绘制或修改时,用于捕捉节点的交互工具。
除了默认的交互控件地图上要新增其它控件需要调用map的`addInteraction()`方法添加移除控件调用map的`removeInteraction()`方法,交互控件只有添加到地图上才有作用。
## 2 示例
**默认交互组件设置:**
```html
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="css/ol.css" type="text/css">
<style>
.map {
height: 400px;
width: 100%;
}
</style>
<script src="lib/ol.js"></script>
<title>OpenLayers example</title>
<meta charset="UTF-8">
</head>
<body>
<h2>My Map</h2>
<div id="map" class="map"></div>
<script type="text/javascript">
var map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
view: new ol.View({
center: ol.proj.fromLonLat([37.41, 8.82]),
zoom: 4
}),
interactions:new ol.interaction.defaults({
'altShiftDragRotate': true,//是否允许按住Alt-Shift拖动地图进行旋转
'onFocusOnly':false, //是否只有map所在的html元素获取焦点时才可以使用滚轮缩放地图和拖动地图
'doubleClickZoom':true,
'keyboard':true,//在map聚焦的情况下可以使用键盘上的"-"缩小地图shift+"+"放大地图,按"↑"、"↓"、"←"、"→"键平移地图
'mouseWheelZoom':false,//是否可以使用鼠标滑轮进行缩放
'shiftDragZoom':true,//是否按住shift加拖动的方式放大地图(拖动的区域)
'dragPan':false,//是否可以拖动地图
'pinchRotate':true,//是否允许用户使用两个手指【旋转】地图(移动端用的到)
'pinchZoom':true,//是否允许用户使用两个手指【缩放】地图(移动端用的到)
// 'zoomDuration':500 //缩放的动画时间
})
});
</script>
</body>
</html>
```