Анимировать функцию точки GPS между обновлениями позиции

#openlayers

#openlayers

Вопрос:

Я хочу плавно изобразить переход моей функции точки GPS-маркера между обновлениями позиции. Я ориентировался на пример «Пользовательской анимации»: https://openlayers.org/en/latest/examples/feature-animation.html и анимировал геометрию вместо стиля.

Это работает отлично. Единственная проблема: «оригинальная» функция определения местоположения GPS-маркера все еще видна во время анимации. Итак, во время выполнения анимации у меня есть два маркера: один в старом местоположении, один анимируется в новой позиции… Я попытался установить непрозрачность исходного маркера GPS на 0 перед анимацией, но я подозреваю, что изображение уже «составлено» при postcompose…

Вот что я сделал:

         function flash(feature) {
            var start = new Date().getTime();
            if ((oldGPSGeometry === undefined) || (feature.getGeometry() === undefined))
                return;
            var oldCoordinates = oldGPSGeometry.getFirstCoordinate();
            var newCoordinates = feature.getGeometry().getFirstCoordinate();
            if ((oldCoordinates[0] == newCoordinates[0]) amp;amp; (oldCoordinates[1] == newCoordinates[1]))
                return;
            var featureStyle = feature.getStyle().clone();
            var listenerKey = map.on('postcompose', animate);

            function animate(event) {
                var vectorContext = event.vectorContext;
                var frameState = event.frameState;
                var elapsed = frameState.time - start;
                var elapsedRatio = elapsed / animationDuration;
                var curCoor = [elapsedRatio * (newCoordinates[0] - oldCoordinates[0])   oldCoordinates[0], elapsedRatio * (newCoordinates[1] - oldCoordinates[1])   oldCoordinates[1]];
                var flashGeom = new ol.geom.Point(curCoor);
                vectorContext.setStyle(featureStyle);
                vectorContext.drawGeometry(flashGeom);
                if (elapsed > animationDuration) {
                    ol.Observable.unByKey(listenerKey);
                    return;
                }
                map.render();
            }
        }
  

Я хотел бы «скрыть» исходную функцию точки GPS во время анимации.
Есть идеи?

Ответ №1:

Установка пустого стиля при запуске и сброс исходного по завершении работает с примером OpenLayers

     function flash(feature) {
        var start = new Date().getTime();
        if ((oldGPSGeometry === undefined) || (feature.getGeometry() === undefined))
            return;
        var oldCoordinates = oldGPSGeometry.getFirstCoordinate();
        var newCoordinates = feature.getGeometry().getFirstCoordinate();
        if ((oldCoordinates[0] == newCoordinates[0]) amp;amp; (oldCoordinates[1] == newCoordinates[1]))
            return;
        var featureStyle = feature.getStyle();
        feature.setStyle([]);
        var listenerKey = map.on('postcompose', animate);

        function animate(event) {
            var vectorContext = event.vectorContext;
            var frameState = event.frameState;
            var elapsed = frameState.time - start;
            var elapsedRatio = elapsed / animationDuration;
            var curCoor = [elapsedRatio * (newCoordinates[0] - oldCoordinates[0])   oldCoordinates[0], elapsedRatio * (newCoordinates[1] - oldCoordinates[1])   oldCoordinates[1]];
            var flashGeom = new ol.geom.Point(curCoor);
            vectorContext.setStyle(featureStyle);
            vectorContext.drawGeometry(flashGeom);
            if (elapsed > animationDuration) {
                ol.Observable.unByKey(listenerKey);
                feature.setStyle(featureStyle);
                return;
            }
            map.render();
        }
    }
  

Комментарии:

1. У меня это не сработало. Вместо этого я включил и выключил соответствующий слой именно на тех строках, которые вы предложили для настройки стиля выше. positionLayer.setVisible(true); Работает очень хорошо!