cesium加载b3dm格式的文件来实现分片式加载三维建筑物

转:https://blog.csdn.net/du_5pet/article/details/95961311?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task


刚开始用的是cesium加载geojson来达到加载三维建筑的目的,加载建筑物倒是没什么太大问题,只是建筑物还要进行贴图,如果再用geojson来加载贴图会特别卡,浏览器会崩溃,电脑会死机,于是发现官网有这种方法,加载完成之后速度特别快。而且是分片加载的,只加载视野区域内的建筑物,并且用这种方法来加载贴图也很快。但是加载之前本地必须引入xx.b3dm一个文件。否则加载不成功。

文档架构如下

代码如下

Cesium.Ion.defaultAccessToken = "官网申请的token"

var viewer = new Cesium.Viewer('cesiumContainer', {

    imageryProvider: new Cesium.ArcGisMapServerImageryProvider({

        url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer'

    }),

    animation: false,

    timeline: false,  //时间线

    fullscreenButton: true,  //全屏模式

    infoBox: false,  //要素信息框

    homeButton: false, //显示主页

    geocoder: false, //搜索位置

    sceneModePicker: true,//模式切换

    selectionIndicator: true, //展示三维的指示器

    navigationHelpButton: false, //帮助按钮

    navigationInstructionsInitiallyVisible: false

});

viewer.extend(Cesium.viewerCesiumNavigationMixin, {});  //添加指南针控件

//经度、纬度、建筑物视角高度

var initialPosition = new Cesium.Cartesian3.fromDegrees(117.11744684384189,39.128615983991416,500);

// var initialPosition = new Cesium.Cartesian3.fromDegrees(117.148,39.08135,500);

var initialOrientation = new Cesium.HeadingPitchRoll.fromDegrees(7.1077496389876024807, -31.987223091598949050, 0.025883251314950971306);

var homeCameraView = {

    destination: initialPosition,

    orientation: {

        heading: initialOrientation.heading,//围绕负z轴的旋转

        pitch: initialOrientation.pitch,//围绕负y轴的旋转

        roll: initialOrientation.roll//围绕正x轴的旋转

    }

};

viewer.scene.camera.setView(homeCameraView);  //将相机设定在特定的位置和方向

//防止地面穿透

viewer.clock.onTick.addEventListener(function () {

    if (viewer.camera.pitch > -0.5) {

        viewer.scene.screenSpaceCameraController.enableTilt = false;

    }

});

var mousePosition, startMousePosition;

var handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);

handler.setInputAction(function (movement) {

    mousePosition = startMousePosition = Cesium.Cartesian3.clone(movement.position);

    handler.setInputAction(function (movement) {

        mousePosition = movement.endPosition;

        var y = mousePosition.y - startMousePosition.y;

        // console.log(y)

        if (y > 0) {

            viewer.scene.screenSpaceCameraController.enableTilt = true;

        }

    }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

}, Cesium.ScreenSpaceEventType.MIDDLE_DOWN);

var layer = new Cesium.WebMapTileServiceImageryProvider({

    url: 'http://t0.tianditu.gov.cn/img_w/wmts?tk=42dca576db031641be0524ee977ddd04',

    layer: 'img',

    style: 'default',

    tileMatrixSetID: 'w',

    format: 'tiles',

    maximumLevel: 18

});

viewer.imageryLayers.addImageryProvider(layer);

var layer1 = new Cesium.WebMapTileServiceImageryProvider({

    url: 'http://t0.tianditu.gov.cn/cia_w/wmts?tk=42dca576db031641be0524ee977ddd04',

    layer: 'cia',

    style: 'default',

    tileMatrixSetID: 'w',

    format: 'tiles',

    maximumLevel: 18

});

viewer.imageryLayers.addImageryProvider(layer1);

以上是加载cesium默认一些鼠标事件,以及地图用的是天地图遥感影像图层。下面是加载建筑物的方法:

var tileset = new Cesium.Cesium3DTileset({

    url:"http://192.168.9.123:9002/api/folder/c942a82fcb8647d7b47c607e24ee36b4/tileset.json"

});

viewer.scene.primitives.add(tileset);

tileset.readyPromise.then(function(tileset) {

    viewer.scene.primitives.add(tileset);

    var heightOffset = 0;  //设置建筑物与地面的高度

    var boundingSphere = tileset.boundingSphere;

    var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);

    var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);

    var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, heightOffset);

    var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());

    tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);

    viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.5, -0.2, tileset.boundingSphere.radius * 1.0));

});

tileset.readyPromise.then(function(argument) {

    var position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);

    var mat = Cesium.Transforms.eastNorthUpToFixedFrame(position);

    var rotationX = Cesium.Matrix4.fromRotationTranslation(Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(heading)));

    Cesium.Matrix4.multiply(mat, rotationX, mat);

    tileset._root.transform = mat;

    viewer.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(longitude, latitude, height + 1000)});

});

tileset.style = new Cesium.Cesium3DTileStyle({

    defines: {

        latitudeRadians: 'radians(${day})'

    },

    color: {

        conditions: [

            ['${day} < 200', "color('#C6C4C4')"]

        ]

    }

});

好了,这主要就是加载三维建筑物的代码,建筑物的配色是根据生成建筑物的文件里面的建筑物属性来配色的。那个tileset.json就是建筑物的数据接口。

加载贴图跟加载三维建筑物一样,这里是把贴图接口放入一个接口里了

$.ajax({

    url: "http://192.168.9.123:8090/SelectUrl",

    type: "post",

    async: true,

    dataType: "json",

    contentType: "application/x-www-form-urlencoded; charset=utf-8",

    success: function (data) {

        console.log(data)

        console.log(typeof data)

        for (var i = 0; i < data.length; i++) {

            var url = "http://192.168.9.123:9002/api/folder/"+data[i]+"/tileset.json"

            console.log(url)

            var imagetile = new Cesium.Cesium3DTileset({

                url:url  //贴图

            });

            viewer.scene.primitives.add(imagetile);

            imagetile.style = new Cesium.Cesium3DTileStyle({

                defines: {

                    latitudeRadians: 'radians(${day})'

                },

                color: {

                    conditions: [

                        ['${day} < 30', "color('#267300')"],

                        ['${day} >= 30 && ${day} < 35', "color('#5E8C00')"],

                        ['${day} >= 35 && ${day} < 40', "color('#A8A800')"],

                        ['${day} >= 40 && ${day} < 45', "color('#C48300')"],

                        ['${day} >= 45 && ${day} < 50', "color('#E04B00')"],

                        ['${day} >= 50 && ${day} < 55', "color('#FF0000')"],

                        ['${day} >= 55 && ${day} < 60', "color('#D41923')"],

                        ['${day} >= 60 && ${day} < 65', "color('#A82236')"],

                        ['${day} >= 65 && ${day} < 70', "color('#7D250A')"],

                        ['${day} >= 70 && ${day} < 75', "color('#4F275E')"],

                        ['${day} >=  75', "color('#002673')"]

                    ]

                }

            });

        }

    },

    error: function (data) {

        console.log(data)

    }

})

最后上效果图

建筑物效果:

贴图效果:

总之用这种方式加载比加载geojson快的不是一点。

————————————————

版权声明:本文为CSDN博主「手机匿名用户」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/du_5pet/article/details/95961311

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容

  • 采用vue+cesium实现 引入js部分 importCesiumfrom"cesium/Cesium"; ex...
    开心就好哈阅读 6,552评论 0 1
  • 注:流动效果使用的图片是渐进色 1.扩展类PolylineTrailMaterialProperty (Cesiu...
    happy_port阅读 19,301评论 16 7
  • 李太白诗曰:夫天地者,万物之逆旅也;光阴者,百代之过客也。而浮生若梦,为欢几何? 愿与君相见,为欢一时即可。 又曰...
    书_路阅读 552评论 0 0
  • 世界上最美的风景就是看自己的未来! 初夏五月,来济宁见证你我的明天! 今天,你为一场盛会而来,未来,会有一场盛会为...
    青岛超凡阅读 302评论 0 0
  • 場景-徐子泓 落幕的場景 糾結愛與哀愁 晴後還下了雨 这无关痛要之淚 戲劇般的分離兩地 腳下的塵土 踏遍世間的傳奇...
    塔沙阅读 39评论 0 0