OpenLayers3入门篇-点在线上的运动
来源:互联网 发布:上海索昂软件 编辑:程序博客网 时间:2024/05/01 01:11
点在线上的运动
基本思路:这条线切割成很多的坐标,然后这个点沿着这些坐标前进,以下代码是参考官方案例做了修改,还有很多不足之处
先将得到的两个点的坐标从字符串转换成数字类型,再传入封装的方法计算出两个坐标之间的距离(单位:米)
注:OpenLayers3有原生API可以计算距离,如果使用其他方法计算距离得到的线的距离和OL画的线的长度比例不对。
得到两点之间的距离长度(单位米),再将两点之间的坐标切割
成与距离相同,也就是两点之间相隔多少米,就有多少个坐标即一米一个坐标,这样如果有多条线的运动,只要传入一个长度点的运动距离相同,不会失真
样例代码:
function lineToArray(start,end,jsonobj){var x = [parseFloat(jsonobj.startx),parseFloat(jsonobj.starty)];var y = [parseFloat(jsonobj.endx),parseFloat(jsonobj.endy)];var c = getDisance2(x,y);//getDisance(x[0], x[1], y[0], y[1])console.log(c);var count = Math.round(c);var routeCoords = [];var startx = start[0];var starty = start[1];var endx = end[0];var endy = end[1];var avg_x=(endx-startx)/count;var avg_y=(endy-starty)/count;routeCoords.push(start);var val_x = startx;var val_y = starty;for(var i=0;i<count;i++){val_x += avg_x;val_y += avg_y;var val = [val_x,val_y];routeCoords.push(val);}routeCoords.push(end);//获取坐标长度/** *就在这里计算需要定位的长度 */var faultPoint = 10000;console.log(count);console.log(routeCoords.length);var routeLength = routeCoords.length;//创造运动的点 var geoMarker = new ol.Feature({ type: 'geoMarker', geometry: new ol.geom.Point(routeCoords[0]) }); var animating = false; var now; var styles = { //运动的点 'geoMarker': new ol.style.Style({ image:new ol.style.Icon({color:'red',src:'dot.png'}) }) }; var vectorLayer = new ol.layer.Vector({ source: new ol.source.Vector({ features: [geoMarker] }), style: function(feature) { // hide geoMarker if animation is active if (animating && feature.get('type') === 'geoMarker') { return null; } return styles[feature.get('type')]; } }); map.addLayer(vectorLayer); //移动点 var moveFeature = function(event){ var vectorContext = event.vectorContext; var frameState = event.frameState; if(animating){ var elapsedTime = frameState.time - now; var index = Math.round(9000* elapsedTime / 1000); console.log(index); if (index >= faultPoint) { console.log(index); stopAnimation(true,routeCoords[index]); //vectorLayer.getSource().removeFeature(geoMarker); var geom = new ol.geom.Point(ol.proj.transform(routeCoords[index], 'EPSG:3857','EPSG:4326')); pointLight(geom.getCoordinates()); return; } var currentPoint = new ol.geom.Point(routeCoords[index]); var feature = new ol.Feature(currentPoint); vectorContext.drawFeature(feature, styles.geoMarker); } map.render(); }; //开始动画 function startAnimation() { if(animating){ stopAnimation(false); }else{ animating = true; now = new Date().getTime(); var speed = 30; //属性设置或返回指定节点的文本内容,以及它的所有后代 //startButton.textContent = 'Cancel Animation'; geoMarker.setStyle(null); //绑定postcompose事件,回调函数moveFeature map.on('postcompose', moveFeature); map.render(); } } //停止动画 function stopAnimation(ended,coor) { animating = false; ended = false; // var coord = ended ? routeCoords[routeLength - 1] : routeCoords[0]; ///**@type {ol.geom.Point}*/ (geoMarker.getGeometry()) // .setCoordinates(coord); /**@type {ol.geom.Point}*/ (geoMarker.getGeometry()) .setCoordinates(coor); //remove listener map.un('postcompose', moveFeature); } startAnimation();}
1 0
- OpenLayers3入门篇-点在线上的运动
- Openlayers3 轨迹回放,点在线上运动, 解决linestring坐标显示不全
- OpenLayers3入门篇-点的扩散效果
- OpenLayers3入门篇-创建点和线
- OpenLayers3入门篇-右键事件的绑定
- OpenLayers3入门篇-创建地图
- OpenLayers3入门篇-单击事件
- 确定点在线段上的算法
- 黑马之前,点在线上的判断
- openlayers3画线画点
- Openlayers3 计算地图上任意两点间的距离
- C# 点在线段上
- 判断点在线段上
- C#判断点在线上或在多边形的边框上|点在多边形内部
- 一个点在一条直线上往返做运动的代码。
- 在BlackBerry上使用OpenGL绘图(七):视图变换:观察点的运动
- 点是否在线上或者椭圆上
- 关于判断点是在线段的左侧还是右侧还是在线段上的算法
- Python 入门 一
- 测试APPEND INSERT是否产生UNDO信息的过程
- Linux下的软件源代码安装
- 字符串-644 Immediate Decodability
- 小结:c#Constructor构造函数注入
- OpenLayers3入门篇-点在线上的运动
- linux 操作系统中检查特定用户上次登录的时间lastlog命令的使用
- poj 1847 最短路 floyd
- android NDK JNI so文件的制作和使用
- C++ OO Programming (1)
- 视频驱动V4L2子系统驱动架构 - 驱动框架
- 猜数游戏(JAVA)
- Android从1.0到 6.0各版本的差别
- sdfasddddddddddddd