绘制动画openlayers线串路径

 ghsk 发布于 2023-02-12 16:12

我在http://jerusalem.com/map#!/tour/the_way_of_the_cross/location/abu_jaafar上看过一个令人印象深刻的映射示例,是否有人如何使用openlayers在绘制的路径上绘制类似的动画?

以下小提琴显示了线串http://jsfiddle.net/pwuVz/58/但我需要的是能够为线串本身设置动画,以便不直接绘制字符串.

var map = new OpenLayers.Map( 'map', {theme:null,
                    controls:[new OpenLayers.Control.Navigation()]} );
            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
                    {layers: 'basic'} );
            map.addLayer(layer);
            map.setCenter([3, 49], 5);

var startPt=new OpenLayers.Geometry.Point( 2, 45);
var endPt=new OpenLayers.Geometry.Point(7,55);

//make the line:
var line=new OpenLayers.Geometry.LineString([startPt, endPt]);

//style
var #0500bd", strokeWidth:15, strokeOpacity: 0.5,  strokeColor: '#0000ff'};
//make vector 
var fea=new OpenLayers.Feature.Vector(line, {}, style);

//make vectorLayer
var vec= new OpenLayers.Layer.Vector();

//add the feature
vec.addFeatures([fea]);

//add to map
map.addLayer(vec);

setTimeout(function() {

      var startPt=new OpenLayers.Geometry.Point( 7, 55);
var endPt=new OpenLayers.Geometry.Point(13,52);

//make the line:
var line=new OpenLayers.Geometry.LineString([startPt, endPt]);

//style
var #0500bd", strokeWidth:15, strokeOpacity: 0.5,  strokeColor: '#0000ff'};
//make vector 
var fea=new OpenLayers.Feature.Vector(line, {}, style);

//make vectorLayer
var vec= new OpenLayers.Layer.Vector();

//add the feature
vec.addFeatures([fea]);

//add to map
map.addLayer(vec);

}, 2000);

Peter Olson.. 6

您可以通过一次仅绘制线条的一部分来为其设置动画.这是你可以做到的一种方式:

function drawAnimatedLine(startPt, endPt, style, steps, time, fn) {
    var directionX = (endPt.x - startPt.x) / steps;
    var directionY = (endPt.y - startPt.y) / steps;
    var i = 0;
    var prevLayer;
    var ivlDraw = setInterval(function () {
        if (i > steps) {
            clearInterval(ivlDraw);
            if (fn) fn();
            return;
        }
        var newEndPt = new OpenLayers.Geometry.Point(startPt.x + i * directionX, startPt.y + i * directionY);
        var line = new OpenLayers.Geometry.LineString([startPt, newEndPt]);
        var fea = new OpenLayers.Feature.Vector(line, {}, style);
        var vec = new OpenLayers.Layer.Vector();
        vec.addFeatures([fea]);
        map.addLayer(vec);
        if(prevLayer) map.removeLayer(prevLayer);
        prevLayer = vec;
        i++;
    }, time / steps);
}

time参数指定你想要多久的动画到最后(以毫秒为单位),以及steps指定您希望多少步划分成动画.fn是动画完成时将执行的回调.

这是一个jsFiddle演示,演示了这一点.

1 个回答
  • 您可以通过一次仅绘制线条的一部分来为其设置动画.这是你可以做到的一种方式:

    function drawAnimatedLine(startPt, endPt, style, steps, time, fn) {
        var directionX = (endPt.x - startPt.x) / steps;
        var directionY = (endPt.y - startPt.y) / steps;
        var i = 0;
        var prevLayer;
        var ivlDraw = setInterval(function () {
            if (i > steps) {
                clearInterval(ivlDraw);
                if (fn) fn();
                return;
            }
            var newEndPt = new OpenLayers.Geometry.Point(startPt.x + i * directionX, startPt.y + i * directionY);
            var line = new OpenLayers.Geometry.LineString([startPt, newEndPt]);
            var fea = new OpenLayers.Feature.Vector(line, {}, style);
            var vec = new OpenLayers.Layer.Vector();
            vec.addFeatures([fea]);
            map.addLayer(vec);
            if(prevLayer) map.removeLayer(prevLayer);
            prevLayer = vec;
            i++;
        }, time / steps);
    }
    

    time参数指定你想要多久的动画到最后(以毫秒为单位),以及steps指定您希望多少步划分成动画.fn是动画完成时将执行的回调.

    这是一个jsFiddle演示,演示了这一点.

    2023-02-12 16:15 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有