精华内容
下载资源
问答
  • OpenLayers 3 之 地图交互功能(interaction)详解

    万次阅读 热门讨论 2015-05-21 09:07:28
    交互功能都是一些设备行为触发,都是不可见的,如鼠标双击、滚轮滑动等,手机设备的手指缩放等。 地图的交互功能包含很多,如地图双击放大,鼠标滚轮缩放,矢量要素点选,地图上绘制图形等等。只要是涉及到与地图...

          地图交互功能和上一篇讲的地图控件有些混淆,它们都控制着用户与地图的交互,区别是地图控件的触发都是一些可见的 HTML 元素触发,如按钮、链接等;而交互功能都是一些设备行为触发,都是不可见的,如鼠标双击、滚轮滑动等,手机设备的手指缩放等。

          地图的交互功能包含很多,如地图双击放大,鼠标滚轮缩放,矢量要素点选,地图上绘制图形等等。只要是涉及到与地图的交互,就会涉及到 intercation 类,它定义了用户与地图进行交互的基本要素和事件。下面我们就来看看用户与地图都有那些交互,怎么交互。

    注: ‘自定义用户交互类型’,‘定制化交互’ 或者 ‘交互优化’ 都超出了本文范围。

    有问题可以留言评论或者给我发邮件! qingyafan@163.com

    一、interaction 介绍

          在 OpenLayers 3 中,表达交互功能的基类是 interaction,它是一个虚基类,不负责实例化,交互功能都继承该基类, OpenLayers 3 中可实例化的子类及其功能如下:

    • doubleclickzoom interaction,双击放大交互功能;
    • draganddrop interaction,以“拖文件到地图中”的交互添加图层;
    • dragbox interaction,拉框,用于划定一个矩形范围,常用于放大地图;
    • dragpan interaction,拖拽平移地图;
    • dragrotateandzoom interaction,拖拽方式进行缩放和旋转地图;
    • dragrotate interaction,拖拽方式旋转地图;
    • dragzoom interaction,拖拽方式缩放地图;
    • draw interaction,绘制地理要素功能;
    • interaction defaults ,规定了默认添加的交互功能;
    • keyboardpan interaction,键盘方式平移地图;
    • keyboardzoom interaction,键盘方式缩放地图;
    • select interaction,选择要素功能;
    • modify interaction,更改要素;
    • mousewheelzoom interaction,鼠标滚轮缩放功能;
    • pinchrotate interaction,手指旋转地图,针对触摸屏;
    • pinchzoom interaction,手指进行缩放,针对触摸屏;
    • pointer interaction,鼠标的用户自定义事件基类;
    • snap interaction,鼠标捕捉,当鼠标距离某个要素一定距离之内,自动吸附到要素。

    二、交互功能的种类和使用方法

    1. interaction defaults - 默认添加的交互功能

    该类规定了默认包含在地图中的功能,主要是最为常用的功能,如缩放、平移和旋转地图等,具体功能有如下这些:

    • ol.interaction.DragRotate,鼠标拖拽旋转,一般配合一个键盘按键辅助;
    • ol.interaction.DragZoom,鼠标拖拽缩放,一般配合一个键盘按键辅助;
    • ol.interaction.DoubleClickZoom,鼠标或手指双击缩放地图;
    • ol.interaction.PinchRotate,两个手指旋转地图,针对触摸屏;
    • ol.interaction.PinchZoom,两个手指缩放地图,针对触摸屏;
    • ol.interaction.DragPan,鼠标或手指拖拽平移地图;
    • ol.interaction.KeyboardZoom,使用键盘 +- 按键进行缩放;
    • ol.interaction.KeyboardPan,使用键盘方向键平移地图;
    • ol.interaction.MouseWheelZoom,鼠标滚轮缩放地图。

    可以看出,很多都兼容移动设备的触摸屏,键盘,鼠标事件,这就是OpenLayers 3的改进,跨平台改进。这些功能都是默认添加的,如果要更改默认的选项,需要在相应的选项设置为 false。如果想去掉默认的 DoubleClickZoom 功能,配置如下:

    interactions: ol.interaction.defaults([
        doubleClickZoom: false
    ]),

    这样就去除了双击放大功能,去除其他的默认功能,是一样的。

    2. draw interaction - 绘图功能

    绘图交互允许绘制几何地理要素,可选参数为一个对象,包含参数如下:

    /**
     * @typedef {{features: (ol.Collection.<ol.Feature>|undefined),
     *     source: (ol.source.Vector|undefined),
     *     snapTolerance: (number|undefined),
     *     type: ol.geom.GeometryType,
     *     minPointsPerRing: (number|undefined),
     *     style: (ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined),
     *     geometryName: (string|undefined),
     *     condition: (ol.events.ConditionType|undefined)}}
     * @api
     */
    • features,绘制的要素的目标集合;
    • source,绘制的要素的目标图层来源,即目标图层的 source属性 ;
    • snapTolerance,自动吸附完成点的像素距离,也就是说当鼠标位置距离闭合点小于该值设置的时候,会自动吸附到闭合点,默认值是 12;
    • type,绘制的地理要素类型,ol.geom.GeometryType类型,包含 PointLineStringPolygonMultiPointMultiLineString 或者 MultiPolygon
    • minPointsPerRing,绘制一个多边形需要的点数最小值,数值类型,默认是 3
    • style,要素素描的样式,是 ol.style.Style对象之一;
    • geometryName,绘制的地理要素的名称,string类型;
    • condition,一个函数,接受一个ol.MapBrowserEvent类型的参数,返回一个布尔值表示是否应该调用事件处理函数。默认情况下,增加一个顶点,类型为 ol.events.ConditionType

    给地图添加该交互功能,首先需要实例化一个ol.interaction.Draw,必须指定 sourcetype属性:

        var draw = new ol.interaction.Draw({
          source: source,
          type: "Polygon"
        });

    然后将该功能添加到地图中map.addInteraction(draw)

    这里我们在页面中添加一个 HTML select 元素,通过选择要素类型,绘制相应的要素类型:

    <select id="type">
      <option value="None">None</option>
      <option value="LineString">LineString</option>
      <option value="Polygon">Polygon</option>
    </select>

    定义一个函数用于添加该交互功能:

    var typeSelect = document.getElementById('type');
    
    var draw; // global so we can remove it later
    function addInteraction() {
      var value = typeSelect.value;
      if (value !== 'None') {
        draw = new ol.interaction.Draw({
          source: source,
          type: value
        });
        map.addInteraction(draw);
      }
    }

    绑定select值变化触发的事件:

    typeSelect.onchange = function(e) {
      map.removeInteraction(draw);
      addInteraction();
    };

    最后首先执行绑定函数addInteraction();,然后点击鼠标进行绘制:

    这里写图片描述

    绘制LineString

    这里写图片描述

    绘制Polygon

    这里只是使用 LineStringPloygon 做了例子,还有 PointCircle 可以使用。对该类稍微定制,就可以定制绘制的图形,如箭头,这个就可以用于动态标绘系统,使用WFS协议和服务器建立通讯。

    3. dragrotateandzoom interaction - 鼠标拖拽进行缩放和旋转地图

    拖拽实现旋转和缩放地图的功能。首先定义该交互对象:

    /* *
     * 定义地图的交互功能
     */
     var interactions = ol.interaction.defaults().extend([
        new ol.interaction.DragRotateAndZoom()
     ]);

    然后在 map 中加入交互对象:

    这里写图片描述

          这个功能的使用方法是首先按住键盘的 shift 按钮,然后使用鼠标点住地图一点,然后拖拽鼠标围绕地图中心旋转,地图就会选择相应的角度;如果拖拽鼠标远离地图中心,就会实现地图的放大,靠近地图中心,地图就会缩小。

          该功能是两个单独功能的合体: dragzoom 和 dragrotate,一个负责拖拽缩放,一个负责拖拽旋转,和以上的功能一样,就不再赘述了。

    4. dragbox interaction - 拉框交互

          在地图上拉出一个矩形框,一般配合使用一个辅助按键,如Shift,常用于放大功能。该功能是默认添加在地图中的,默认情况下,按下Shift,然后拖动鼠标拉框,然后地图就会将框内内容放大。

    拉框

    放大结果

    5. draganddrop interaction - 拖拽文件到地图

          将空间数据使用鼠标或者手指拖拽到地图中,解析成一个图层添加到地图中。目前只支持矢量数据,未来可能支持更多的空间数据格式。目前,支持的格式包括 GeoJSON, GML, KML, GPX, OSMXML, TopoJSONIGC。首先实例化一个 draganddrop interaction:

    var dragAndDropInteraction = new ol.interaction.DragAndDrop({
      formatConstructors: [
        ol.format.GeoJSON,
        ol.format.KML
      ]
    });

    formatConstructors 表示想要支持的格式,这里我选择了支持两种常见的格式:GeoJSONKML,然后将该交互添加到地图中:

     var interactions = ol.interaction.defaults().extend([
        new ol.interaction.DragRotateAndZoom(),
        dragAndDropInteraction
     ]);

          如果想在添加数据的时候定义一些额外行为,比如缩放到添加到数据的范围,需要注册 interaction 的事件-dragAndDropInteraction.on('addfeatures', function(event) {});, 以下为拖拽一个KML文件到地图中:

    这里写图片描述

    这里写图片描述

    6. keyboard interaction - 键盘交互功能

          包含 ol.interaction.KeyboardZoomol.interaction.KeyboardPan,分别是键盘缩放和键盘平移。默认添加到地图中,但是只有当焦点在包含地图的 HTML 元素上,才可用。可以通过修改 ol.MapkeyboardEventTarget 属性,修改键盘事件的关联 HTML 元素。

      ol.interaction.KeyboardZoom,使用键盘+- 进行地图缩放;ol.interaction.KeyboardPan,使用方向键平移地图。

    7. modify 和 select interaction

          select 就像名字暗示的一样,是用来选中要素的;而 modify 是修改要素的,主要是通过拖拽方式修改点的坐标。

    这里写图片描述

    选中后的原图

    这里写图片描述

    拖拽几个点后效果

    模拟选中并修改要素的交互功能需要添加如下代码:

    var select = new ol.interaction.Select();
    var moddify = new ol.interaction.Modify({
        features:select.getFeatures()
    });

    features:select.getFeatures()目的为修改选中的要素。 然后将两个交互功能添加到 map 中就可以使用其功能了。

    8. pinchrotate ,pinchzoom interaction - 两个手指缩放和旋转地图

    这两个功能针对触摸屏,两个手指按住地图,增减距离来实现缩放,旋转手指,地图跟着旋转。默认添加到地图中。

    9. pointer interaction - 自定义鼠标事件

          针对鼠标的行为按下(Down)、移动(Move)和抬起(Up),自定义事件。这三个事件发生有先后顺序,首先是触发按下,之后是移动事件,最后是抬起事件。只要配置相关的属性,包含handleDownEventhandleDragEventhandleMoveEventhandleUpEvent分别对应鼠标的 downdragmoveup四种事件。例如配置鼠标的按下左键事件,当按下鼠标左键时候,就会触发 functionName函数 :

    new ol.interaction.Pointer({
        handleDownEvent: functionName
    })

    10. snap interaction - 鼠标捕捉

    当修改和绘制矢量要素时,鼠标距离某个要素一定距离之内,自动吸附到要素。

    这里写图片描述

    再靠近就会吸附到黄色的点

    这里写图片描述

    可以配置的选项有 具有捕捉吸附功能的要素集 或者 矢量图层发生捕捉的最大距离(像素为单位),使用方法如下:

    new ol.interaction.Snap({
        features: 要素集(ol.Collection),
        pixelTolerance: 捕捉发生的距离,像素数,默认为10,
        source: 具有捕捉功能的图层(ol.source.Vector)
    })

    三、总结

          交互功能比较多,主要涉及用户与地图交互需要的基本功能:缩放、平移拖拽、旋转,为了提高兼容性,除了针对鼠标和键盘的交互,还有针对触摸屏的缩放、旋转和平移拖拽。

          比较有用的有勾绘draw、选择要素selectmodify、捕捉吸附snap 和 鼠标自定义事件pointer。这些交互功能可以共同构建一个动态标绘系统,在客户端增加或者修改空间数据,提交给服务器,更新数据。

    OK,写完了。

    有问题可以留言评论或者给我发邮件! qingyafan@163.com

    展开全文
  • 地图交互功能和上一篇讲的地图控件有些混淆,它们都控制着用户与地图的交互,区别是地图控件的触发都是一些可见的 HTML 元素触发,如按钮、链接等;... 地图的交互功能包含很多,如地图双击放大,

    转自:http://www.bkjia.com/webzh/1003573.html


    地图交互功能和上一篇讲的地图控件有些混淆,它们都控制着用户与地图的交互,区别是地图控件的触发都是一些可见的 HTML 元素触发,如按钮、链接等;而交互功能都是一些设备行为触发,都是不可见的,如鼠标双击、滚轮滑动等,手机设备的手指缩放等。

          地图的交互功能包含很多,如地图双击放大,鼠标滚轮缩放,矢量要素点选,地图上绘制图形等等。只要是涉及到与地图的交互,就会涉及到 intercation 类,它定义了用户与地图进行交互的基本要素和事件。下面我们就来看看用户与地图都有那些交互,怎么交互。

    注: ‘自定义用户交互类型’,‘定制化交互’ 或者 ‘交互优化’ 都超出了本文范围。

    有问题可以留言评论或者给我发邮件! qingyafan@163.com

    一、interaction 介绍

          在 OpenLayers 3 中,表达交互功能的基类是 interaction,它是一个虚基类,不负责实例化,交互功能都继承该基类, OpenLayers 3 中可实例化的子类及其功能如下:

    • doubleclickzoom interaction,双击放大交互功能;
    • draganddrop interaction,以“拖文件到地图中”的交互添加图层;
    • dragbox interaction,拉框,用于划定一个矩形范围,常用于放大地图;
    • dragpan interaction,拖拽平移地图;
    • dragrotateandzoom interaction,拖拽方式进行缩放和旋转地图;
    • dragrotate interaction,拖拽方式旋转地图;
    • dragzoom interaction,拖拽方式缩放地图;
    • draw interaction,绘制地理要素功能;
    • interaction defaults ,规定了默认添加的交互功能;
    • keyboardpan interaction,键盘方式平移地图;
    • keyboardzoom interaction,键盘方式缩放地图;
    • select interaction,选择要素功能;
    • modify interaction,更改要素;
    • mousewheelzoom interaction,鼠标滚轮缩放功能;
    • pinchrotate interaction,手指旋转地图,针对触摸屏;
    • pinchzoom interaction,手指进行缩放,针对触摸屏;
    • pointer interaction,鼠标的用户自定义事件基类;
    • snap interaction,鼠标捕捉,当鼠标距离某个要素一定距离之内,自动吸附到要素。

    二、交互功能的种类和使用方法

    1. interaction defaults - 默认添加的交互功能

    该类规定了默认包含在地图中的功能,主要是最为常用的功能,如缩放、平移和旋转地图等,具体功能有如下这些:

    • ol.interaction.DragRotate,鼠标拖拽旋转,一般配合一个键盘按键辅助;
    • ol.interaction.DragZoom,鼠标拖拽缩放,一般配合一个键盘按键辅助;
    • ol.interaction.DoubleClickZoom,鼠标或手指双击缩放地图;
    • ol.interaction.PinchRotate,两个手指旋转地图,针对触摸屏;
    • ol.interaction.PinchZoom,两个手指缩放地图,针对触摸屏;
    • ol.interaction.DragPan,鼠标或手指拖拽平移地图;
    • ol.interaction.KeyboardZoom,使用键盘 + 和 - 按键进行缩放;
    • ol.interaction.KeyboardPan,使用键盘方向键平移地图;
    • ol.interaction.MouseWheelZoom,鼠标滚轮缩放地图。

    可以看出,很多都兼容移动设备的触摸屏,键盘,鼠标事件,这就是OpenLayers 3的改进,跨平台改进。这些功能都是默认添加的,如果要更改默认的选项,需要在相应的选项设置为 false。如果想去掉默认的 DoubleClickZoom 功能,配置如下:

    interactions: ol.interaction.defaults([
        doubleClickZoom: false
    ]),

    这样就去除了双击放大功能,去除其他的默认功能,是一样的。

    2. draw interaction - 绘图功能

    绘图交互允许绘制几何地理要素,可选参数为一个对象,包含参数如下:

    /**
     * @typedef {{features: (ol.Collection.<ol.Feature>|undefined),
     *     source: (ol.source.Vector|undefined),
     *     snapTolerance: (number|undefined),
     *     type: ol.geom.GeometryType,
     *     minPointsPerRing: (number|undefined),
     *     style: (ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined),
     *     geometryName: (string|undefined),
     *     condition: (ol.events.ConditionType|undefined)}}
     * @api
     */
    • features,绘制的要素的目标集合;
    • source,绘制的要素的目标图层来源,即目标图层的 source属性 ;
    • snapTolerance,自动吸附完成点的像素距离,也就是说当鼠标位置距离闭合点小于该值设置的时候,会自动吸附到闭合点,默认值是 12;
    • type,绘制的地理要素类型,ol.geom.GeometryType类型,包含 Point、 LineStringPolygonMultiPointMultiLineString 或者 MultiPolygon
    • minPointsPerRing,绘制一个多边形需要的点数最小值,数值类型,默认是 3
    • style,要素素描的样式,是 ol.style.Style对象之一;
    • geometryName,绘制的地理要素的名称,string类型;
    • condition,一个函数,接受一个ol.MapBrowserEvent类型的参数,返回一个布尔值表示是否应该调用事件处理函数。默认情况下,增加一个顶点,类型为 ol.events.ConditionType

    给地图添加该交互功能,首先需要实例化一个ol.interaction.Draw,必须指定 sourcetype属性:

        var draw = new ol.interaction.Draw({
          source: source,
          type: "Polygon"
        });

    然后将该功能添加到地图中map.addInteraction(draw)

    这里我们在页面中添加一个 HTML select 元素,通过选择要素类型,绘制相应的要素类型:

    <select id="type">
      <option value="None">None</option>
      <option value="LineString">LineString</option>
      <option value="Polygon">Polygon</option>
    </select>

    定义一个函数用于添加该交互功能:

    var typeSelect = document.getElementById('type');
    
    var draw; // global so we can remove it later
    function addInteraction() {
      var value = typeSelect.value;
      if (value !== 'None') {
        draw = new ol.interaction.Draw({
          source: source,
          type: value
        });
        map.addInteraction(draw);
      }
    }

    绑定select值变化触发的事件:

    typeSelect.onchange = function(e) {
      map.removeInteraction(draw);
      addInteraction();
    };

    最后首先执行绑定函数addInteraction();,然后点击鼠标进行绘制: 

    这里写图片描述

    绘制LineString

    这里写图片描述

    绘制Polygon

    这里只是使用 LineString 和 Ploygon 做了例子,还有 Point 和 Circle 可以使用。对该类稍微定制,就可以定制绘制的图形,如箭头,这个就可以用于动态标绘系统,使用WFS协议和服务器建立通讯。

    3. dragrotateandzoom interaction - 鼠标拖拽进行缩放和旋转地图

    拖拽实现旋转和缩放地图的功能。首先定义该交互对象:

     
    /* *
    * 定义地图的交互功能
    */
    var interactions = ol .interaction .defaults () .extend ([
    new ol .interaction .DragRotateAndZoom ()
    ]) ;

    然后在 map 中加入交互对象: 

    这里写图片描述

          这个功能的使用方法是首先按住键盘的 shift 按钮,然后使用鼠标点住地图一点,然后拖拽鼠标围绕地图中心旋转,地图就会选择相应的角度;如果拖拽鼠标远离地图中心,就会实现地图的放大,靠近地图中心,地图就会缩小。

          该功能是两个单独功能的合体: dragzoom 和 dragrotate,一个负责拖拽缩放,一个负责拖拽旋转,和以上的功能一样,就不再赘述了。

    4. dragbox interaction - 拉框交互

          在地图上拉出一个矩形框,一般配合使用一个辅助按键,如Shift,常用于放大功能。该功能是默认添加在地图中的,默认情况下,按下Shift,然后拖动鼠标拉框,然后地图就会将框内内容放大。

    拉框

    放大结果

    5. draganddrop interaction - 拖拽文件到地图

          将空间数据使用鼠标或者手指拖拽到地图中,解析成一个图层添加到地图中。目前只支持矢量数据,未来可能支持更多的空间数据格式。目前,支持的格式包括 GeoJSONGMLKMLGPX,OSMXMLTopoJSON 和 IGC。首先实例化一个 draganddrop interaction:

     
    var dragAndDropInteraction = new ol .interaction .DragAndDrop({
    formatConstructors: [
    ol .format .GeoJSON ,
    ol .format .KML
    ]
    }) ;

    formatConstructors 表示想要支持的格式,这里我选择了支持两种常见的格式:GeoJSON 和 KML,然后将该交互添加到地图中:

     
    var interactions = ol .interaction .defaults() .extend([
    new ol .interaction .DragRotateAndZoom (),
    dragAndDropInteraction
    ]) ;

          如果想在添加数据的时候定义一些额外行为,比如缩放到添加到数据的范围,需要注册 interaction 的事件-dragAndDropInteraction.on('addfeatures', function(event) {});, 以下为拖拽一个KML文件到地图中:

    这里写图片描述

    这里写图片描述

    6. keyboard interaction - 键盘交互功能

          包含 ol.interaction.KeyboardZoom 和 ol.interaction.KeyboardPan,分别是键盘缩放和键盘平移。默认添加到地图中,但是只有当焦点在包含地图的 HTML 元素上,才可用。可以通过修改ol.Map 的 keyboardEventTarget 属性,修改键盘事件的关联 HTML 元素。

      ol.interaction.KeyboardZoom,使用键盘+ 和 - 进行地图缩放;ol.interaction.KeyboardPan,使用方向键平移地图。

    7. modify 和 select interaction

          select 就像名字暗示的一样,是用来选中要素的;而 modify 是修改要素的,主要是通过拖拽方式修改点的坐标。

    这里写图片描述

    选中后的原图

    这里写图片描述

    拖拽几个点后效果

    模拟选中并修改要素的交互功能需要添加如下代码:

     
    var select = new ol .interaction . Select();
    var moddify = new ol . interaction . Modify({
    features: select . getFeatures()
    });

    features:select.getFeatures()目的为修改选中的要素。 然后将两个交互功能添加到 map 中就可以使用其功能了。

    8. pinchrotate ,pinchzoom interaction - 两个手指缩放和旋转地图

    这两个功能针对触摸屏,两个手指按住地图,增减距离来实现缩放,旋转手指,地图跟着旋转。默认添加到地图中。

    9. pointer interaction - 自定义鼠标事件

          针对鼠标的行为按下(Down)、移动(Move)和抬起(Up),自定义事件。这三个事件发生有先后顺序,首先是触发按下,之后是移动事件,最后是抬起事件。只要配置相关的属性,包含handleDownEventhandleDragEventhandleMoveEventhandleUpEvent分别对应鼠标的downdragmoveup四种事件。例如配置鼠标的按下左键事件,当按下鼠标左键时候,就会触发functionName函数 :

     
    new ol .interaction .Pointer( {
    handleDownEvent: functionName
    })

    10. snap interaction - 鼠标捕捉

    当修改和绘制矢量要素时,鼠标距离某个要素一定距离之内,自动吸附到要素。

    这里写图片描述

    再靠近就会吸附到黄色的点 

    这里写图片描述

    可以配置的选项有 具有捕捉吸附功能的要素集 或者 矢量图层发生捕捉的最大距离(像素为单位),使用方法如下:

     
    new ol .interaction .Snap({
    features: 要素集(ol .Collection ),
    pixelTolerance: 捕捉发生的距离,像素数,默认为 10
    source: 具有捕捉功能的图层(ol .source .Vector )
    })

    三、总结

          交互功能比较多,主要涉及用户与地图交互需要的基本功能:缩放、平移拖拽、旋转,为了提高兼容性,除了针对鼠标和键盘的交互,还有针对触摸屏的缩放、旋转和平移拖拽。

          比较有用的有勾绘draw、选择要素selectmodify、捕捉吸附snap 和 鼠标自定义事件pointer。这些交互功能可以共同构建一个动态标绘系统,在客户端增加或者修改空间数据,提交给服务器,更新数据。

    OK,写完了。

    展开全文
  • 2019年2月 已经是openLayer5.x 了。所以这篇文章的内容有点旧,但是实际内容还是有价值的。 转载: OpenLayers 3 之 地图交互功能(interaction)详解 2015年05月21日 ...而交互功能都是一些...

     

    2019年2月 已经是openLayer5.x 了。所以这篇文章的内容有点旧,但是实际内容还是有价值的。

    转载:

    OpenLayers 3 之 地图交互功能(interaction)详解

    2015年05月21日

          地图交互功能和上一篇讲的地图控件有些混淆,它们都控制着用户与地图的交互,区别是地图控件的触发都是一些可见的 HTML 元素触发,如按钮、链接等;而交互功能都是一些设备行为触发,都是不可见的,如鼠标双击、滚轮滑动等,手机设备的手指缩放等。

          地图的交互功能包含很多,如地图双击放大,鼠标滚轮缩放,矢量要素点选,地图上绘制图形等等。只要是涉及到与地图的交互,就会涉及到 intercation 类,它定义了用户与地图进行交互的基本要素和事件。下面我们就来看看用户与地图都有那些交互,怎么交互。

    注: ‘自定义用户交互类型’,‘定制化交互’ 或者 ‘交互优化’ 都超出了本文范围。

    有问题可以留言评论或者给我发邮件! qingyafan@163.com

    一、interaction 介绍

          在 OpenLayers 3 中,表达交互功能的基类是 interaction,它是一个虚基类,不负责实例化,交互功能都继承该基类, OpenLayers 3 中可实例化的子类及其功能如下:

    • doubleclickzoom interaction,双击放大交互功能;
    • draganddrop interaction,以“拖文件到地图中”的交互添加图层;
    • dragbox interaction,拉框,用于划定一个矩形范围,常用于放大地图;
    • dragpan interaction,拖拽平移地图;
    • dragrotateandzoom interaction,拖拽方式进行缩放和旋转地图;
    • dragrotate interaction,拖拽方式旋转地图;
    • dragzoom interaction,拖拽方式缩放地图;
    • draw interaction,绘制地理要素功能;
    • interaction defaults ,规定了默认添加的交互功能;
    • keyboardpan interaction,键盘方式平移地图;
    • keyboardzoom interaction,键盘方式缩放地图;
    • select interaction,选择要素功能;
    • modify interaction,更改要素;
    • mousewheelzoom interaction,鼠标滚轮缩放功能;
    • pinchrotate interaction,手指旋转地图,针对触摸屏;
    • pinchzoom interaction,手指进行缩放,针对触摸屏;
    • pointer interaction,鼠标的用户自定义事件基类;
    • snap interaction,鼠标捕捉,当鼠标距离某个要素一定距离之内,自动吸附到要素。

    二、交互功能的种类和使用方法

    1. interaction defaults - 默认添加的交互功能

    该类规定了默认包含在地图中的功能,主要是最为常用的功能,如缩放、平移和旋转地图等,具体功能有如下这些:

    • ol.interaction.DragRotate,鼠标拖拽旋转,一般配合一个键盘按键辅助;
    • ol.interaction.DragZoom,鼠标拖拽缩放,一般配合一个键盘按键辅助;
    • ol.interaction.DoubleClickZoom,鼠标或手指双击缩放地图;
    • ol.interaction.PinchRotate,两个手指旋转地图,针对触摸屏;
    • ol.interaction.PinchZoom,两个手指缩放地图,针对触摸屏;
    • ol.interaction.DragPan,鼠标或手指拖拽平移地图;
    • ol.interaction.KeyboardZoom,使用键盘 + 和 - 按键进行缩放;
    • ol.interaction.KeyboardPan,使用键盘方向键平移地图;
    • ol.interaction.MouseWheelZoom,鼠标滚轮缩放地图。

    可以看出,很多都兼容移动设备的触摸屏,键盘,鼠标事件,这就是OpenLayers 3的改进,跨平台改进。这些功能都是默认添加的,如果要更改默认的选项,需要在相应的选项设置为 false。如果想去掉默认的 DoubleClickZoom 功能,配置如下:

    interactions: ol.interaction.defaults([
        doubleClickZoom: false
    ]),

    这样就去除了双击放大功能,去除其他的默认功能,是一样的。

    2. draw interaction - 绘图功能

    绘图交互允许绘制几何地理要素,可选参数为一个对象,包含参数如下:

    /**
     * @typedef {{features: (ol.Collection.<ol.Feature>|undefined),
     *     source: (ol.source.Vector|undefined),
     *     snapTolerance: (number|undefined),
     *     : ol.geom.GeometryType,
     *     minPointsPerRing: (number|undefined),
     *     style: (ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined),
     *     geometryName: (string|undefined),
     *     condition: (ol.events.ConditionType|undefined)}}
     * @api
     */
    • features,绘制的要素的目标集合;
    • source,绘制的要素的目标图层来源,即目标图层的 source属性 ;
    • snapTolerance,自动吸附完成点的像素距离,也就是说当鼠标位置距离闭合点小于该值设置的时候,会自动吸附到闭合点,默认值是 12;
    • type,绘制的地理要素类型,ol.geom.GeometryType类型,包含 Point、 LineString、 PolygonMultiPointMultiLineString 或者 MultiPolygon
    • minPointsPerRing,绘制一个多边形需要的点数最小值,数值类型,默认是 3
    • style,要素素描的样式,是 ol.style.Style对象之一;
    • geometryName,绘制的地理要素的名称,string类型;
    • condition,一个函数,接受一个ol.MapBrowserEvent类型的参数,返回一个布尔值表示是否应该调用事件处理函数。默认情况下,增加一个顶点,类型为 ol.events.ConditionType

    给地图添加该交互功能,首先需要实例化一个ol.interaction.Draw,必须指定 sourcetype属性:

        var draw = new ol.interaction.Draw({
          source: source,
          : "Polygon"
        });

    然后将该功能添加到地图中map.addInteraction(draw)

    这里我们在页面中添加一个 HTML select 元素,通过选择要素类型,绘制相应的要素类型:

    <select id="type">
      <option value="None">None</option>
      <option value="LineString">LineString</option>
      <option value="Polygon">Polygon</option>
    </select>

    定义一个函数用于添加该交互功能:

     typeSelect = document.getElementById('type');
    
     draw; // global so we can remove it later
    function addInteraction() {
       value = typeSelect.value;
       (value !== 'None') {
        draw =  ol.interaction.Draw({
          source: source,
          type: value
        });
        map.addInteraction(draw);
      }
    }

    绑定select值变化触发的事件:

    typeSelect.onchange = function {
      map.removeInteraction(draw);
      addInteraction();
    };

    最后首先执行绑定函数addInteraction();,然后点击鼠标进行绘制:

    这里写图片描述 
    绘制LineString 
    这里写图片描述 
    绘制Polygon

    这里只是使用 LineString 和 Ploygon 做了例子,还有 Point 和 Circle 可以使用。对该类稍微定制,就可以定制绘制的图形,如箭头,这个就可以用于动态标绘系统,使用WFS协议和服务器建立通讯。

    3. dragrotateandzoom interaction - 鼠标拖拽进行缩放和旋转地图

    拖拽实现旋转和缩放地图的功能。首先定义该交互对象:

    /* *
     * 定义地图的交互功能
     */
     var interactions = ol.interaction.defaults().extend([
        new ol.interaction.DragRotateAndZoom()
     ])

    然后在 map 中加入交互对象:

    这里写图片描述

          这个功能的使用方法是首先按住键盘的 shift 按钮,然后使用鼠标点住地图一点,然后拖拽鼠标围绕地图中心旋转,地图就会选择相应的角度;如果拖拽鼠标远离地图中心,就会实现地图的放大,靠近地图中心,地图就会缩小。

          该功能是两个单独功能的合体: dragzoom 和 dragrotate,一个负责拖拽缩放,一个负责拖拽旋转,和以上的功能一样,就不再赘述了。

    4. dragbox interaction - 拉框交互

          在地图上拉出一个矩形框,一般配合使用一个辅助按键,如Shift,常用于放大功能。该功能是默认添加在地图中的,默认情况下,按下Shift,然后拖动鼠标拉框,然后地图就会将框内内容放大。

    拉框

    放大结果

    5. draganddrop interaction - 拖拽文件到地图

          将空间数据使用鼠标或者手指拖拽到地图中,解析成一个图层添加到地图中。目前只支持矢量数据,未来可能支持更多的空间数据格式。目前,支持的格式包括 GeoJSONGMLKMLGPXOSMXMLTopoJSON 和 IGC。首先实例化一个 draganddropinteraction:

    var dragAndDropInteraction = new ol.interaction.DragAndDrop({
      formatConstructors: [
        ol.format.GeoJSON,
        ol.format
      ]
    })

    formatConstructors 表示想要支持的格式,这里我选择了支持两种常见的格式:GeoJSON 和 KML,然后将该交互添加到地图中:

     var interactions = ol.interaction.defaults().extend([
        new ol.interaction.DragRotateAndZoom(),
        dragAndDropInteraction
     ])

          如果想在添加数据的时候定义一些额外行为,比如缩放到添加到数据的范围,需要注册 interaction 的事件-dragAndDropInteraction.on('addfeatures', function(event) {});, 以下为拖拽一个KML文件到地图中:

    这里写图片描述

    这里写图片描述

    6. keyboard interaction - 键盘交互功能

          包含 ol.interaction.KeyboardZoom 和 ol.interaction.KeyboardPan,分别是键盘缩放和键盘平移。默认添加到地图中,但是只有当焦点在包含地图的 HTML 元素上,才可用。可以通过修改 ol.Map 的 keyboardEventTarget 属性,修改键盘事件的关联 HTML 元素。

      ol.interaction.KeyboardZoom,使用键盘+ 和 - 进行地图缩放;ol.interaction.KeyboardPan,使用方向键平移地图。

    7. modify 和 select interaction

          select 就像名字暗示的一样,是用来选中要素的;而 modify 是修改要素的,主要是通过拖拽方式修改点的坐标。

    这里写图片描述 
    选中后的原图

    这里写图片描述 
    拖拽几个点后效果

    模拟选中并修改要素的交互功能需要添加如下代码:

     select   ol.interaction.Select();
     moddify   ol.interaction.Modify({
        features:select.getFeatures()
    });

    features:select.getFeatures()目的为修改选中的要素。 然后将两个交互功能添加到 map 中就可以使用其功能了。

    8. pinchrotate ,pinchzoom interaction - 两个手指缩放和旋转地图

    这两个功能针对触摸屏,两个手指按住地图,增减距离来实现缩放,旋转手指,地图跟着旋转。默认添加到地图中。

    9. pointer interaction - 自定义鼠标事件

          针对鼠标的行为按下(Down)、移动(Move)和抬起(Up),自定义事件。这三个事件发生有先后顺序,首先是触发按下,之后是移动事件,最后是抬起事件。只要配置相关的属性,包含handleDownEventhandleDragEventhandleMoveEventhandleUpEvent分别对应鼠标的 downdragmoveup四种事件。例如配置鼠标的按下左键事件,当按下鼠标左键时候,就会触发 functionName函数 :

     .interaction.Pointer({
        handleDownEvent: functionName
    })

    10. snap interaction - 鼠标捕捉

    当修改和绘制矢量要素时,鼠标距离某个要素一定距离之内,自动吸附到要素。

    这里写图片描述

    再靠近就会吸附到黄色的点

    这里写图片描述

    可以配置的选项有 具有捕捉吸附功能的要素集 或者 矢量图层发生捕捉的最大距离(像素为单位),使用方法如下:

    new ol.interaction.Snap({
        features: 要素集(ol.Collection),
        pixelTolerance: 捕捉发生的距离,像素数,默认为,
        source: 具有捕捉功能的图层(ol.source.Vector)
    })

          交互功能比较多,主要涉及用户与地图交互需要的基本功能:缩放、平移拖拽、旋转,为了提高兼容性,除了针对鼠标和键盘的交互,还有针对触摸屏的缩放、旋转和平移拖拽。

          比较有用的有勾绘draw、选择要素selectmodify、捕捉吸附snap 和 鼠标自定义事件pointer。这些交互功能可以共同构建一个动态标绘系统,在客户端增加或者修改空间数据,提交给服务器,更新数据。

    OK,写完了。

     

     

     

     

     

     

     

     

    展开全文
  • 小程序 四种文件类型简介

    千次阅读 2019-12-17 19:25:52
    本文主要对微信小程序的四种文件类型做了大概介绍,更快的了解功能。 四种文件类型: .json后缀的JSON配置文件 .wxml后缀的WXML模板文件 .wxss后缀的WXSS样式文件 .js后缀的JS脚本逻辑文件 JSON配置: 一种...

    本文主要对微信小程序的四种文件类型做了大概介绍,更快的了解功能。

    四种文件类型:

    1. .json 后缀的 JSON 配置文件
    2. .wxml 后缀的 WXML 模板文件
    3. .wxss 后缀的 WXSS 样式文件
    4. .js 后缀的 JS 脚本逻辑文件

    JSON配置:

                 一种数据格式,不是编程语言,在小程序中,JSON扮演的静态配置的角色。

                 特殊文件

     所在目录用途参考
    app.json根目录全局配置页面路径、界面表现、网络超时时间、底部 tab 等小程序的配置 app.json 
    project.config.json根目录工具个性化的配置,可以copy到新环境还原个性化开发者工具的配置
    page.json模块目录单个页面展示效果的配置页面配置

    JSON文件中无法使用注释。

    看到这里可以看出json主要配置页面的展示效果,有点像页面工具。

    WXML模板

    类似于 网页(HTML+CSS+JS) 中的HTML。

    1.有和html一样功能的标签,比较方便的是有好多类似于日历、弹窗等等已经包装好的标签。参考小程序的能力

     2. wx:if 这样的属性以及 {{ }} 这样的表达式 

          WXML 是这么写 :

    <text>{{msg}}</text>
    

         JS 只需要管理状态即可:

    this.setData({ msg: "Hello World" })

    通过{{ }}的语法绑定变量到界面,称为数据绑定。

     JS 只需要管理状态,WXML调用模板。

    if/elsefor等控制能力,在小程序里边,这些控制能力都用 wx: 开头的属性来表达。

    详细参考: WXML

    WXSS 样式

    具有CSS大部分特性,小程序在 WXSS 也做了一些扩充和修改。

    1.新增了尺寸单位,rpx。开发者可以免去换算的烦恼。

    2.提供了全局的样式和局部样式。和前边 app.jsonpage.json 的概念相同,你可以写一个 app.wxss 作为全局样式,会作用于当前小程序的所有页面,局部页面样式 page.wxss 仅对当前页面生效。

    3.此外 WXSS 仅支持部分 CSS 选择器

    详细参考: WXSS 

    JS 逻辑交互

      用作和用户交互:响应用户的点击、获取用户的位置等等。

    一个服务仅仅只有界面展示是不够的,还需要和用户做交互:响应用户的点击、获取用户的位置等等。在小程序里边,我们就通过编写 JS 脚本文件来处理用户的操作。

    <view>{{ msg }}</view>
    <button bindtap="clickMe">点击我</button>
    

    点击 button 按钮的时候,我们希望把界面上 msg 显示成 "Hello World",于是我们在 button 上声明一个属性: bindtap ,在 JS 文件里边声明了 clickMe 方法来响应这次点击操作:

    Page({
      clickMe: function() {
        this.setData({ msg: "Hello World" })
      }
    })

     响应用户的操作就是这么简单,更详细的事件可以参考文档 WXML - 事件 

    还可以在 JS 中调用小程序提供的丰富的 API,利用这些 API 可以很方便的调起微信提供的能力,例如获取用户信息、本地存储、微信支付等。在前边的 QuickStart 例子中,在 pages/index/index.js 就调用了 wx.getUserInfo 获取微信用户的头像和昵称,最后通过 setData 把获取到的信息显示到界面上。更多 API 可以参考文档 小程序的API 。

    展开全文
  • 测试客户端与服务器交互功能,如何进行测试,需要考虑哪些内容呢?下面我们分阶段来说明一下~ 测试沟通阶段 需要跟客户端和服务器端开发沟通,确定客户端发送请求的样式,需要包含哪些参数值,参数值具体有...
  • 文件后缀和相应的文件类型,打开方法参考大全  原帖:http://xidong.net/File001/File_4586.html 如果你不知怎样判断文件的后缀, 请参看: 什么是文件的后缀名?如果得知文件的后缀? 扩展名 文件类型 打开方式 ....
  • 交互设计原则

    千次阅读 2014-06-10 15:49:43
    交互设计原则:常见附加工作陷阱 不要强迫用户到另外一个窗口中完成影响本窗口的功能; 不要强迫用户记住他将事物放在层次文件系统中的哪个位置; 不要强迫用户调整窗口大小,当窗口在屏幕上弹出时,程序应该为其...
  • 如何判断一个文件是什么类型的文

    千次阅读 2018-12-24 17:12:50
       作者:下家山   一:access函数 如何确定即将访问的文件是否有访问权限 ...1.1 第一种方法,通过ls -a查看 ...怎么知道那个rwx属于u,哪个属于g...问题:如果没有交互界面如何通过程序代码检查某个文件的访问...
  • 三种存储类型比较-文件、块、对象存储

    万次阅读 多人点赞 2016-07-26 09:09:28
    块存储和文件存储是我们比较熟悉的两种主流的存储类型,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device)简称OSD。  首先...
  • Ajax 异步交互

    千次阅读 2020-09-07 08:21:13
    基本概述 同步交互 ...异步交互相比同步交互的优势主要具有以下几点: 1、用户操作无须像同步交互必须等待结果。 2、异步交互对带宽造成的压力相比同步交互更小。 3、异步交互只需与服务器端交换.
  • 计算机网络之文件传送协议FTP

    千次阅读 2015-09-24 09:18:09
    FTP 提供交互式的访问,允许客户指明文件类型与格式,并允许文件具有存取权限。FTP 屏蔽了各计算机系统的细节,因而适合于在异构网络中任意计算机之间传送文件文件传送协议 FTP 只提供文件传送的一些基本的...
  • Linux之文件系统和根文件系统

    千次阅读 2015-06-30 13:56:08
     “尽管内核是Linux的核心,但文件却是用户与操作系统交互所采用的主要工具”,这就阐述了“文件系统”的作用,如果只有Linux,没有文件系统,那么整个系统是没有意义的。  在Linux中,有“VFS”的
  • 从零开始学习WEB前端之数据交互(Ajax)

    万次阅读 多人点赞 2017-04-14 17:32:23
    数据交互 ajax
  • 区块链应用中,外部世界如何与智能合约交互往往是一个容易被忽视的问题,很多的智能合约应用场景是根据一些外部事件,输出相应的结果,而传统的IT数据交互方式实际上并不能投入真正的工作。例如,按照农产品价格情况...
  • QML与C++交互

    万次阅读 多人点赞 2019-02-27 15:21:09
    Qt QML模块中的类使QML对象能够从C ++加载和操作,QML引擎与Qt元对象系统集成的本质使得C ++功能可以直接从QML调用。这允许开发混合应用程序,这些应用程序是通过混合使用QML,JavaScript和C ++代码实现的。 QML is...
  • flex数据交互 方式

    千次阅读 2009-07-06 14:58:00
    数据具有流动性,数据传输是指根据用户控制传递至指定目的地。数据交互是指Flex与其他程序进行数据交换,包括传递数据给其他程序和接收其他程序返回的数据。本章将详细讲解数据传输的各种方法及如何与其他程序进行...
  • 第11章 用户交互

    千次阅读 2012-05-18 20:15:14
    如果用户不能和图形界面进行交互,它...在你的应用程序中,最普通的交互就是具有响应鼠标点击的事件,当用户点击界面上的一些元素时,可以执行默写功能,例如点击保存按钮。通常在Cocoa应用程序中,这类事件是通过NS
  • 人机交互基础教程

    千次阅读 多人点赞 2020-09-15 20:12:44
    1. 什么是人机交互:正式回答自己的体系框架 信息技术的一个重要组成部分(都belong to“认知世界,改造世界”的科学) 人机交互:Human-Computer Interaction HCI:关于设计、评价和实现供人们使用的交互式...
  • 人机交互的目的:从尊重用户的角度来改善用户和计算机之间的交互,从而使计算机系统更加容易使用。 人机交互的研究内容 人机交互界面的表示模型与方法 可用性分析与评价 多通道交互技术 认知与智能用户界面 群件 ...
  • 人机交互

    千次阅读 2016-06-12 00:18:39
    根据Material design的官方文件:“色彩从当代建筑、路标、人行横道以及运动场馆中获取灵感,由此引发出大胆的颜色表达激活了色彩,与单调乏味的周边环境形成鲜明的对比。强调大胆的阴影和高光。引出意想不到且充满...
  • (2008.07.22 更新了Axure RP pro5 的交互部分,最下面) yixieshi 一直在用visio做交互原型和画pageflow,朋友推荐用Axure RP 4,试用了一下果然不错,特别在网上找到教程转帖给需要朋友。(作者:Hawking原创)...
  • Linux文件系统目录结构详解

    万次阅读 2017-10-08 13:09:34
    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面我们就开始了解一下linux...
  • 现在先了解一下这两种文件类型。 XML:Extensible Markup Language,可扩展标记语言,标准通用语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。它可以用来标记数据、定义数据类型,是一种允许用户对...
  • 文件传输协议FTP

    千次阅读 2018-05-11 14:48:31
    FTP使用交互式的访问,允许客户指定文件类型和格式(如指明是否使用ASCII码),并允许文件具有存取权限(如访问文件的用户必须经过授权,并输入有效的口令)。 文件传输协议有基于TCP的FTP和基于UDP的简单文件传输...
  • 人机交互学:是一门研究人、计算机以及他们之间相互联系的方式(交互)的科学。 交互:人与计算机之间的直接或间接的通讯 人机交互的目的:从尊重用户的角度来改善用户和计算机之间的交互,从而使计算机系统更加容易...
  • 山东大学人机交互技术复习纲要

    千次阅读 2015-12-03 09:29:35
    1. 人机交互是一门研究如何实现自然、高效、和谐的人机关系的涉及计算机科学、人机工程学、认知心理学以及社会学等学科的交叉学科,主要研究如何设计、实现 和评价供人们使用的交互式计算机系统,并围绕这些方面的...
  • python与硬件的交互

    万次阅读 2018-08-21 17:26:12
    计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。一个完整的...
  • Spark入门1-使用Spark-shell交互分析

    千次阅读 2017-12-04 07:45:55
    Spark入门1-使用Spark-shell交互分析朱金华 njzhujinhua 2017/12/03Spark入门1-使用Spark-shell交互分析 文件读取 1 读取RDD方式 2 读取Dataset方式 查看文件 1 查看内容 2 WordCount 本系列以Spark2.2.0版本为依据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 214,159
精华内容 85,663
关键字:

具有交互功能的文件类型