首页 > 其他分享 >mapbox 结合deckgl添加3DTiles等操作

mapbox 结合deckgl添加3DTiles等操作

时间:2024-08-01 12:07:21浏览次数:16  
标签:deckgl layers decklayers const mapbox let 3DTiles id deckOverlay

1.初始化

import { MapboxOverlay } from "@deck.gl/mapbox";
import { LineLayer, GeoJsonLayer } from "@deck.gl/layers";
  import { TripsLayer, Tile3DLayer } from "@deck.gl/geo-layers";   import { Tiles3DLoader } from "@loaders.gl/3d-tiles";     let deckOverlay = new MapboxOverlay({     interleaved: true,     layers: []   });  mapgl.addControl(deckOverlay);

2.添加3DTiles

function load3DTiles(name, id, url) {
  const layers = deckOverlay._props.layers;
  deckOverlay.setProps({
    layers: [
      ...layers,
      new Tile3DLayer({
        id: id,
        name: name,
        data: url,
        loader: Tiles3DLoader,
        extruded: true, // 设置3D功能
        opacity: 1, // 设置透明度
        loadOptions: {
          "3d-tiles": {
            loadGLTF: true,
            decodeQuantizedPositions: false,
            isTileset: "auto",
            assetGltfUpAxis: null
          }
        },
        pickable: true, // 设置可选取
        onTilesetError: (err) => {
          console.log(22, err);
        },
        onTilesetLoad: (tileset) => {
          console.log(55, tileset);
          const { cartographicCenter, zoom } = tileset;
          deckOverlay.setProps({
            initialViewState: {
              longitude: cartographicCenter[0],
              latitude: cartographicCenter[1],
              zoom
            }
          });
          mapgl.jumpTo({
            center: [cartographicCenter[0], cartographicCenter[1]],
            zoom
          });
        },
        pointSize: 2
      })
    ]
  });
}

3.添加geojson数据

  addDeckLayerByGeojson(id, geojson) {
    const layers = deckOverlay._props.layers;
    deckOverlay.setProps({
      layers: [
        ...layers,
        new GeoJsonLayer({
          id: id + new Date().getTime(),
          data: geojson,
          getLineColor: (e) => {
            if (e.properties && e.properties.color) {
              return this.hexToRgbArray(e.properties.color);
            } else {
              return [255, 0, 0];
            }
          },
          getLineWidth: 0.3
        })
      ]
    });
  }
  hexToRgbArray(hexColor) {     // 移除十六进制颜色代码中的'#'     let hex = hexColor.replace("#", "");     // 解析红、绿、蓝各自的十六进制数     let red = parseInt(hex.substring(0, 2), 16);     let green = parseInt(hex.substring(2, 4), 16);     let blue = parseInt(hex.substring(4, 6), 16);     // 返回RGB数组     return [red, green, blue];   }


4.判断是否点击了模型

  judgeIsModel(e) {
    const [x, y] = [e.point.x, e.point.y];
    const pickInfo = deckOverlay.pickObject({
      x,
      y,
      unproject3D: true
    });

    if (pickInfo && pickInfo.coordinate) {
      return pickInfo;
    } else {
      return null;
    }
  }

5.删除对应的deckgl图层

  deleteDeckLayers(id) {
    const decklayers = deckOverlay._props.layers;
    for (let i = 0; i < decklayers.length; i++) {
      if (decklayers[i].id.indexOf(id) !== -1) {
        decklayers.splice(i, 1);
        i--;
      }
    }
    deckOverlay.setProps({ decklayers });
  }

 

标签:deckgl,layers,decklayers,const,mapbox,let,3DTiles,id,deckOverlay
From: https://www.cnblogs.com/xiaohanyanliu/p/18336386

相关文章

  • mapbox聚合使用自定义图标
    1mapboxgl.accessToken='YOUR_MAPBOX_ACCESS_TOKEN';2varmap=newmapboxgl.Map({3container:'map',4style:'mapbox://styles/mapbox/streets-v11',5center:[-74.5,40],6zoom:9.57});89map.on(�......
  • mapboxgl V3 Slot插槽使用介绍
    一、介绍插槽允许在样式中创建定义明确的插入点,如:通常“面”图层需要插入到“线”图层下方,在标准样式之前,需要通过指定图层id来实现,一旦id发生变化,则会抛出错误,而在新的标准样式中,只需要指定相应的插槽即可。{"layers":[...,{"id":"bottom","t......
  • Mapbox添加多个不同的点图标
    1//添加多个点图2functionaddMorePoint(data){3if(mapboxMap.map.getSource('iconImageCircle')){4mapboxMap.map.removeLayer('iconCircle')5//mapboxMap.map.removeLayer('lineSources')6mapboxMap.map.removeSo......
  • 切换颜色和符号 scattermapbox -plotly dash
    我试图包含两个单独的开关来改变散点图框的颜色和符号。颜色切换工作正常,而符号切换工作时,它会丢弃颜色。我希望能够同时打开符号和颜色。可以吗?注意:需要是scattermapboximportdashfromdashimportDash,dcc,html,Input,Outputimportplotly.expressasp......
  • mapbox大数据展示
    Mapbox是一个强大的地图引擎,可以用来展示大数据。以下是使用Mapbox展示大数据的基本步骤和示例代码:注册Mapbox账号并获取访问令牌(AccessToken)。在HTML中引入MapboxGLJS库。初始化地图并设置样式。使用GeoJSON或者其他格式加载数据。根据加载的数据添......
  • Cesium实战功能教程之3dtiles操作(移动+旋转)
    在平常的工作中,难免会用到倾斜摄影,当加载倾斜摄影的时候,最头疼的就是倾斜摄影的偏移问题,在代码中进行修改加载倾斜摄影的偏移参数,虽然简单但过于麻烦,也耽误开发的效率,因此我就本着能不能在三维场景中对倾斜摄影进行手动操作,无需再改代码并可将倾斜摄影放在较为正确的位置。......
  • 一种倾斜摄影网格简化方式:指定LOD层级裁剪输出为FBX/OBJ/OSGB/3DTiles
    工具OSGB源数据灵易智模·倾斜摄影编辑平台(下称OPEditor)引言指定LOD层级与网格简化的关系倾斜摄影模型本身就是通过逐级简化点云得到的分页金字塔数据,因此它每一级都是下一级的网格简化结果,且算法成熟、结果可控;通过在导出即输出数据时,设置源数据的最大参考层级来直接......
  • java 生成mapbox-gl 可以直接使用的雪碧图,包含对应json,图片大小无限制自动适配
    1、文件路径配置sprite-path:/home/mapplate/sprite/2、实现类packagecom.shgis.service.impl;/***CreatedbyAdministratoron2021/10/9.*/importcom.alibaba.fastjson.JSONObject;importcom.shgis.config.FileProperties;importcom.shgis.entity.Ebuf......
  • mapboxgl加载geoserver发布的tms矢量图层服务
    mapboxgl加载geoserver发布的tms矢量图层服务//添加源g.map.addSource('tms-source',{type:'vector',scheme:'tms',tiles:['http://localhost:9090/geoserver/gwc/service/tms/1.0.0/route:global_port@EPSG:900913@pbf/{z}/{......
  • Cesium 3DTiles customshader的使用-动态高度设置
    之前要编辑3DTiles 的shader来实现一些例如压平之类的操作 还需要更改源码Cesium新版本更新了3Dtiles的自定义着色器 可以直接定义两个着色器并往里面传uniform新版本添加3dtiles的方式发生了改变 原有的方式不能用了新版本必须通过fromurl函数进行异步添加即asyncfu......