DeckGL与MapboxGL整合方案

deck.gl 的 MapView 旨在每个缩放级别和旋转角度与 Mapbox 的相机完美同步。对于DeckGLMapboxGL的整合官方文档提供了两种方案,不过看网络上也有按需求根据源码定制整合的方案

主要通过deck.gl/mapbox模块中的MapboxOverlayMapboxLayer类实现

[1]overlay

相应API:MapboxOverlay在这里插入图片描述

该方式主要适用于底图为二维的情况,因为是将DeckGLlayerMapboxlayer分离构建并挂载在不同的DOM中,将DeckGL的画布作为Mapbox底图顶部上的叠加层。官网示例:https://github.com/visgl/deck.gl/tree/8.8-release/examples/get-started/pure-js/mapbox

Deck 的相机和mapbox的相机是同步的,所以这是一个比较灵活强大的选项,因为这两个库彼此独立地管理它们的渲染。如果底图是二维的(因为不会有相互遮挡效果,就是无论底图是不是三维的,DeckGL Layer都会叠加到Mapbox Layer 上,mapBox-gl的dom也就是挂载于deckGL之上,mapbox-gl 处理所有用户输入),通常就足够了。

如果您需要使用除 deck.gl 之外的其他 mapbox-gl 控件和插件,这是有利的

注意也是可以将Mapbox 的Layer作为叠加层叠加到DeckGL上的,这里不太推荐,就不过多介绍了

import {MapboxOverlay} from '@deck.gl/mapbox';
import {GeoJsonLayer, ArcLayer} from '@deck.gl/layers';
import mapboxgl from 'mapbox-gl';

// source: Natural Earth http://www.naturalearthdata.com/ via geojson.xyz
const AIR_PORTS =
  'https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_10m_airports.geojson';

const map = new mapboxgl.Map({
  container: 'map',
  style: 'https://basemaps.cartocdn.com/gl/positron-nolabels-gl-style/style.json',
  center: [0.45, 51.47],
  zoom: 4,
  bearing: 0,
  pitch: 30
});

const mapboxOverlay = new MapboxOverlay({
  layers: [
    new GeoJsonLayer({
      id: 'airports',
      data: AIR_PORTS,
      // Styles
      filled: true,
      pointRadiusMinPixels: 2,
      pointRadiusScale: 2000,
      getPointRadius: f => 11 - f.properties.scalerank,
      getFillColor: [200, 0, 80, 180],
      // Interactive props
      pickable: true,
      autoHighlight: true,
      onClick: info =>
        // eslint-disable-next-line
        info.object && alert(`${info.object.properties.name} (${info.object.properties.abbrev})`)
    }),
    new ArcLayer({
      id: 'arcs',
      data: AIR_PORTS,
      dataTransform: d => d.features.filter(f => f.properties.scalerank < 4),
      // Styles
      getSourcePosition: f => [-0.4531566, 51.4709959], // London
      getTargetPosition: f => f.geometry.coordinates,
      getSourceColor: [0, 128, 200],
      getTargetColor: [200, 0, 80],
      getWidth: 1
    })
  ]
});

map.addControl(mapboxOverlay); //将deckGL的Layers作为mapbox的control添加到mapbox上
map.addControl(new mapboxgl.NavigationControl());
[2]Interleaving

相应API:MapboxLayer

在这里插入图片描述

该方案采用利用DeckGL自带的API MapboxLayer来将DeckGL的layer转化为mapbox的layer然后添加上去即可,也就是将DeckGL的layers渲染到了mapbox的webgl上下文了,这也叫意味着DeckGL层的内容与mapbox(为三维时)层之间有相互遮挡效果了

MapboxLayer 是对 Mapbox GL JS 的 CustomLayerInterface API 的实现,通过MapboxLayer就可以将DeckGL中的Layer作为mapbox中的customLayer添加到mapbox的gl上下文中,而不是像上面的将DeckGL的Layer渲染到mapbox上独立的canvas中

虽然这种方式对于熟悉Mapbox GL CustomLayer的人会比较有利,就会受到Mapbox一些API的限制,其Layers的灵活性没有overlay的好。

使用该种方式来给MapBox时只需安装@deck.gl/mapbox包以及相应的Layers包即可

Constructor

该类的Constructor,也就是要参数如下

import {MapboxLayer} from '@deck.gl/mapbox';
new MapboxLayer(props);

props(object)

  • props.id (String)
  • props.type (Layer,可选) -由继承与Layer的类,如为提供DeckGL实例,则必须
  • props.deck (Deck, 可选) -控制该层渲染的 Deck 实例。如果提供,该层将在渲染时通过 id 从其层堆栈中查找,并忽略所有其他道具。建议您使用自动管理 Deck 实例的 MapboxOverlay 类
  • Optional:当前使用的DeckGL layer的props,具体必须参数和可选参数需要查看相应Layers的文档

example

import {MapboxLayer} from '@deck.gl/mapbox';
import {ScatterplotLayer} from '@deck.gl/layers';

const map = new mapboxgl.Map({...});

const myScatterplotLayer = new MapboxLayer({
  id: 'my-scatterplot',
  type: ScatterplotLayer,
  data: [
      {position: [-74.5, 40], size: 100}
  ],
  getPosition: d => d.position,
  getRadius: d => d.size,
  getColor: [255, 0, 0]
});
//Methods: setProps
// wait for map to be ready
map.on('load', () => {
  // insert before the mapbox layer "waterway_label"
  map.addLayer(myScatterplotLayer, 'waterway_label');

  // update the layer
  myScatterplotLayer.setProps({
    getColor: [0, 0, 255]
  });
});

Streamlit是一个开源的数据应用程序框架,特别适合用于快速创建交互式的数据可视化和原型应用。对于大屏模板,Streamlit提供了一种简单的方式将数据呈现于大型触摸屏显示器或会议室屏幕上,通过其`DeckGL`库可以轻松地创建地图、3D视图等高度定制化的视觉效果。 Streamlit的大屏模板通常包括以下几个步骤: 1. 安装Streamlit和必要的库:首先确保安装了Streamlit,可能还需要安装`deckgl`, `plotly`或其他支持大屏可视化的库。 2. 导入库并导入样本数据:导入Streamlit提供的大屏组件,并加载你要展示的数据。 3. 使用`st.deck_gl_map`或`st.plotly_chart`创建图表:例如,你可以创建一个自适应大小的地图或3D散点图。 4. 配置样式和交互性:设置地图的缩放、平移、热点区域等交互选项,以及自定义颜色方案和标签。 5. 结合Markdown和HTML增强信息展示:除了可视化,还可以添加文本描述、提示框等元素。 ```python import streamlit as st from streamlit.errors import StreamlitAPIException try: import deck.gl except StreamlitAPIException: # If Deck.GL isn't installed, let the user know. st.write("Please install the `deckgl` library to use this template.") # ...展示地图或3D图表的代码... # 添加大屏幕特有的交互元素 st.markdown(""" <style> .big-screen { max-width: none !important; height: 90vh; /* 自定义高度 */ } </style> <div class="big-screen"> <!-- Your visualization goes here --> </div> """, unsafe_allow_html=True) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

seeooco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值