QGIS合并相邻建筑shp面,CesiumLab将shp切为3dtiles,使用Cesium展示

15 篇文章 15 订阅

在这里插入图片描述
在这里插入图片描述

前言

拿到了一份建筑物数据,是shp格式,由于自己是生活在兰州,便下载了兰州市的shapefile数据,尝试使用CesiumLab去处理此数据,多次未成功!
weixin公众号【图说GIS】
原始数据获取及模型制作请看《全网最快的建筑物白膜生成教程,附62个城市建筑物矢量数据》,由GIS领域非常专业的一位UP主制作,主要讲建筑物白膜生成教程,并附加62个城市建筑物矢量数据。
最终发现问题是里面的一部分面比较碎,需要合并处理。由于自己还未安装iDesktopX,不过截至现在已经下载下来了。便尝试用QGIS处理一下。
在这里插入图片描述
在这里插入图片描述

处理方法

  1. 工具:Processing Toolbox->Vector geometry->Dissolve

    Input layer 选择要进行合并的图层
    Dissolve fields 选择合并参考的楼层字段
    Dissolved 选择创建临时图层或保存为文件
    点击“Run”运行
    在这里插入图片描述
    在这里插入图片描述
    处理结果如下:
    在这里插入图片描述
    在这里插入图片描述

  2. 拆分(Multipart to singleparts)
    工具:Processing Toolbox->Vector geometry->Multipart to singleparts

    Input layer 选择刚才合并生成的图层
    Single parts 选择创建临时图层或保存为文件
    点击“Run”运行
    在这里插入图片描述
    处理结果
    在这里插入图片描述

CesiumLab切shp为3dtiles

有dem数据的可以在这里导入dem,对于模型贴地有很重要的作用
cesiumlab2
在这里插入图片描述
cesiumlab3
在这里插入图片描述

在这里插入图片描述

Cesium展示

Cesium除了3dtiles可以展示geojson,但对于上述数据,数据量太大,不适合展示。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <link href="../../Cesium/Widgets/widgets.css" rel="stylesheet">
    <script type="text/javascript" src="../../Cesium/Cesium.js"></script>

    <script src="../config.js"></script>
    <title>兰州建筑模型展示</title>
</head>

<body style="margin: 0px;width:100%;height:100%;">
    <div id="cesiumContainer" style="width:100%;height:100%;position:absolute;"></div>
</body>
<script>
    //created by onegiser at 2021-11-05
    const key="天地图key"
    const viewer = new Cesium.Viewer('cesiumContainer', {
        imageryProviderViewModels: [
            new Cesium.ProviderViewModel({
                name: "天地图影像",
                iconUrl: "/imgs/map/tdt_img.jpg",
                tooltip: "",
                creationFunction: () => {
                     const imgImageryProvider = new Cesium.WebMapTileServiceImageryProvider({
                        url: "http://t{s}.tianditu.com/img_c/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=" + key,
                         subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
                        tilingScheme: new Cesium.GeographicTilingScheme(),
                         tileMatrixLabels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"]
                    })
                    return [imgImageryProvider]
                }
            }),
        ],
        terrainProvider: new Cesium.CesiumTerrainProvider({
            url: 'https://www.supermapol.com/realspace/services/3D-stk_terrain/rest/realspace/datas/info/data/path'
        })
    })

    const setHeight = (tileSet, height) => {
        const cartographic = Cesium.Cartographic.fromCartesian(tileSet.boundingSphere.center);
        const surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height);
        const offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height + height);
        const translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
        tileSet.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
    }

    const setStyle = (_3DTileset) => {
        _3DTileset.style = new Cesium.Cesium3DTileStyle({
            color: {
                conditions: [
                    ['${Floor} >= 30', 'rgba(45, 0, 75, 1)'],
                    ['${Floor} >= 25', 'rgba(102, 71, 151, 1)'],
                    ['${Floor} >= 20', 'rgba(170, 162, 204, 1)'],
                    ['${Floor} >= 15', 'rgba(224, 226, 238, 1)'],
                    ['${Floor} >= 10', 'rgba(252, 230, 200, 1)'],
                    ['${Floor} >= 5', 'rgba(248, 176, 87, 1)'],
                    ['${Floor} >= 3', 'rgba(198, 106, 11, 1)'],
                    ['true', 'rgba(127, 59, 8, 1)']
                ]
            }
        });
    }
    const setStyle2 = (_3DTileset) => {
        _3DTileset.style = new Cesium.Cesium3DTileStyle({
            color: {
                conditions: [
                    ["true", "color('cyan')"]
                ]
            }
        });
    }

    const _3DTileset = new Cesium.Cesium3DTileset({
        url: "/data/3dtiles/tileset.json"
    })
    _3DTileset.readyPromise.then(function (argument) {
        viewer.scene.primitives.add(_3DTileset)
        setStyle2(_3DTileset)
        setHeight(_3DTileset,-30)
        viewer.flyTo(_3DTileset)
    })
</script>

</html>

在这里插入图片描述

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值