OpenLayers 3 之 地图视图(View)

初始化一幅地图,必备的三要素之一视图(view),这个对象主要是控制地图与人的交互,如进行缩放,调节分辨率、地图的旋转等控制。也就是说每个 map对象包含一个 view对象部分,用于控制与用户的交互。

主要介绍 view 的作用和用法,并分析商用的地图应用中的相关的功能。功能的具体的实现与如何进行定制和优化,就超过了这篇文章的范围了。

view 类的定义可以在 GitHub 的 OpenLayers 项目中的 这里 看到,我就不贴大篇幅的代码了,只是针对特定的点贴一下核心代码,需要看完整源码的到上面的链接去看。

一、 view 属性

view 的构造函数需要的参数是一个 olx.ViewOptions对象,这个对象的描述如下:

/**

* Object literal with config options for the view.

* @typedef {{center: (ol.Coordinate|undefined),

* constrainRotation: (boolean|number|undefined),

* enableRotation: (boolean|undefined),

* extent: (ol.Extent|undefined),

* minResolution: (number|undefined),

* maxResolution: (number|undefined),

* minZoom: (number|undefined),

* maxZoom: (number|undefined),

* projection: ol.proj.ProjectionLike,

* resolution: (number|undefined),

* resolutions: (Array.|undefined),

* rotation: (number|undefined),

* zoom: (number|undefined),

* zoomFactor: (number|undefined)}}

* @api

*/

比较重要的属性如下:

center 是一个坐标[x, y],表示地图视图的中心位置;

extent 是一个数组对象 – [left, bottom, right, top],表示地图视图的初始范围;

projection 是地图的投影坐标系统;

resolution 表示地图的分辨率,单位并不是普通的单位面积的像素,而是单位像素表示的距离单位,比如 米/像素;

rotation 表示地图的旋转角度;

zoom 表示地图初始的缩放级别。

这些属性的状态直接影响地图的外观和用户的交互,该对象用于初始化 view 的属性。 view 包含一个ol.ViewProperty数组:

ol.ViewProperty = {

CENTER: 'center',

RESOLUTION: 'resolution',

ROTATION: 'rotation'

};

除了初始化 ol.ViewProperty 中的属性,view 的属性还有 projection_属性,表示投影信息;一些限制属性maxResolution_ , minResolution_ , minZoom_ 等,主要是限制地图的最大和最小分辨率(比例尺)和最小缩放级别(zoom level)等。

定义view类的方法是 混合使用构造函数模式和原型模式,构造函数模式部分(如上面构造函数的定义),主要定义类的私有属性和私有函数,所以以上定义的为每个对象特有的属性,各个对象内容各异;原型模式主要定义类的公有方法,每个实例化的对象保存的都是原型的指针,所以原型模式定义的方法和属性只有一个实例,每个对象都引用这个实例。

下面我们就分别介绍其各个实例化的 view 对象的常用公有方法、作用和用法。

二、 view 方法

view 类的方法主要是针对 view 的属性的 get 和 set 方法,其基本的方法很多,我们将常用的方法进行归类:

rotate,ifDef

fitExtent,fitGeometry

getCenter,getProjection,getResolution,getRotation,getZoom

setCenter,setResolution,setRotation,setZoom

下面分别介绍这些方法的作用和用法,后面还有实例,让大家更清楚地了解这些方法执行的效果。

rotate(rotation , opt_anchor ),接受两个参数,旋转角度数(rotation)和旋转中心(opt_anchor,可选),将地图围绕 opt_anchor 旋转 rotation 角度;

isDef,检查地图的中心和分辨率是否已经设置,都设置返回 true,否则返回 false;

fitExtent(extent, size),接受两个参数:extent 和 size,extent 类型是 ol.Extent – [left, bottom, right, top],size由map.getSize()获取;该功能类似于 ArcGIS 的缩放到图层功能,将地图的view 缩放到 extent 区域可见的合适尺度;

fitGeometry(geometry, size, opt_options),参数是地理要素,地图尺寸和可选参数;根据给定的地理要素,将 view 缩放到适合地理要素显示的尺寸;

get ,getCenter() 获取地图的中心,返回一个地图中心的坐标;getResolution()获取地图的分辨率,即比例尺,返回一个表示比例尺的数值; getProjection()获取地图使用的”投影坐标系统”,如EPSG:4326;getRotation()获取地图的“旋转角度”;getZoom()获取地图的缩放级别,返回一个表示缩放级别的数值;以上的函数均不需要任何参数;

set ,setCenter(center),参数为ol.Coordinate类型 – [x, y],作用为设置地图的中心坐标;setResolution(number)设置地图的分辨率(比例尺);setRotation(number),参数为旋转的角度对应的值,并不是度数,如Math.PI,不是180度,作用是将地图旋转相应点角度,顺时针为正;setZoom(number)设置地图的缩放级别。

这些方法中,fit类方法和 set 类方法,调用都可以看到效果,其它的都是计算或者获取相应已经存在的值。下面我们通过实例来看看这些方法的效果。

三、 view 类应用实例

我们将 HTML 页面中加一个按钮,然后绑定一个点击事件,点击触发我们的功能。首先在 HTML 的最后面添加按钮:

然后进行函数绑定:

var trigger = document.getElementById("setViewTrigger");

trigger.addEventListener("click", function(){

//获取地图的 view

var view = map.getView();

//这里写相应执行的动作

. . .

},false);

地图初始情况如下图,每一个功能调用后,只贴一张效果效果图,就不贴原图了:

1、rotate(rotation, opt_anchor)

rotate 方法第一个参数是角度,为数值,单位不是度,180度对应数值PI,也就是3.1415926 · · ·;且正数表示顺时针旋转,如要想顺时针旋转60度,那么传入 Math.PI /3。

在单击事件中添加如下调用:

view.rotate(Math.PI / 3);

调用函数后效果图:

2、fitExtent(extent, size)

只要涉及到坐标运算的都要注意坐标转换,这幅地图的默认坐标系为 EPSG:3857,如果使用的 EPSG:4326要注意进行坐标转换,使用ol.proj.transformExtent(转换Extent)和ol.proj.transform(转换坐标)进行坐标转换。

在事件函数中添加如下这句:

view.fitExtent(ol.proj.transformExtent([76,18,140,56], 'EPSG:4326', 'EPSG:3857'), map.getSize());

其中 [76,18,140,56]是中国的外包矩形坐标,结果应该是适合显示中国全图的尺度。

函数调用后效果图:

3、fitGeometry(geometry, size, opt_options)

要缩放到要素级别,首先要先获得相应要素,这里我选择的是代表“尼泊尔”的版图;然后再传入参数,进行缩放。在事件函数中添加如下代码:

var feature = vectorLayer.getSource().getFeatures()[28];

var polygon = feature.getGeometry();

view.fitGeometry(polygon, map.getSize());

效果应该是将“尼泊尔”缩放到最合适可见的级别。调用后效果如图:

4、get

get 函数都不需要参数,只需要获得地图的 view 对象,在 view 对象上调用即可。

4.1 getZoom()

var zoom = view.getZoom();

alert(zoom);

初始状态的缩放值:

初始状态的缩放值为2,这与初始的设置相吻合:

我们接着将地图放大两次,然后再检查zoom值:

可见 zoom 值变成了4,可见zoom值就是地图的缩放级别。百度地图或者谷歌地图等旁边的侧条显示国家、省、市等级别的值就与这个相关。

4.2 getCenter()

函数执行结果是返回地图的中心坐标,类型为ol.Coordinate。添加如下代码:

var center = view.getCenter();

alert(center);

执行结果:

4.3 getProjection()

函数执行结果是返回一个ol.proj.Projection对象,代表地图的投影坐标系统,该对象有一个方法 getCode(),返回投影的 ESPG 代码。例如,添加如下代码:

var projection = view.getProjection().getCode();

alert(projection);

运行结果如下:

4.4 getResolution()

函数返回一个数值,代表地图当前的分辨率(比例尺),例如,添加如下代码:

var resolution = view.getResolution();

alert(resolution);

运行结果如下:

缩放到中国的版图,观察其分辨率的值是否改变:

4.5 getRotation()

函数返回一个数值,代表旋转的角度。正常情况下,为 0。我们尝试旋转 Math.PI/3,也就是60度,然后再调用函数获取,结果如下:

结果为1.0471975511965976,也就是 Math.PI /3。

5、set

5.1 setCenter(center)

接受一个参数:中心坐标,类型为 ol.Coordinate,无返回值。我们取尼泊尔境内的中心坐标:[82.66363, 29.64666],然后将传入的坐标设置为地图的中心:

view.setCenter(ol.proj.transform([82.66363, 29.64666], 'EPSG:4326', 'EPSG:3857'));

首先我们将地图平移到大海的地方,然后执行这一句,地图就会平移到尼泊尔为中心。该函数并不会改变地图的缩放级别(zoom)和分辨率(resolution),只是将传入的坐标设置地图的中心。

设置新的中心后:

5.2 setResolution(resolution)

接受一个参数,一个代表分辨率(比例尺)的数值,无返回值,操作结果就是将地图的分辨率(比例尺)设置为传入的数值。和 setCenter 一样,这个函数并不负责其他的功能,它只会就地,将地图的分辨率设置为相应的值,地图中心并不会变。

view.setResolution(100);

分辨率(比例尺)表示真实的地物与图上的地物的大小比例,所以分辨率的值越大,那么表示地图会显示的越小,值越小,地图越大,越清楚。

默认的分辨率,为 39135.75848201024,我们把分辨率设置为 100000,理论上应该地图会缩小。调用函数效果如下图:

5.3 setZoom(zoom)

接受一个数值参数,将地图的缩放级别设置为相应的数值代表的缩放级别,同样地图中心也不会受到影响。

缩放级别(zoom level)分为多级,值越小,那么表示地图会显示的越小,值越大,地图越大,越清楚,与分辨率的值正好相反的规则。

地图最初的缩放级别是 2,我们将其设置为 10,效果如下:

view.setZoom(10);

执行结果:

像百度地图中的左边有一个比例尺条,分为国家、省、市、县等几个缩放级别,也是利用该项功能。当检测到缩放级别的值变化时,将标尺的刻度移动到对应的位置,即可。

5.4 setRotation(rotation)

设置地图的旋转角度,接受参数为旋转的角度,执行结果就是将地图围绕当前的地图中心,旋转相应的角度。该函数和rotate(rotation, opt_anchor) 方法极为类似,用法直接参照 rotate方法就可以。

view.setRotation(Math.PI / 2);

调用函数后,地图顺时针旋转了90度:

四、总结

到此为止,基本 view 所有的功能都介绍完了。总之,view主要控制地图与用户的最基本的交互,每个 map 对象必须包含一个 view 对象,也就是说每个 map 必须都支持缩放、平移等基本交互动作。

转载自:https://blog.csdn.net/qingyafan/article/details/45603415

openlayers地图旋转_OpenLayers 3 之 地图视图(View)相关推荐

  1. openlayers地图旋转_OpenLayers教程二:实现简单的地图显示

    本文衔接上一篇文章:不睡觉的怪叔叔:OpenLayers教程二:实现简单的地图显示​zhuanlan.zhihu.com 经过上一篇文章对OpenLayers的简单了解以后,现在让我们来实现一个简单的 ...

  2. openlayers地图旋转_Openlayers实现地图的基本操作

    本文实例为大家分享了Openlayers实现地图基本操作的具体代码,供大家参考,具体内容如下 1.新建一个html页面,引入ol.js和ol.css文件,然后在body中创建一个Div标签和4个But ...

  3. openlayers地图旋转_OpenLayers的使用---- 一个完全免费开源的地图JS库

    OpenLayers很容易的在网站里放置动态地图.它能显示展开图及从资源中加载地图标记及矢量数据.它被开发出尽可能的使用所有的地图信息.并且它是完全免费及开源的. 详细了解可去它的官网:http:// ...

  4. Vue+Openlayers中实现地图旋转

    场景 Vue+Openlayers实现地图上绘制线: Vue+Openlayers实现地图上绘制线_BADAO_LIUMANG_QIZHI的博客-CSDN博客 在上面实现的效果是这样的 此地图的显示时 ...

  5. OpenLayers 3 之 加载百度地图

    虽然百度地图有自己的 JavaScript API,但是有时候,一个项目已经用 OpenLayers 做了很多功能,不可能弃之不用,同时,又想使用百度地图,该怎么办呢?所以很多人想使用 OpenLay ...

  6. 如何使用Openlayers 3加载谷歌离线地图

    谷歌地图部署 说明:使用地图下载工具下载的谷歌离线地图大致如下结构,使用合适的WEB服务器发布地图服务. 使用Openlayers 3调用地图服务 说明:这里使用ol.source.XYZ(更多语法请 ...

  7. openlayers 3扩展,调用百度地图、高德地图、天地图服务

    调用这三个商业地图服务,我们使用的都是切片(Tile)地图服务,关于切片地图的含义这里做简单的介绍: 切片地图就是指将显示的地图切成一块一块的(256 * 256)分别显示加载.openlayers ...

  8. mapbox 视角切换 3d与2d之前的切换,加指南针的旋转,模仿百度地图实现的效果

    mapbox 视角切换 3d与2d之前的切换,加指南针的旋转,模仿百度地图实现的效果 使用方法 附件下载地址:mapbox视角切换,模仿baidu地图的3d与2d的切换,与指南针的旋转-Javascr ...

  9. arcgis api for js4.x 移动端--按钮点击实现地图旋转

    如图:因为项目中使用的是arcgis for js,并且移动端和PC端共用的同一套代码,只是做了一下兼容. 这样子,在移动端就出现了一个问题,就是地图旋转的问题...没有右击事件了啊,,,问了客服说是 ...

最新文章

  1. Eclipse上GIT插件EGIT使用手册
  2. java连接sqlserver数据简单操作
  3. vim自动跳转到引用的函数
  4. 【计算机网络复习 物理层】2.1.2 数据通信基础知识
  5. Win7系统打开摄像头提示“请检查装置连接状况”怎么办
  6. ios开发 访问mysql_iOS开发实战-时光记账Demo 网络版
  7. finally不管有没有错都会运行 finally 块用于清除 try 块中分配的任何资源,以及运行任何即使在发生异常时也必须执行的代码...
  8. 写了个淡入淡出的jq幻灯片插件
  9. 楼天成 中国大学生编程第一人
  10. 清明上河图对计算机技术的启发,《清明上河图》鉴定故事的启示
  11. 小京东V5.X短信宝插件开发
  12. 迅雷下载边下边播设置为本地安装的浏览器
  13. windows无法连接到打印机_电脑、打印机常见故障处理
  14. 「标签管理」使用标签管理有道云笔记资料
  15. 【程序人生】领导素质 | 第 5 级领导力:个人谦逊和坚定意志的胜利 | Level 5 Leadership: The Triumph of Humility and Fierce Resolve
  16. linux不同用户移动文件系统,第三节 linux:文件系统以及文件操作命令
  17. 访问hfds报错AccessControlException
  18. 【正本清源】关于extern、static、const的正确使用方法
  19. linux脚本跳出循环语句,跳出循环的命令
  20. 微软WP与Win8应用商店软件总数已突破40万

热门文章

  1. php属于复合型人才,企业呼唤一专多能复合型人才
  2. 百度智能云扩列:新生态下的“正和游戏”
  3. ping 命令中的 TTL
  4. Python数据分析与处理——北京高考分数线统计分析
  5. 日本禅师的12条生活准则影响了乔布斯一生
  6. 韩国wargame v2.0的一些writeup
  7. 修改Nokia N900开机动画
  8. windows server2022精细化密码策略
  9. 搜狗网址导航浏览页的自动弹出
  10. shell脚本远程ssh服务器并执行操作