mapbox+deck.gl加载倾斜摄影模型3dtiles

这篇具有很好参考价值的文章主要介绍了mapbox+deck.gl加载倾斜摄影模型3dtiles。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景

做三维WebGIS开发的朋友们都知道,我们加载倾斜摄影模型,一般使用cesium加载3dtiles格式的数据很简单,官网和网上都有很多例子,这里也不再详细赘述。但是在使用cesium场景中我们会遇到这样一个问题,在加载整个球的时候其实是影响了性能的,在加载局部小场景的时候我们是不需要加载整个地球的,例如我们在做智慧园区的项目时候,基本上只关注园区及其周边范围。如果加载整个地球无疑对资源开销造成了一定的浪费,我们要尽可能的提升用户的体验,将流畅度提升至最大化。所以我们可以使用three.js来完成,如果单纯的只是用来展示three.js无疑是比较不错的选择,但是如果我们想做一些空间查询、空间分析的话,three就不行了。于是我就想到了mapbox,mapbox地图可以拖拽成一定的倾斜角度,形成2.5d的三维效果,加载渲染速度比cesium快多了,不是说cesium不好,在大场景使用中,cesium还是不错的选择。
使用mapbox中的customLayer,结合three很方便加载进来,mapbox官网例子。官网例子只给出了加载gltf格式模型,对于fbx、obj格式的模型可以仿照该例子同样可以加载进来,但是如果我想加载倾斜摄影模型,找了好久找到了mapbox+deck.gl解决方案,deck.gl官网例子

二、数据处理

对于倾斜摄影数据,大多数是osgb格式的,我们在cesium加载倾斜摄影模型,将数据处理成3dtiles加载进来非常方便。在mapbox中结合deck.gl中的Tile3DLayer也可以轻松加进来,处理成3dtiles格式,我们可以选择如下

  1. Github 开源的小工具 地址
  2. Cesium官方推出的 Cesium Ion在线平台(用的少)地址
  3. 一些商家推出的工具集(如cesiumlab)下载地址

推荐使用cesiumlab功能很强大,能处理各种数据,文章最后给大家提供了osgb格式的倾斜摄影模型数据,方便大家测试,能帮到大家我也很高兴,也欢迎交流讨论 QQ 1826356125

三、加载3dtiles

import { MapboxLayer } from "@deck.gl/mapbox"
import { TripsLayer,Tile3DLayer } from "@deck.gl/geo-layers"
import {Tiles3DLoader} from '@loaders.gl/3d-tiles'
const core_1 = require("@math.gl/core")

//添加cesium格式3dtiles
  load3DTiles(layerConfig) {
    let layer=new MapboxLayer({
      id: layerConfig.id,
      type: Tile3DLayer,
      data: layerConfig.url,
      loader: Tiles3DLoader,
      onTileError: (err) => {
        console.log(err)
      },
      onTilesetLoad: (tileset) => {
        tileset.setProps({ maximumScreenSpaceError: 1 })
        const { cartographicCenter, zoom } = tileset;
        this.viewState = {
          ...this.viewState,
          longitude: cartographicCenter[0],
          latitude: cartographicCenter[1],
          zoom
        }
        let viewState = this.viewState
        //设置x、y、z偏移,有些倾斜摄影模型加载进来不在该位置
        //需要进行位置的调整,但我在进行旋转、和比例缩放的时候不起作用
        //欢迎来指正
        let mMtx=new core_1.Matrix4().makeTranslation(1,1,-200)
        
        tileset.modelMatrix=mMtx
        this.map.jumpTo({
          center: [viewState.longitude, viewState.latitude],
          zoom: viewState.zoom,
          //bearing: viewState.bearing,
          //pitch: viewState.pitch,
        });

      }
    })
    return layer
  }
let layer=load3DTiles({
	id: "3dTiles-xxxxxx",
    describe:"倾斜摄影",
    url:'http://localhost:8084/3DModel/qxsy/tileset.json',
    layerType: "3DTiles"
})
this.map.addLayer(layer)

最终效果

加载发现没有贴地,悬浮了一定高度
mapbox加载3dtiles,mapbox,deck.gl,javascript
向下调整位置
let mMtx=new core_1.Matrix4().makeTranslation(1,1,-200) tileset.modelMatrix=mMtx
mapbox加载3dtiles,mapbox,deck.gl,javascript

源码分析

在deck.gl例子中只给了加载CesiumIonLoader,在线的3dtiles,但是我们想加载自己部署发布的3dtiles,查看源码发现
mapbox加载3dtiles,mapbox,deck.gl,javascript
Tiles3DLoader可以使用

MapboxLayer其实是对mapbox中的customLayer的进一步封装,实例化其实就是customLayer图层

mapbox-layer.js

import { getDeckInstance, addLayer, removeLayer, updateLayer, drawLayer } from './deck-utils';
export default class MapboxLayer {
  constructor(props) {
    if (!props.id) {
      throw new Error('Layer must have an unique id');
    }
    this.id = props.id;
    // mapbox中custom类型图层
    this.type = 'custom';
    // 3d模式
    this.renderingMode = props.renderingMode || '3d';
    this.map = null;
    this.deck = null;
    this.props = props;
  }
  // mapbox中添加图层触发盖事件 this.map.addLayer(layer)
  onAdd(map, gl) {
    this.map = map;
    //实例化deck
    this.deck = getDeckInstance({
      map,
      gl,
      deck: this.props.deck
    });
    //addLayer → updateLayers
    addLayer(this.deck, this);
  }
  onRemove() {
    removeLayer(this.deck, this);
  }
  setProps(props) {
    Object.assign(this.props, props, {
      id: this.id
    });
    if (this.deck) {
      updateLayer(this.deck, this);
    }
  }
  render(gl, matrix) {
    drawLayer(this.deck, this.map, this);
  }
}

deck-utils.js

function updateLayers(deck) {
  if (deck.props.userData.isExternal) {
    return;
  }
  const layers = [];
  let layerIndex = 0;
  deck.props.userData.mapboxLayers.forEach(deckLayer => {
    const LayerType = deckLayer.props.type;
    // 实例化图层,本案例加载LayerType:Tile3DLayer tile-3d-layer.js
    const layer = new LayerType(deckLayer.props, {
      _offset: layerIndex++
    });
    layers.push(layer);
  });
  deck.setProps({
    layers
  });
}

tile-3d-layer.js
mapbox加载3dtiles,mapbox,deck.gl,javascript

mapbox加载3dtiles,mapbox,deck.gl,javascript

mapbox加载3dtiles,mapbox,deck.gl,javascript
tileset-3d.js
mapbox加载3dtiles,mapbox,deck.gl,javascript
mapbox加载3dtiles,mapbox,deck.gl,javascript

相关下载及参考文档

demo代码下载
osgb格式倾斜摄影数据下载
链接:https://pan.baidu.com/s/1_FPxf1niJT2DoD7vGsdd-g
提取码:zwd3

mapbox加载3d模型
deck.gl加载3dtiles

最后打个广告吧,自己花了好几个月写了一个基于mapbox的gis框架,下载地址,能很方便大家学习,也很容易应用到gis展示的项目中,感兴趣加我QQ了解文章来源地址https://www.toymoban.com/news/detail-782402.html

到了这里,关于mapbox+deck.gl加载倾斜摄影模型3dtiles的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • threejs加载3dtiles(倾斜摄影)数据

    使用npm 安装  或者去官网下载都行 GitHub - NASA-AMMOS/3DTilesRendererJS: Renderer for 3D Tiles in Javascript using three.js 首先引入,在填入3dtiles数据的地址,可以是文件路径也可以是网站路径 const tilesRenderer = new TilesRenderer( \\\'./path/to/tileset.json\\\' ); const tilesRenderer = new TilesRenderer( \\\'http://192.168.1.

    2024年02月16日
    浏览(30)
  • Unity加载3dTile倾斜摄影数据(WebGL)

    1.支持.b3dm(3dtile)格式倾斜摄影数据加载,支持osgb格式倾斜摄影数据加载 2.支持编辑器下加载预览,方便进行场景编辑 3.支持海量的数据量加载 4.多线程LOD算法动态加载卸载 5.支持urp,hdrp等渲染管线 6.支持PC,WebGL,Android平台发布 qq交流:1749568798 +VX : huazaikv 相关视频: unity

    2024年02月11日
    浏览(35)
  • vue3结合Cesium加载倾斜摄影3dtiles

            这篇文章主要是为了记录加载3dtiles时模型与地形有时候存在一些高度上的差异,为此将解决方法做一个记录,便于其他读者使用。         加载倾斜摄影3dtitle           调整倾斜摄影高度         调用方式:

    2024年02月02日
    浏览(34)
  • 非专业无人机进行倾斜摄影并且通过cesium加载

    大多数倾斜摄影都是用大疆精灵或者别的比较专业的无人机进行测量,但是我就遇到了设备受限的情况,只能用大疆御2Pro来进行测量,因为怕炸机损坏了自己要赔偿,也没有用荔枝(Litchi)等航测软件,并且没有条件来打像控点,因为没有RTK等设备,所以这次是相当于非专业

    2024年02月07日
    浏览(38)
  • Cesium结合GIS天地图 加载倾斜摄影3dtile + vue3

    将倾斜摄影OSGB数据转换为3dtile(转换方式很多,可以利用第三方工具cesiumlab) 利用Cesium加载GIS地图,我这里使用的是天地图,可以加载其他地图都行 加载3dtile数据到地图中展示 以加载天地图为例,需要先到天地图官网去申请开发者,获取一个token,以下代码直接粘贴就行,注释

    2024年02月11日
    浏览(35)
  • 倾斜摄影三维模型数据几何坐标重建方法分析

    利用几何坐标变换等技术实现倾斜摄影三维模型数据的坐标重建,可以采用以下方法: 1、数据准备:首先,需要获取倾斜摄影影像数据。这些影像应包含多个视角下的拍摄图像,并覆盖同一场景。同时,还需要收集地面控制点的坐标信息,以提供参考和配准基准。 2、特征提

    2024年02月06日
    浏览(30)
  • 【UE5 Cesium】14-Cesium for Unreal 加载服务器上的倾斜摄影

    目录 前言  步骤 一、下载安装tomcat 10 二、下载安装JDK 三、启动Tomcat 四、Tomcat加载倾斜摄影 五、UE中加载Tomcat上的倾斜摄影         上一篇文章(【UE5 Cesium】13-Cesium for Unreal 加载本地倾斜摄影)介绍了如何在UE中加载本地倾斜摄影,本文在该文章基础上继续介绍如何在将

    2024年02月12日
    浏览(33)
  • 常用的倾斜摄影三维模型3DTILES格式优缺点分析

     三维模型3DTILES格式是一种用于描述三维模型和场景数据的标准格式,具有以下优点和缺点: 优点: 1、多平台支持:3DTILES格式基于WebGL和JavaScript技术,可以在多个平台上运行,包括PC、移动设备、云服务器等。这为三维数据可视化和呈现提供了更广泛的应用空间。 2、数据

    2024年02月06日
    浏览(36)
  • 基于Node.js的3DTiles三维倾斜摄影模型爬虫

    随着小型无人机的普及,乡村级的倾斜摄影模型构建已经越来越简单。一个无人机和一名飞手2个小时内就可以完成。在做WebGIS和Cesium开发时,3DTiles是一种常用的倾斜摄影三维模型的切片格式。3DTiles格式通常有散列和紧凑两种文件组织形式,其中不同工具生成的散列数据使用

    2023年04月17日
    浏览(29)
  • 如何提高倾斜摄影超大场景的三维模型轻量化处理速度和效率?

     倾斜摄影超大场景的三维模型轻量化处理是将高精度的三维模型进行降采样、简化等处理,以达到减少数据大小和提高渲染性能的目的。为了提高轻量化处理速度,可以从以下方面入手: 1、选择合适的轻量化算法。当前已有很多成熟的三维模型轻量化算法,如基于多分辨率

    2024年02月01日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包