在最基本的代码中,我们没有进行任何设置.移动鼠标就可以移动地图,滑动滚轮就可以实现缩放.
这些都是Openlayer内置好的交互.

所有的交互都是基于监听的,如果前面的事件监听器返回false,那么后面的交互类就不会起作用。

建议不要轻易在MapBrowserEvent事件的监听器里面返回false。

一、Feature选取之选中样式

<div id="map" style="width: 100%"></div>
<script type="text/javascript">var layer = new ol.layer.Vector({source: new ol.source.Vector()});var map = new ol.Map({layers: [new ol.layer.Tile({source: new ol.source.OSM()}), layer],target: 'map',view: new ol.View({center: ol.proj.transform([104, 30], 'EPSG:4326', 'EPSG:3857'),zoom: 10})});// 在地图上添加一个圆var circle = new ol.Feature({geometry: new ol.geom.Point(ol.proj.transform([104, 30], 'EPSG:4326', 'EPSG:3857'))})circle.setStyle(new ol.style.Style({image: new ol.style.Circle({radius: 10,fill: new ol.style.Fill({color: 'red'})})}));layer.getSource().addFeature(circle);// 前面的代码我们已经看了很多遍了,关键是下面这段代码// 添加一个用于选择Feature的交互方式var selectSingleClick = new ol.interaction.Select({// API文档里面有说明,可以设置style参数,用来设置选中后的样式,但是这个地方我们注释掉不用,因为就算不注释,也没作用,为什么?// style: new ol.style.Style({//     image: new ol.style.Circle({//         radius: 10,//         fill: new ol.style.Fill({//             color: 'blue'//         })//     })// })});map.addInteraction(selectSingleClick);// 监听选中事件,然后在事件处理函数中改变被选中的`feature`的样式selectSingleClick.on('select', function(event){event.selected[0].setStyle(new ol.style.Style({image: new ol.style.Circle({radius: 10,fill: new ol.style.Fill({color: 'blue'})})}));})</script>

上面注释里面说到的,为什么style参数设置了没用? 因为我们的circle本身就设置了样式,而style参数设置的样式,其实是设置在内部新建的一个layer上的,而OpenLayers 3中,feature的样式优先级是大于layer的样式的优先级的。所以没生效,如果换成下面这种方式,就可以了:

<!Doctype html>
<html lang="ch" >
<head><meta http-equiv=Content-Type content="text/html;charset=utf-8"><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><meta content=always name=referrer><title>OpenLayers 地图示例</title><link href="ol.css" rel="stylesheet" type="text/css"/><script type="text/javascript" src="ol.js" charset="utf-8"></script>
</head>
<body >
<div id="map" style="width: 800px;height: 800px"></div>
<script type="text/javascript">var layer = new ol.layer.Vector({source: new ol.source.Vector()});var map = new ol.Map({layers: [new ol.layer.Tile({source: new ol.source.OSM()}),layer],target: 'map',view: new ol.View({center: ol.proj.transform([104, 30], 'EPSG:4326', 'EPSG:3857'),zoom: 10})});// 在地图上添加一个圆var circle = new ol.Feature({geometry: new ol.geom.Point(ol.proj.transform([104, 30], 'EPSG:4326', 'EPSG:3857'))})circle.setStyle(new ol.style.Style({image: new ol.style.Circle({radius: 10,fill: new ol.style.Fill({color: 'red'})})}));layer.getSource().addFeature(circle);// 前面的代码我们已经看了很多遍了,关键是下面这段代码// 添加一个用于选择Feature的交互方式var selectSingleClick = new ol.interaction.Select({// API文档里面有说明,可以设置style参数,用来设置选中后的样式,但是这个地方我们注释掉不用,因为就算不注释,也没作用,为什么?// style: new ol.style.Style({//     image: new ol.style.Circle({//         radius: 10,//         fill: new ol.style.Fill({//             color: 'blue'//         })//     })// })});map.addInteraction(selectSingleClick);// 监听选中事件,然后在事件处理函数中改变被选中的`feature`的样式selectSingleClick.on('select', function(event){event.selected[0].setStyle(new ol.style.Style({image: new ol.style.Circle({radius: 10,fill: new ol.style.Fill({color: 'blue'})})}));})</script>
</body></html>

二、Feature选取之条件过滤

之前我们是单击进行选择,而同样可以移动鼠标进行选择

<div id="map" style="width: 100%"></div>
<script type="text/javascript">var layer = new ol.layer.Vector({source: new ol.source.Vector(),style: new ol.style.Style({image: new ol.style.Circle({radius: 10,fill: new ol.style.Fill({color: 'red'})})})});var map = new ol.Map({layers: [new ol.layer.Tile({source: new ol.source.OSM()}), layer],target: 'map',view: new ol.View({center: ol.proj.transform([104, 30], 'EPSG:4326', 'EPSG:3857'),zoom: 10})});// 在地图上添加一个圆var circle = new ol.Feature({geometry: new ol.geom.Point(ol.proj.transform([104, 30], 'EPSG:4326', 'EPSG:3857'))})layer.getSource().addFeature(circle);// 添加一个用于选择Feature的交互方式map.addInteraction(new ol.interaction.Select({condition: ol.events.condition.pointerMove,     // 唯一的不同之处,设置鼠标移到feature上就选取style: new ol.style.Style({image: new ol.style.Circle({radius: 10,fill: new ol.style.Fill({color: 'blue'})})})}));
</script>

我们甚至可以重写过滤函数:

ol.events.condition.singleClick = function(mapBrowserEvent) {return mapBrowserEvent.type == ol.MapBrowserEvent.EventType.SINGLECLICK;
};

我们同样可以直接对feature进行过滤
选择圆形而不选择五角星

<div id="map2" style="width: 100%"></div>
<script type="text/javascript">// 创建一个用于存放circle的layervar circleLayer = new ol.layer.Vector({source: new ol.source.Vector(),style: new ol.style.Style({image: new ol.style.Circle({radius: 10,fill: new ol.style.Fill({color: 'red'})})})});// 创建一个用于存放star的layervar starLayer = new ol.layer.Vector({source: new ol.source.Vector(),style: new ol.style.Style({image: new ol.style.RegularShape({points: 5,radius1: 20,radius2: 10,fill: new ol.style.Fill({color: 'red'})})})});var map2 = new ol.Map({layers: [new ol.layer.Tile({source: new ol.source.OSM()}), circleLayer, starLayer],target: 'map2',view: new ol.View({center: ol.proj.transform([104, 30], 'EPSG:4326', 'EPSG:3857'),zoom: 10})});// 在地图上添加一个圆var circle1 = new ol.Feature({geometry: new ol.geom.Point(ol.proj.transform([104, 30], 'EPSG:4326', 'EPSG:3857'))})circleLayer.getSource().addFeature(circle1);// 在地图上添加一个五星var star = new ol.Feature({geometry: new ol.geom.Point(ol.proj.transform([104.06, 30.05], 'EPSG:4326', 'EPSG:3857'))})starLayer.getSource().addFeature(star);// 添加一个用于选择Feature的交互方式map2.addInteraction(new ol.interaction.Select({style: new ol.style.Style({image: new ol.style.Circle({radius: 10,fill: new ol.style.Fill({color: 'blue'})})}),// 关键: 设置过了条件,可以用feature来写过滤,也可以用layer来写过滤filter: function(feature, layer){return layer === circleLayer;}}));
</script>

前面的例子都只是一个feature的情况,在实际应用中,肯定是不止一个的,如果要能同时选择多个,只需要设置一下构造函数的参数multi: true,默认情况下,只能选取一个feature。 仿照上面的代码,可自行尝试。

三、通过HTML元素取消选择

<div id="map" style="width: 100%"></div>
<input type="button" value="取消选中" onclick="unselectFeature();"></input>
<script type="text/javascript">var layer = new ol.layer.Vector({source: new ol.source.Vector(),style: new ol.style.Style({image: new ol.style.Circle({radius: 10,fill: new ol.style.Fill({color: 'red'})})})});var map = new ol.Map({layers: [new ol.layer.Tile({source: new ol.source.OSM()}), layer],target: 'map',view: new ol.View({center: ol.proj.transform([104, 30], 'EPSG:4326', 'EPSG:3857'),zoom: 10})});// 在地图上添加一个圆var circle = new ol.Feature({geometry: new ol.geom.Point(ol.proj.transform([104, 30], 'EPSG:4326', 'EPSG:3857'))})layer.getSource().addFeature(circle);// 添加一个用于选择Feature的交互方式var clickSelect = new ol.interaction.Select({style: new ol.style.Style({image: new ol.style.Circle({radius: 10,fill: new ol.style.Fill({color: 'blue'})})})});map.addInteraction(clickSelect);// 取消选中function unselectFeature() {clickSelect.getFeatures().clear();// 下面这样也是可以取消选中的,根据情况选择// map.removeInteraction(clickSelect);}
</script>

四、绘制一条线

我们可以用ol.interaction.Draw类绘制图片
普通绘制,双击取消:

<div id="map" style="width: 100%"></div>
<script type="text/javascript">var map = new ol.Map({layers: [new ol.layer.Tile({source: new ol.source.OSM()})],target: 'map',view: new ol.View({center: ol.proj.transform([104, 30], 'EPSG:4326', 'EPSG:3857'),zoom: 10})});// 添加绘图的交互类map.addInteraction(new ol.interaction.Draw({type: 'LineString' // 设置绘制线}));
</script>

在地图上保存:

<div id="map2" style="width: 100%"></div>
<script type="text/javascript">var map2 = new ol.Map({layers: [new ol.layer.Tile({source: new ol.source.OSM()})],target: 'map2',view: new ol.View({center: ol.proj.transform([104, 30], 'EPSG:4326', 'EPSG:3857'),zoom: 10})});// 添加一个绘制的线使用的layervar lineLayer = new ol.layer.Vector({source: new ol.source.Vector(),style: new ol.style.Style({stroke: new ol.style.Stroke({color: 'red',size: 1})})})map2.addLayer(lineLayer);map2.addInteraction(new ol.interaction.Draw({type: 'LineString',source: lineLayer.getSource()    // 注意设置source,这样绘制好的线,就会添加到这个source里}));
</script>

ol.interaction.Draw的构造参数type的值为’Point’,‘Polygon’,,‘MultiPoint’,‘MultiLineString’,‘MultiPolygon’ 或者 ‘Circle’

五、绘图其他设置

前面只是简单的绘制上了一条线,在实际业务中,可能还需要设置绘图时的样式,限制绘制的点的个数,获取绘制的图形的所有坐标等。 在上一节的基础上,以下面这个地图为例,再给大家介绍一下这些方面的更深入的应用。下面绘制这条线的点不能超过4个,在绘制时,样式会和前一节的样式不太一样,在地图上方,会显示当前绘制完的线的所有点的坐标。

<div style="background-color: #999;"><span>当前绘制线的坐标:</span><span id='points'></span></div>
<div id="map" style="width: 100%"></div>
<script type="text/javascript">var map = new ol.Map({layers: [new ol.layer.Tile({source: new ol.source.OSM()})],target: 'map',view: new ol.View({center: ol.proj.transform([104, 30], 'EPSG:4326', 'EPSG:3857'),zoom: 10})});// 添加一个绘制的线使用的layervar lineLayer = new ol.layer.Vector({source: new ol.source.Vector(),style: new ol.style.Style({stroke: new ol.style.Stroke({color: 'red',size: 1})})})map.addLayer(lineLayer);var lineDraw = new ol.interaction.Draw({type: 'LineString',source: lineLayer.getSource(),    // 注意设置source,这样绘制好的线,就会添加到这个source里style: new ol.style.Style({            // 设置绘制时的样式stroke: new ol.style.Stroke({color: '#009933',size: 1})}),maxPoints: 4    // 限制不超过4个点});// 监听线绘制结束事件,获取坐标lineDraw.on('drawend', function(event){// event.feature 就是当前绘制完成的线的Featuredocument.getElementById('points').innerHTML = JSON.stringify(event.feature.getGeometry().getCoordinates());});map.addInteraction(lineDraw);
</script>

如果我们想取消当前绘制,直接用map.removeInteraction(lineDraw)就可以了。

Openlayer:学习笔记之交互相关推荐

  1. 【Vue】学习笔记-数据交互

    [Vue]学习笔记-数据交互 概述 安装axios 通过axios向后台获取数据 数据交互的实现 常见错误总结 概述 基于Vue的web项目显示的所有服务端数据,都是通过Ajax获取的.官方推荐使用A ...

  2. 【算法竞赛学习笔记】交互题入门

    title : 交互题 tags : ACM,交互 date : 2022-2-11 author : Linno 交互题 通俗来讲,交互题与平时题目的输入输出反过来,是让你设计程序去向用户提出询问, ...

  3. Python学习笔记:交互对话环境IPython

    文章目录 一.IPython安装 1.在CMD窗口利用pip安装IPython 2.安装Anaconda,自带了IPython 3.手工下载IPython之后进行安装 二.启动IPython 1.在普 ...

  4. PHP学习笔记-PHP与JavaScript的交互

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/51814192 本文出自:[顾林海的博客] 前言 前两篇笔记PHP学习笔 ...

  5. PHP学习笔记-PHP与Web页面的交互2

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/51761308 本文出自:[顾林海的博客] 前言 在<PHP学习笔 ...

  6. 和php交互的过程_JavaScript学习笔记(二十三) 服务器PHP

    PHP PHP 一门后端语言 为什么要学习一个后端语言呢? 目前市场上的需求,要求前端人员掌握一个后端语言 方便和后端开发人员进行交互 基本组织架构 在讲后端语言之前,我们简单的了解一下我们基本的组织 ...

  7. Vue学习笔记(三) —— 前后端交互

    简介 本文主要是为了介绍前端交互的相关知识,而严格来讲,这也不算是Vue的专属知识,但是却是必须要指定的.本文开始简单说了ajax.jquery 的方式,但是随着SPA开发模式的大火,相继出现了一些新 ...

  8. windows内核开发学习笔记十七:IRP 和 IO_STACK_LOCATION 的交互

    windows内核开发学习笔记十七:IRP 和 IO_STACK_LOCATION 的交互 前面两篇学习笔记分别介绍了IRP和IO_STACK_LOCATION,整个设备栈来处理这个IRP,但是每个设 ...

  9. Qml学习笔记:cpp与qml的交互调用方式

    Qml学习笔记:cpp与qml的交互调用方式 如何用在cpp中调用qml的方法 main.qml main.cpp 如何在qml中调用C++的方法函数 main.cpp main.qml 如何使用qm ...

  10. uniapp 学习笔记二十七 购物车总价计算及弹窗交互逻辑完善

    uniapp 学习笔记二十七 购物车总价计算及弹窗交互逻辑完善 uniapp 学习笔记二十七 购物车总价计算及弹窗交互逻辑完善 cart.vue <template><view> ...

最新文章

  1. Java如何接收前端传来的多层嵌套的复杂json串
  2. cctype,string,vector
  3. 使用mybatis出现异常:invalid comparison: java.time.LocalDateTime and java.lang.String
  4. python处理excel可视化_python如何将excel数据处理可视化
  5. java语言程序设计教程翁恺第二版课后答案_《JAVA语言程序设计教程(第2版)/翁恺 肖少拥》翁恺,肖少拥著【摘要 书评 在线阅读】-苏宁易购图书...
  6. 同事1000行又臭又长 的类!被我用IDEA几分钟重构!真香!
  7. matlab 输入时间,求助:在MATLAB里如何输入时间序列中的时间
  8. WPF中使用Aforge控件
  9. ML笔记 - 自然语言处理常用技术
  10. vue打包后hbuilder和cordova模拟器运行一片空白
  11. matlab double 取值,matlab定积分计算结果为表达式,我只想得到数值。用double(ans)也没用,不知道还有没有其他方法!...
  12. @property详细解读
  13. 计算机视觉 图像形成 几何图形和变换
  14. 引进国外SD-WAN技术,凌锐蓝信为企业提供跨境网络连接服务
  15. Rust代码检查工具Clippy原理浅析
  16. 如何进行需求测试/需求评审
  17. 用VISP+Opencv做相机到机械臂的标定
  18. 怎么用python制作随机点名软件_如何用python编写一个简易的随机点名软件?
  19. 九零起航服务器(港澳服务器) 如何设置404页面
  20. UseCase事件流描述规范

热门文章

  1. 第4讲 The Zend Framework MVC Architecture
  2. web.xml 详解
  3. 2018.12.12 第九章虚拟内存
  4. Scrapy(一)爬知乎所有用户信息
  5. RabbitMQ实战:理解消息通信
  6. ubuntu下从软件中心安装软件时的软件缓存目录
  7. remoting 中事件找不到订阅者时引发异常的解决办法
  8. 真倒霉,前不久分區表錯誤把我數據全部搞沒了
  9. Eclipse——在eclipse.ini文件中配置JDK
  10. Supervisor的安装与使用