【问题标题】:deck.gl + tripslayer without react.js没有 react.js 的 deck.gl + tripslayer
【发布时间】:2021-02-20 02:14:54
【问题描述】:

如何在没有反应的情况下启用 TripsLayer 的动画? TripsLayer 示例使用 React,我真的不知道如何将其转换为纯 js。请查看下面代码中的“动画”功能。我试图更新层的状态,但它不起作用(没有 TripsLayer 的动画)。我不知道,我应该在哪里分配“时间”变量。

TripsLayer 演示:https://deck.gl/#/examples/custom-layers/trip-routes

React 版本我的代码:https://github.com/uber/deck.gl/blob/master/examples/website/trips/app.js

TripsLayer 的文档:https://github.com/uber/deck.gl/tree/master/modules/experimental-layers/src/trips-layer

我的代码:

import {MapboxLayer} from '@deck.gl/mapbox';
import {TripsLayer} from '@deck.gl/experimental-layers';
import mapboxgl from 'mapbox-gl';

class App
{
  constructor()
  {
    this.stateInfo = { time: 600 };
  }

  get state()
  {
    return this.stateInfo;
  }

  animate() {
    var loopLength = 18000; // unit corresponds to the timestamp in source data
    var animationSpeed = 30; // unit time per second

    const timestamp = Date.now() / 1000;
    const loopTime = loopLength / animationSpeed;

    var time = Math.round(((timestamp % loopTime) / loopTime) * loopLength);

    // HOW SHOULD I USE time VARIABLE???

    window.requestAnimationFrame(this.animate.bind(this)); 
  }
}

var obido = new App();

var tripsLayerObido = new TripsLayer({
  id: 'trips',
  data: 'trips/tripsKR.json',
  getPath: d => d.segments,
  getColor: d => (d.vendor === 0 ? [253, 128, 93] : [23, 184, 190]),
  opacity: 0.6,
  strokeWidth: 30,
  trailLength: 180,
  currentTime: obido.state.time
});

const LIGHT_SETTINGS = {
  lightsPosition: [-74.05, 40.7, 8000, -73.5, 41, 5000],
  ambientRatio: 0.05,
  diffuseRatio: 0.6,
  specularRatio: 0.8,
  lightsStrength: [2.0, 0.0, 0.0, 0.0],
  numberOfLights: 2
};

export const INITIAL_VIEW_STATE = {
  longitude: 19.93,
  latitude: 50.03,
  zoom: 12.8,
  maxZoom: 19,
  pitch: 60,
  bearing: 0
};


mapboxgl.accessToken = "XXX";
const map = new mapboxgl.Map({
  container: 'app',
  style: 'mapbox://styles/elninopl/cjnlge6rl094w2so70l1cf8y5',
  center: [INITIAL_VIEW_STATE.longitude, INITIAL_VIEW_STATE.latitude],
  zoom: INITIAL_VIEW_STATE.zoom,
  pitch: INITIAL_VIEW_STATE.pitch,
  layers: [tripsLayerObido]
});

map.on('load', () => {
  obido.animate(0);
});

【问题讨论】:

  • 嗨,请编辑您的问题以准确解释发生了什么(“它不起作用”没有帮助)。我还会再看一下标签(建议您首先添加 javascript)。最后,请澄清你为什么不想使用反应。谢谢。
  • 我还建议您创建一个示例,让其他人可以轻松上手。我建议您的问题是您从不告诉任何要重新渲染的内容。 React 中的 this.setState 会触发渲染,您在这里没有这样做。你想要类似于deck.setProps 的东西,但是你正在将 mapbox 自定义层与 Deck GL 结合起来,我不知道如何在那里做。

标签: javascript reactjs deck.gl


【解决方案1】:

请尝试setProps,这会使我的旅行层更新:

this.tripsLayer.setProps({ currentTime: this.currentTime });

【讨论】:

    【解决方案2】:

    是的,它有效。

    function animate(timestamp) {
      var timestamp = Date.now() / 1000;
      var loopTime = loopLength / animationSpeed;
      curtime= ((timestamp % loopTime) / loopTime) * loopLength;
      requestAnimationFrame(animate);
      tripLayer.setProps({ currentTime: curtime });
    }
    

    【讨论】:

      【解决方案3】:

      我在这里有点晚了,但是here 有一个使用deck.gl TripsLayerScripting API(没有React)的例子。

      <script src="https://unpkg.com/deck.gl@^8.4.0/dist.min.js"></script>
      <script src="https://unpkg.com/@deck.gl/carto@^8.4.0/dist.min.js"></script>
      
      <script src="https://libs.cartocdn.com/mapbox-gl/v1.13.0/mapbox-gl.js"></script>
      <link href="https://libs.cartocdn.com/mapbox-gl/v1.13.0/mapbox-gl.css" rel="stylesheet" />
      
      <div id="map" style="width: 100vw; height: 100vh"></div>
      
      const ambientLight = new deck.AmbientLight({
        color: [255, 255, 255],
        intensity: 1.0
      });
      
      const pointLight = new deck.PointLight({
        color: [255, 255, 255],
        intensity: 2.0,
        position: [-74.05, 40.7, 8000]
      });
      
      const lightingEffect = new deck.LightingEffect({ ambientLight, pointLight });
      
      const material = {
        ambient: 0.1,
        diffuse: 0.6,
        shininess: 32,
        specularColor: [60, 64, 70]
      };
      
      const theme = {
        buildingColor: [74, 80, 87],
        trailColor0: [253, 128, 93],
        trailColor1: [23, 184, 190],
        material,
        effects: [lightingEffect]
      };
      
      const LOOP_LENGTH = 1800;
      const ANIMATION_SPEED = 0.4;
      
      async function initialize() {
        deck.carto.setDefaultCredentials({
          username: 'public',
          apiKey: 'default_public',
        });
      
        // Fetch Data from CARTO
        // Notice that you can use any Deck.gl layer with CARTO datasets getting GeoJSON data from CARTO's API. This method is recommended for complex layers with datasets below 50Mb
        const tripsUrl = 'https://public.carto.com/api/v2/sql?q=SELECT the_geom, vendor, timestamps FROM sf_trips_v7&format=geojson';
        const geojsonTripsData = await fetch(tripsUrl).then(response => response.json());
        // TripsLayer needs data in the following format
        const layerData = geojsonTripsData.features.map(f => ({
          vendor: f.properties.vendor,
          timestamps: f.properties.timestamps,
          path: f.geometry.coordinates[0]
        }));
      
        const staticLayers = [
          // This is only needed when using shadow effects
          new deck.PolygonLayer({
            id: 'ground-layer',
            data: [[[-74.0, 40.7], [-74.02, 40.7], [-74.02, 40.72], [-74.0, 40.72]]],
            getPolygon: f => f,
            stroked: false,
             getFillColor: [0, 0, 0, 0]
          }),
          new deck.carto.CartoSQLLayer({
            id: 'buildings-layer',
            data: 'SELECT the_geom_webmercator, height FROM sf_buildings',
            extruded: true,
            wireframe: true,
            opacity: 0.5,
            getElevation: f => f.properties.height,
            getFillColor: [74, 80, 87],
            material: theme.material
          })
        ];
      
        // Create Deck.GL map
        const deckgl = new deck.DeckGL({
          container: 'map',
          mapStyle: 'https://basemaps.cartocdn.com/gl/dark-matter-nolabels-gl-style/style.json',
          initialViewState: {
            longitude: -74,
            latitude: 40.73,
            zoom: 12,
            pitch: 45,
            bearing: 0
          },
          controller: true,
          layers: staticLayers,
          effects: theme.effects
        });
      
        let time = 0;
      
        function animate() {
          time = (time + ANIMATION_SPEED) % LOOP_LENGTH;
          window.requestAnimationFrame(animate);
        }
      
        setInterval(() => {
          deckgl.setProps({
            layers: [
              ...staticLayers,
              new deck.TripsLayer({
                id: 'trips-layer',
                data: layerData,
                getPath: d => d.path,
                getTimestamps: d => d.timestamps,
                getColor: d => (d.vendor === 0 ? theme.trailColor0 : theme.trailColor1),
                opacity: 0.3,
                widthMinPixels: 2,
                rounded: true,
                trailLength: 180,
                currentTime: time,
                shadowEnabled: false
              })
            ]
          });
        }, 50);
      
        window.requestAnimationFrame(animate);
       }
      
       initialize(); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-17
        • 2020-09-13
        • 1970-01-01
        • 2021-07-10
        • 2021-06-27
        • 1970-01-01
        相关资源
        最近更新 更多