OpenLayers学习笔记中级篇(六、地图交互)

OpenLayers学习——Style及StyleMap(二) 参考官网例子,做一个随比例一起缩放的矢量符号的 阅读详情

1、Feature选取之选中样式

<!doctype html>
<html xmlns=http://www.w3.org/1999/xhtml>
<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>修改矢量地图</title>
    <link href="css/ol.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="js/ol.js" charset="utf-8"></script>
</head>

<body>
	<div id="map2" style="width: 100%"></div>
<script type="text/javascript">
    var layer2 = new ol.layer.Vector({
        source: new ol.source.Vector(),
        // 注意:把feature上的style,直接移到layer上,避免直接在feature上设置style
        style: new ol.style.Style({
            image: new ol.style.Circle({
                radius: 10,
                fill: new ol.style.Fill({
                    color: 'red'
                })
            })
        })
    });
    var map2 = new ol.Map({
        layers: [
          new ol.layer.Tile({
            source: new ol.source.OSM()
          }), 
          layer2
        ],
        target: 'map2',
        view: new ol.View({
          center: ol.proj.transform(
              [104, 30], 'EPSG:4326', 'EPSG:3857'),
          zoom: 10
        })
    });

    // 在地图上添加一个圆
    var circle2 = new ol.Feature({
        geometry: new ol.geom.Point(ol.proj.transform(
              [104, 30], 'EPSG:4326', 'EPSG:3857'))
    })
    // 此处不再为feature设置style
    layer2.getSource().addFeature(circle2);

    // 添加一个用于选择Feature的交互方式
    map2.addInteraction(new ol.interaction.Select({
        // 设置选中后的style
        style: new ol.style.Style({
            image: new ol.style.Circle({
                radius: 10,
                fill: new ol.style.Fill({
                    color: 'blue'
                })
            })
        })
    }));
</script>
</body>

</html>

大家可以自己运行看一下效果!

2、Feature选取之条件过滤

涉及到选取,自然会有各种条件用于过滤,比如是鼠标左键单击,还是双击,是可以选取地图上的任意feature,还是某一类的feature。 对于这些需求,ol.interaction.Select都能满足,在API的文档里面就有相关的参数设置,下面就是一些简单的使用示例。

一、改变默认的单击选取方式

默认情况下,是支持鼠标左键单击选取feature的,在地图上其他地方点击一下,就取消选取了,但这并不是定死的选取方式,你完全可以自定义。 比如鼠标移动到feature上,就选取了,试试:

<!doctype html>
<html xmlns=http://www.w3.org/1999/xhtml>
<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>修改矢量地图</title>
    <link href="css/ol.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="js/ol.js" charset="utf-8"></script>
</head>

<body>
	<div id="map2" style="width: 100%"></div>
<script type="text/javascript">
    var layer2 = new ol.layer.Vector({
        source: new ol.source.Vector(),
        // 注意:把feature上的style,直接移到layer上,避免直接在feature上设置style
        style: new ol.style.Style({
            image: new ol.style.Circle({
                radius: 10,
                fill: new ol.style.Fill({
                    color: 'red'
                })
            })
        })
    });
    var map2 = new ol.Map({
        layers: [
          new ol.layer.Tile({
            source: new ol.source.OSM()
          }), 
          layer2
        ],
        target: 'map2',
        view: new ol.View({
          center: ol.proj.transform(
              [104, 30], 'EPSG:4326', 'EPSG:3857'),
          zoom: 10
        })
    });

    // 在地图上添加一个圆
    var circle2 = new ol.Feature({
        geometry: new ol.geom.Point(ol.proj.transform(
              [104, 30], 'EPSG:4326', 'EPSG:3857'))
    })
    // 此处不再为feature设置style
    layer2.getSource().addFeature(circle2);

    // 添加一个用于选择Feature的交互方式
    map2.addInteraction(new ol.interaction.Select({
    	 condition: ol.events.condition.pointerMove,
        // 设置选中后的style
        style: new ol.style.Style({
            image: new ol.style.Circle({
                radius: 10,
                fill: new ol.style.Fill({
                    color: 'blue'
                })
            })
        })
    }));
</script>
</body>

</html>


大家可以测试一下,在我们把鼠标移动feature时会改变feature的颜色,移开时会回复原来的颜色!

二、我们也可以直接对feature过滤

<!doctype html>
<html xmlns=http://www.w3.org/1999/xhtml>
<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>修改矢量地图</title>
    <link href="css/ol.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="js/ol.js" charset="utf-8"></script>
</head>

<body>
	<div id="map2" style="width: 100%"></div>
<script type="text/javascript">
    // 创建一个用于存放circle的layer
    var 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的layer
    var 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>
</body>

</html>


先看一下效果:

我们只希望用户能选取圆形,而不能选取五星,而上面的功能完美契合!

3、取消feature选中

取消选中有两种方式, 一种是在界面上以交互的方式取消选中,一种是用代码的方式取消选中,下面就分别介绍一下:

交互方式取消选中

如果是采用的默认的方式选取feature,即使用鼠标左键单击feature就可选取。那么这种交互方式下,要取消选中,则只需要同样使用鼠标左键,在地图其他地方单击一下,就可取消选中。 

如果采用的是自定义的方式选取feature,那么要取消选中,交互方式还是一样的,只要目标不再是已选中的feature就行,就能取消选中。 比如要素选取之条件过滤中,采用了自定义的鼠标移入feature就可选中,要取消选中,只需要把鼠标移出feature即可。

代码方式取消选中

<!doctype html>
<html xmlns=http://www.w3.org/1999/xhtml>
<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>修改矢量地图</title>
    <link href="css/ol.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="js/ol.js" charset="utf-8"></script>
</head>

<body>
	<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>
</body>

</html>



大家可以测试一下,应该是没有问题的!至此,地图上元素的选取相关的知识点都介绍完毕,希望能逐个掌握并融会贯通于实际应用中。下一节我们来学习地图开发中常用的功能,也就是咱们的高级篇了,大家加油!

 

OpenLayers 3 之 地图交互功能(interaction)详解 地图交互功能和上一篇讲的地图控件有些混淆,它们都控制着用户与地图的交互,区别是地图控件的触发都是一些可见的 HTML 元素触发,如按钮、链接等;而交互功能都是一些设备行为触发,都是不可见的,如鼠标双击、滚轮滑动等,手机设备的手指缩放等。      地图的交互功能包含很多,如地图双击放大,鼠标滚轮缩放,矢量要素点选,地图上绘制图形等等。只要是涉及到与地图的交互,就会涉及到 intercation ... 阅读详情

相关推荐

OpenLayers 3 之加载地图

摘要          一个加载地图的小例子,分析原理,并解析源码! 正文 例程如下: .map { height: 400px; width: 100%; } OpenLayers 3 example My Map

研究与专注 8966

openlayer 鼠标移动触发pointermove

注意:因为是判断要素id是不是同一个,所以当再次触发同一个id也不会发起网络请求,所以这儿使用定时器,一定时间把oldMMsi置为null。

在职可交流前端开发,包括:web端、uniapp等,欢迎指教。 1438

OpenLayers地图交互 -- 章节五:捕捉交互详解

本文深入解析OpenLayers中捕捉交互(SnapInteraction)的核心技术,为WebGIS开发提供精确的要素对齐解决方案。文章从基础配置到高级应用,详细介绍了:1)捕捉交互的基本原理与数据源配置;2)多种捕捉类型(顶点、边线等)的应用场景;3)交互组合与绘制功能的协同实现;4)高级功能包括智能捕捉系统、自适应精度控制和批量操作;5)性能优化与用户体验提升的最佳实践。通过完整的代码示例和参数说明,开发者可快速构建具备专业级精度的地理数据编辑系统。该技术可显著提升GIS应用的绘制准确性和数据一致性,

weixin_67093879的博客 1356

OpenLayers 3 事件应用

OpenLayers 3 事件应用 常用鼠标事件 地图鼠标左键单击事件 对应的类为ol.Map,事件名为singleclick。 地图鼠标左键双击事件 对应的类为ol.Map,事件名为dblclick。 地图鼠标点击事件 对应的类为ol.Map,事件名为click。 地图鼠标移动事件 对应的类为ol.Map,事件名为pointermove。 地图鼠标拖拽事件 对应的类为ol.Map,事件名为pointerdrag。

大树 2598

OpenLayers 3 之 加载百度地图

很多人想使用 OpenLayers 调用百度地图、腾讯地图等国内地图,本文就讨论一下其可能性和实现原理。我们以百度地图为例,分析其地图调用原理,我们都使用过百度地图,在网速不快的情况下,肯定有过感受,地图是一块一块加载的,从这里我们就可以看出,地图是被切成了很多块的小图片,调用时按照一定规则请求需要的“切片”,可视区域以外的“切片”不加载,这样可以减小数据传输数据量,使地图加载更快。

研究与专注 3万+

049:vue+openlayers 鼠标pointermove显示城市名片

本示例的目的是介绍演示如何在vue+openlayers中采用overlay实现城市名片的效果,移动鼠标到相应的位置点,出现城市的信息。

大剑师兰特的GIS世界 2959

OpenLayers基础教程——地图交互之绘制图形

1、前言 前面的博客其实已经介绍过了如何在openlayers中绘制图形,不过那是基于已有的坐标进行绘制。很多时候,用户往往需要使用鼠标自行在地图上进行图形绘制,这就涉及到了openlayers中的地图交互功能,下面开始介绍。 2、绘制基础图形 在openlayers中,实现地图交互的类是ol.interaction,默认情况下,openlayers只支持Point(点)、LineString(线)、Polygon(面)、Circle(圆)这四种基本图形。下面一段代码实现了这四种基本图形的绘制: <!

HerryDong的博客 5701

Openlayers 教程 03 - Style 样式演示 - 基础样式、标签文本(label)、标签背景和边框、渐变色等

Openlayers 对样式的控制是通过一个通用的样式对象 Style,图层(Layer)和图形要素(Feature)都可以设置 Style 对象,来展示想要的结果。

非科班Java出身GISer的博客 7224

openlayers6【六】地图交互 interaction详解

文章目录1. 什么是地图交互 interaction ???2. 简述地图交互 interaction3. interaction 介绍4. interaction defaults - 默认添加的交互功能5. 栗子:dragrotateandzoom (shift + 鼠标拖拽进行缩放和旋转地图)6. 写在最后 1. 什么是地图交互 interaction ??? 地图交互功能都是不可见的,如鼠标双击、滚轮滑动等,手机设备的手指缩放等。 地图的交互功能包含很多,如地图双击放大,鼠标滚轮缩放,矢量要素点选,

@必意玲 6461

SPSS27 paired t-test 中的Cohen’s D – Effect Size for T-Test

两组数据是相关的且是连续的。

moonlightpeng的博客 909

基因家族扩张收缩分析可视化(CAFE5)

CafePlotter 是一个用于可视化 CAFE5 基因家族扩张收缩分析结果的 Python 工具

xuzhougeng blog 3637

OpenLayers学习笔记中级篇(一、各种地图的加载)

学习了前面的初级篇,相信大家对OplenLayers已经有了一个初步的认识,下面我们再继续深入学习OpenLayers的相关功能! 我们这节主要是加载各种各样的地图,包括在线服务的地图,比如天地图、高德、OSM等,还有一些我们自己使用地图服务器发布的地图,比如使用Geoserver发布的wms地图服务,最后还介绍了常用矢量地图数据的加载,好了,让我们开始吧! 首先我们再来深入学习一下Sourc...

MagicMHD的博客 4590

基于STM32F407的摄像头(不带FIFO的OV7670)图像采集及LCD显示实验-笔记整理

硬件说明 STM32F4开发板 stm32f4系列的芯片处理的能力可以说非常强大了的,而且内部还自带有数字摄像头接口(DCMI),可以说stm32f407的核心板和不带FIFO的摄像头模块OV7670简直就是绝配! 我手上的这块张这个样子 (图片来源:某宝): F4系列的DCMI接口内部结构框图如下图3所示,具体的配置使用方式可以参考以下这篇博文:《stm32f4的数字摄像头接口(DCMI)使用》 这位博主大大已经很详细地介绍了DCMI接口的具体使用方法和原理,更重要的是里面还有接口的配置函数,虽然不完

LiangWF22的博客 2万+

OpenLayers学习笔记初级篇(一、地图加载)

开源的地图包做的比较优秀比较好的就是OpenLayers了,下面我将用我的学习笔记带领一些没接触过OpenLayers的同学进行学习,目前初步将学习笔记分为初级基础篇,中级进阶篇和高级应用篇,我将通过一个个小的demo进行学习,比较有助于大家加深记忆和动手编码能力,下面我们进行初级基础的学习! 1、OpenLayers 3简介 OpenLayers 3简称ol3,它是一个开源的Web GIS引...

MagicMHD的博客 3205

手把手教你配置SAP EWM HU类型及号段分配(含常见错误排查)

本文详细介绍了SAP EWM系统中HU类型及号段分配的配置方法,包括环境准备、包材主数据配置、存储类型关联及号段管理。通过实战案例和常见错误排查,帮助用户高效完成HU配置,提升仓储管理效率。重点讲解了EWM后台配置和号段配置的关键步骤与技巧。

weixin_33670786的博客 443

echarts实现3D地图——map3D

【代码】echarts实现3D地图——map3D。

xiaoququ的博客 7322

openlayers [六] 地图交互 interaction 详解

doubleclickzoom ,双击放大交互功能;draganddrop ,以“拖文件到地图中”的交互添加图层;dragbox,拉框,用于划定一个矩形范围,常用于放大地图;dragpan ,拖拽平移地图;dragrotateandzoom,拖拽方式进行缩放和旋转地图;dragrotate ,拖拽方式旋转地图;dragzoom ,拖拽方式缩放地图;draw,绘制地理要素功能;keyboardpan ,键盘方式平移地图;keyboardzoom ,键盘方式缩放地图;

爱玩亚索的程序员 2066

【嘉立创EDA】PCB 多层板如何交换内层,4层板交换板层

本文使用嘉立创EDA,描述如何在PCB设计时,如何交换各个板层,特别是4层板需要交换内层时,应该如何操作,以供有需要的读者参考。

l64481000的博客 2013

openlayers 入门教程(六):controls 篇

控件是一个可见的小部件,其 DOM 元素位于屏幕上的固定位置。 它们可以涉及用户输入(按钮),或者仅提供信息; 位置是使用 CSS 确定的。 默认情况下,它们放置在 CSS 类名为 ol-overlay container-stop event 的容器中,但可以使用任何外部 DOM 元素。

大剑师兰特的GIS世界 4535

基于Simulink与MATLAB的七轴OpenArm机械臂逆运动学仿真与轨迹规划完整指南

本文详细介绍了七自由度OpenArm机械臂在MATLAB/Simulink环境下的运动学仿真与轨迹规划实现方法。首先建立了机械臂的DH参数模型,验证了正运动学计算;随后提出了两种逆运动学求解算法(数值迭代法和臂型角参数化解析法)的MATLAB实现方案;最后在Simulink中搭建了完整的轨迹规划与控制系统。研究解决了七自由度冗余机械臂特有的多解性、奇异性和关节限位约束等核心问题,为OpenArm机械臂的运动控制提供了完整的技术方案和可运行代码实现。

AI的内部世界的博客 681

【Android逆向工程】第17章:反调试与反 Hook 对抗技术

本文介绍了Android应用常见的反调试技术及其对抗策略。主要内容包括: 反调试技术概述 分类:进程检测(ptrace、TracerPid)、文件检测、行为检测(时间/断点)、内存检测、框架检测 对抗思路:识别检测点→Hook检测函数→修改返回值→隐藏工具特征 ptrace检测实现 原理:利用ptrace系统调用检测调试器附加 实现方式:直接检测、持续线程检测、fork子进程检测 绕过方法:Frida Hook ptrace函数返回0,或使用LD_PRELOAD注入假函数 综合防护 涉及多种检测技术的组合使

w987333120的博客 359

OpenLayers 之 地图交互功能(interaction)详解,openlayers百度地图

转自:http://www.bkjia.com/webzh/1003573.html 地图交互功能和上一篇讲的地图控件有些混淆,它们都控制着用户与地图的交互,区别是地图控件的触发都是一些可见的 HTML 元素触发,如按钮、链接等;而交互功能都是一些设备行为触发,都是不可见的,如鼠标双击、滚轮滑动等,手机设备的手指缩放等。       地图的交互功能包含很多,如地图双击放大,

Drip 7809

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OpenLayers地图交互 -- 章节十二:键盘平移交互详解

本文深入解析OpenLayers中的键盘平移交互技术,重点介绍如何通过方向键实现地图精确导航。文章从基础配置入手,详细讲解键盘平移的创建、激活条件和移动参数设置,并展示三种典型应用场景:智能导航系统(支持精确/快速/标准模式)、无障碍访问优化(语音播报+视觉反馈)和游戏化控制(WASD键+动量效果)。同时提供性能优化和用户体验增强的实用建议,包括节流控制、焦点管理和反馈系统等。这些技术能为专业用户提供精确控制,为障碍用户提升可访问性,为游戏应用带来流畅操作,是构建全面WebGIS应用的重要交互补充。

weixin_67093879的博客 1990

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

OpenLayers3, 设置地图背景

本文基于OpenLayers3,实现地图加入背景图的功能。以上为基于openlayer3 实现设置地图背景图的简单案例,希望对您有帮助~

我哎GIS博客 1802

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OpenLayers学习笔记高级篇(一、openlayers画点线面)

话不多说直接上代码: <!doctype html> <html xmlns=http://www.w3.org/1999/xhtml> <head> <meta http-equiv=Content-Type content="text/html;charset=utf-8"> <met...

MagicMHD的博客 4715
上一篇: OpenLayers学习笔记中级篇(五、地图事件)
下一篇: OpenLayers学习笔记高级篇(一、openlayers画点线面)
MagicMHD
博客等级 码龄9年 503粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值