openlayers地图旋转_地图切换动画#openlayers入门笔记#

本博客合集是我的openlayers学习笔记,希望能帮助到刚开始接触openlayers的同学

@commnet 所用openlayers版本:v5.3.0

@commnet 阅读本文前需要对前端知识有一定的了解

@comment 本文内容只提供参考,建议结合openlayers官网的API和examples来学习

@comment 部分代码参考了@老胡

动画即过渡动画,如果没有动画,地图从一个view状态切换到另一个view状态是突变的、死板的,动画能使过渡效果更自然。

本节内容主要用到了view对象的animate方法,下面以实例说明。

创建几个功能测试按钮和一个地图容器

平移到伦敦

弹性平移到莫斯科

弹跳平移到伊斯坦布尔

旋转平移到罗马

绕着罗马旋转

飞行到伯尔尼

来一段旅行

复制代码创建地图对象和几个城市的伪墨卡托坐标变量,还有一个为按钮添加点击事件的函数,方便后续调用

var london = ol.proj.fromLonLat([-0.12755, 51.507222]);//伦敦

var moscow = ol.proj.fromLonLat([37.6178, 55.7517]);//莫斯科

var istanbul = ol.proj.fromLonLat([28.9744, 41.0128]);//伊斯坦布尔

var rome = ol.proj.fromLonLat([12.5, 41.9]);//罗马

var bern = ol.proj.fromLonLat([7.4458, 46.95]);//柏林

var view = new ol.View({

center: istanbul,

zoom: 6

});

var map = new ol.Map({

target: 'map',

layers: [

new ol.layer.Tile({

preload: 4,

source: new ol.source.OSM()

})

],

//开启动画时允许加载瓦片数据

loadTilesWhileAnimating: true,

view: view

});

function onClick(id, callback) {

document.getElementById(id).addEventListener('click', callback);

}

复制代码通过rotation参数设置地图的旋转动画

在animate中传入想要变化的view的目标参数(如rotation、center),从当前状态变化到目标状态时,如不指定动画类型,地图会使用默认方式渲染动画。

onClick('rotate-left', function() {

//设置rotation参数的目标值为当前角度顺时针加90度,地图会以默认方式渲染动画

view.animate({

rotation: view.getRotation() + Math.PI / 2

});

});

onClick('rotate-right', function() {

//设置rotation参数的目标值为当前角度顺时针减90度,地图会以默认方式渲染动画

view.animate({

rotation: view.getRotation() - Math.PI / 2

});

});

复制代码入场动画和出场动画

地图过渡的一段动画可以同时包括入场动画和出场动画,在同一animate函数中指定。下面的例子中,入场动画为先慢后快地以罗马为中心、将地图顺时针旋转180度,出场动画为先快后慢地以罗马为中心、继续顺时针旋转至360度。

onClick('rotate-around-rome', function() {

var rotation = view.getRotation();

view.animate(

//入场动画为顺时针旋转180度

{

rotation: rotation + Math.PI,

anchor: rome,//围绕罗马旋转

easing: ol.easing.easeIn//擦除方式使用先慢后快的ol.easing.easeIn

},

//出场动画为顺时针旋转360度

{

rotation: rotation + 2 * Math.PI,

anchor: rome,

easing: ol.easing.easeOut//擦除方式使用先快后慢的ol.easing.easeOut

});

});

复制代码通过center参数设置地图的移动动画

下面的例子展示了地图以默认动画从当前中心点平移到伦敦,动画过程2秒

onClick('pan-to-london', function() {

view.animate({

center: london,

duration: 2000

});

});

复制代码自定义动画

easing可以自定义过渡效果函数,返回值为0-1之间的小数,代表起点到终点的变化进度。下面的例子先定义了一个弹跳动画函数,并使用该函数让地图以弹跳动画从当前中心点平移到伦敦,动画过程2秒

function elastic(t) {

return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1;

}

onClick('elastic-to-moscow', function() {

view.animate({

center: moscow,

duration: 2000,

easing: elastic

});

});

复制代码综合应用1

下面的例子展示了地图从当前中心点旋转、平移到罗马,前半程为入场动画,后半程为出场动画

onClick('spin-to-rome', function() {

var center = view.getCenter();

view.animate({

center: [

center[0] + (rome[0] - center[0]) / 2,

center[1] + (rome[1] - center[1]) / 2

],

rotation: Math.PI,

easing: ol.easing.easeIn

}, {

center: rome,

rotation: 2 * Math.PI,

easing: ol.easing.easeOut

});

});

复制代码并发执行

如果给一个过程设置了多个动画,他们都是并行执行的。下面的动画类似于一只鸟的视角,从当前中心点移动到另一个中心点(动画1),并且前半程缩小视角、后半程回到原视角(动画2)。

function flyTo(location, done) {

var duration = 2000;

var zoom = view.getZoom();

var parts = 2;

var called = false;

function callback(complete) {

--parts;

if (called) {

return;

}

if (parts === 0 || !complete) {

called = true;

done(complete);

}

}

view.animate({

center: location,

duration: duration

}, callback);

view.animate({

zoom: zoom - 1,

duration: duration / 2

}, {

zoom: zoom,

duration: duration / 2

}, callback);

}

onClick('fly-to-bern', function() {

flyTo(bern, function() {});

});

复制代码综合应用2

下面的例子使用上面创建的“鸟视角飞跃函数”,在多个城市之间跳跃

function tour() {

var locations = [london, bern, rome, moscow, istanbul];

var index = -1;

function next(more) {

if (more) {

++index;

if (index < locations.length) {

var delay = index === 0 ? 0 : 750;

setTimeout(function() {

flyTo(locations[index], next);

}, delay);

} else {

alert('Tour complete');

}

} else {

alert('Tour cancelled');

}

}

next(true);

}

onClick('tour', tour);

复制代码

本节测试用例的界面如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6种漂亮的线条

第一种&#xff1a; <hr style" height:2px;border:none;border-top:2px dotted #185598;" /> height:2px;是hr的高度 border:none;是没有边框 border-top:2px dotted #185598;是设置横线的样式 dotted 点线 #185598 颜色 第二种&#xff1a; <hr st…

jsf netbeans_NetBeans Java EE技巧9:从数据库创建JSF应用程序

jsf netbeans您需要非常快速地创建数据库前端吗&#xff1f; NetBeans IDE允许人们以很少的代码就为一组数据库表开发JSF应用程序前端。 现在&#xff0c;本教程是一个老歌&#xff0c;但是一个好东西……对于那些不了解它的人来说&#xff0c;值得再次提及。 首先&#xff0c…

python内置属性类_Python内置类属性,元类研究

Python内置类属性我觉得一切都是对象&#xff0c;对象和元类对象&#xff0c;类对象其实都是一样的&#xff0c;我在最后进行了证明&#xff0c;但是只能证明一半&#xff0c;最后由于元类的父类是type&#xff0c;他可以阻挡对object属性的访问&#xff0c;告终__dict__ : 类的…

java向后兼容吗_Java向后不兼容历史的观察

java向后兼容吗在大多数情况下&#xff0c;Java是一个非常向后兼容的编程语言。 这样做的好处是&#xff0c;与大规模破坏兼容性相比&#xff0c;大型系统通常可以相对轻松的方式升级为使用Java的较新版本。 这样做的主要缺点是Java坚持了一些设计决策&#xff0c;这些决策自那…

转义字符的整理

文章目录转义符号 \转义字符清单换行符横向制表符空格编码符转义符号 \ 反斜杠\在程序设计中称为转义符&#xff0c;用来表示那些不能直接显示的字符。例如&#xff1a;换行。 在不同的系统中换行的表示又不相同&#xff0c;在Unix中换行符是\n,而在Windows中换行符是\r\n&…

cloud foundry_介绍“又一个” Cloud Foundry Gradle插件

cloud foundry在与两个同事&#xff08;感谢Mark Alston和Dave Malone &#xff01;&#xff09;一起使用自动Jenkins管道部署Cloud Foundry应用程序的过程中&#xff0c;我决定尝试编写Gradle插件来执行一些通常需要完成的任务使用命令行Cloud Foundry Client完成 。 引入一个…

C++ 11 深度学习(十八)模板概念,函数模板定义、调用

模板作为一个框架&#xff0c;通过传入的参数&#xff0c;来具体实例化想要的东西。 1.模板定义是用template关键字开头的&#xff0c;后跟<>,<>里面叫模板参数列表(模板实参)&#xff0c;如果模板参数列表中有多个参数使用逗号隔开。 2.<>里面至少要有一个…

kotlin将对象转换为map_Kotlin 集合框架:常用集合工具函数(Map 部分)

kotlin.collections.Maps.kt 文件定义了许多针对 Map 接口的工具函数&#xff0c;其中大多数是涉及函数式编程的高阶函数&#xff0c;我们在这里先不讲&#xff0c;等到集合框架结束后进入高阶函数时再讲。今天只讲几个简单的函数。Pair 类和 to() 函数Map 接口表示一种“键 -&…

Oracle/MySQL/Java数据类型对应表

文章目录数据类型对照表MySQL 的 int、bigint、mediumint、smallint、tinyint 的对比关于 MySQL 整型显示位数的问题关于 MySQL 的 timestamp关于 JDBC 类型数据类型对照表 MysqlOracleJavaBIGINTNUMBER(19,0)java.lang.LongBITRAWbyte[]BLOBBLOB RAWbyte[]CHARCHARjava.lang.…

java10个基础错误_我们处理了10亿个Java记录的错误-这是导致97%的错误的原因

java10个基础错误97&#xff05;的记录错误是由10个唯一错误引起的 在2016年&#xff0c;一件事在30年内没有改变。 开发和运营团队仍依靠日志文件对应用程序问题进行故障排除。 由于某些未知原因&#xff0c;我们隐式信任日志文件&#xff0c;因为我们认为事实隐藏在其中。 如…

MySQL的索引学习

文章目录索引自动创建索引手动创建索引删除索引使用索引单列索引PRIMARYNORMALUNIQUEFULLTEXT组合索引&#xff08;复合索引/联合索引&#xff09;索引不足之处索引使用注意事项索引方式 Hash 和 BTree 比较删除索引索引 数据库的索引就像一本书的目录&#xff0c;能够加快数据…

aptx与ldac音质区别_蓝牙协议LDAC和aptx的区别?

LDAC技术的功能介绍LDAC是索尼研发的一种无线音频编码技术&#xff0c;它最早在2015年的CES消费电子设备大展上亮相。在当时&#xff0c;索尼表示比起标准的蓝牙编码、压缩系统&#xff0c;LDAC技术要高效三倍之多。这样一来&#xff0c;那些高解析度的音频文件在进行无线传输的…

【音视频安卓开发 (九)】使用AudioRecord录制PCM音频

1.需要添加权限 <uses-permission android:name"android.permission.CAMERA" /><uses-permission android:name"android.permission.FLASHLIGHT" /><uses-permission android:name"android.permission.CAMERA" /><uses-per…

结果集 tostring_关于避免对toString()结果进行解析或基于逻辑的美德

结果集 tostring使用Java或我使用过的其他编程语言&#xff0c;我发现有时候可以用该语言完成某些事情&#xff0c;但通常不应该这样做。 通常&#xff0c;这些误用语言似乎无害&#xff0c;当开发人员首次使用它们时可能是有益的&#xff0c;但后来同一位开发人员或另一位开发…

3制造数据集_基于MBD的产品设计制造技术研究

本篇节选自论文《基于MBD的产品设计制造技术研究》&#xff0c;发表于《中国电子科学研究院学报》第8卷第6期&#xff0c;作者为中国电子科技集团公司第14研究所专家朱建军。本文经授权转载自公众号学术plus&#xff0c;版权归原作者所有。作者&#xff1a;中国电子科技集团公司…

JSP文件如何转换成Java文件?

文章目录jsp 文件如何转换成 java 文件jsp 何时开始编译jsp 编译后的文件存储目录jsp 文件如何转换成 java 文件 html ----> service(),使用 out.write()输出。 java代码片段 <% %> ----> service(),照…

【WebRTC---源码篇】(九)媒体协商

1.媒体协商的过程 2. 重要的接口类 3.时序图 4.几个关键点 5.code if (InitializePeerConnection()) {peer_id_ = peer_id;//参数1:观察者,创建成功后回调OnSuccess//参数2:消息类型,自动推导peer_connection_->CreateOffer(this, webrtc::PeerConnectionInterface::RTCOff…

jpa 使用jdbc_在JPA和JDBC中使用存储过程。 嗯,只要使用jOOQ

jpa 使用jdbcJava杂志的当前版本由Josh Juneau撰写了有关JDBC和JPA的大数据最佳实践的文章&#xff1a; http : //www.javamagazine.mozaicreader.com/MayJune2016 本文介绍了如何在JDBC中使用存储过程&#xff08;不幸的是&#xff0c;请注意如何关闭资源。即使在Java Magazi…