【问题标题】:change layer property based on slider input with deck.gl使用deck.gl根据滑块输入更改图层属性
【发布时间】:2019-02-10 06:35:15
【问题描述】:

我正在关注一个 example provided on the deck.gl github repository,它显示来自 geojson 的多边形。

此后,我更改了地图的初始焦点并提供了我自己的 geojson 来进行可视化,我替换示例的数据具有我想通过操作范围输入来可视化的时间组件。


GeoJSON 结构示例

{
"type": "FeatureCollection",
"name": "RandomData",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature",
    "properties": { "id": 1,"hr00": 10000, "hr01": 12000, "hr02": 12000, "hr03": 30000, "hr04": 40000, "hr05": 10500, "hr06": 50000}, "geometry": { "type": "Polygon", "coordinates": [ [ [ 103.73992, 1.15903 ], [ 103.74048, 1.15935 ], [ 103.74104, 1.15903 ], [ 103.74104, 1.15837 ], [ 103.74048, 1.15805 ], [ 103.73992, 1.15837 ], [ 103.73992, 1.15903 ] ] ] } } ] }

我没有为每个时间点重复每个几何图形,而是将数据的时间方面转移到属性中。这使得文件大小可以在整个数据集上进行管理(~50mb 与 ~500mb)。


为了可视化单个时间点,我知道我可以将属性提供给 getElevationgetFillColor

_renderLayers() {
    const {data = DATA_URL} = this.props;

    return [
      new GeoJsonLayer({
        id: 'geojson',
        data,
        opacity: 0.8,
        stroked: false,
        filled: true,
        extruded: true,
        wireframe: true,
        fp64: true,
        getElevation: f => f.properties.hr00,
        getFillColor: f => COLOR_SCALE(f.properties.hr00),
        getLineColor: [255, 255, 255],
        lightSettings: LIGHT_SETTINGS,
        pickable: true,
        onHover: this._onHover,
        transitions: {
          duration: 300
        }
      })
    ];
  }

所以我继续使用range.slider,将代码添加到我的app.js,添加了以下sn-p。我相信我也可能把它放在错误的位置,它应该存在于render() 中吗?

import ionRangeSlider from 'ion-rangeslider';

// Code for slider input
$("#slider").ionRangeSlider({
      min: 0,
      max: 24,
      from: 12,
      step: 1,
      grid: true,
      grid_num: 1,
      grid_snap: true
  });
$(".js-range-slider").ionRangeSlider();

添加到我的index.html

<input type="text" id="slider" class="js-range-slider" name="my_range" value=""/>

那么如何让滑块更改我的 geojson 的哪个属性被提供给 getElevationgetFillColor

我的 JavaScript/JQuery 缺失,我找不到任何关于如何根据输入更改数据属性的明确示例,非常感谢任何帮助。

Here is a codesandbox link - doesn't seem to like it there however. 在本地使用 npm installnpm start 应该会按预期运行。

【问题讨论】:

  • 您能否在codesandbox.io/s 上提供一个示例?您希望滑块改变什么? hr00 ... hr06?
  • 滑块的范围为 0-24,这将确定在 GeoJsonLayer 中使用的 geojson 的属性。我会看看网站,然后在我醒来时尝试上传一个示例。

标签: javascript reactjs deck.gl


【解决方案1】:

首先,您需要告诉依赖访问者滑块将要更改的值。这可以通过使用updateTriggers 来完成:

_renderLayers() {
  const { data = DATA_URL } = this.props;

  return [
    new GeoJsonLayer({
      // ...
      getElevation: f => f.properties[this.state.geoJsonValue],
      getFillColor: f => COLOR_SCALE(f.properties[this.state.geoJsonValue]),

      updateTriggers: {
        getElevation: [this.state.geoJsonValue],
        getFillColor: [this.state.geoJsonValue]
      }
      // ...
    })
  ];
}

要使用范围滑块实际更改此值,您需要在初始化期间添加 onChange 回调:

constructor(props) {
    super(props);
    this.state = { hoveredObject: null, geoJsonValue: "hr01" };
    this.sliderRef = React.createRef();
    this._handleChange = this._handleChange.bind(this);
    // ...
}

componentDidMount() {
  // Code for slider input
  $(this.sliderRef.current).ionRangeSlider({
    // ...
    onChange: this._handleChange
  });
}

_handleChange(data) {
  this.setState({
    geoJsonValue: `hr0${data.from}`
  });
}

render() {
  ...
  <DeckGL ...>
    ...
  </DeckGL>

  <div id="sliderstyle">
    <input
      ref={this.sliderRef}
      id="slider"
      className="js-range-slider"
      name="my_range"
    />
  </div>

  ...
}

基本上就是这样。这是full code

【讨论】:

  • 这很好,我想知道你是否可以做类似hr0${data.from} 的事情,但直到现在才看到一个例子。但是,当我使用您提供的更改运行 npm start 时,However _handleChange() = data => {...}` 给我一个“意外令牌 (87:18)”错误。
  • 已更新。只需 .bind 它在 constructor 中,而不是使用箭头函数
  • @streletss 如果我想以编程方式更改可见属性,这会相似吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多