2

我正在尝试创建 3D 对象并将其加载到 Cesium 中。我需要从各种来源以编程方式创建这些对象(通过使用一些导入转换服务,使用.NET平台)

我有在 THREEJS 中做这件事的经验。我读取 DXF 文件,将实体转换为 PostGIS 几何图形,三角测量(从高程数据创建表面),镶嵌几何图形,最后构建与 THREEJS 兼容的场景(JSON 格式,Gzipped,使用 THREE.BufferGeometry)。这很好用:加载成千上万的三角形/点没有问题。有时我使用 webworkers 只是为了请求和解析 JSON。

此外,我能够毫无问题地将相当大的(40mb)geojson 加载到我的 OpenLayers 客户端应用程序中(地图和 WebGLMap)

但我什至无法将 20mb geojson(折线)加载到铯(1.51.0)中!

viewer.dataSources.add(Cesium.GeoJsonDataSource.load('data/geojson/test1.geojson'));

给我

An error occurred while rendering. Rendering has stopped.
RangeError: Array buffer allocation failed
RangeError: Array buffer allocation failed
    at arrayBufferConstructor_DoNotInitialize (<anonymous>)
    at new Float64Array (<anonymous>)
    at Object.o.createTypedArray (http://localhost:9090/public/ThirdParty/Cesium/Workers/combineGeometry.js:227:18570)
    at H (http://localhost:9090/public/ThirdParty/Cesium/Workers/combineGeometry.js:230:21640)
    at j (http://localhost:9090/public/ThirdParty/Cesium/Workers/combineGeometry.js:230:22200)
    at ne (http://localhost:9090/public/ThirdParty/Cesium/Workers/combineGeometry.js:230:30083)
    at Object.ae.splitLongitude (http://localhost:9090/public/ThirdParty/Cesium/Workers/combineGeometry.js:231:7036)
    at v (http://localhost:9090/public/ThirdParty/Cesium/Workers/combineGeometry.js:231:10398)
    at Object.M.combineGeometry (http://localhost:9090/public/ThirdParty/Cesium/Workers/combineGeometry.js:231:13298)
    at r (http://localhost:9090/public/ThirdParty/Cesium/Workers/combineGeometry.js:231:18552)

这是为什么?我能做些什么?GLTF/GLB/3D 瓦片是相当复杂的格式。没有丰富的工具集可以使用这些格式自定义/控制对象创建。我不想购买超级(真的)FME 服务器来创建 GLTF...也许我可以使用 czml 加载复杂的几何图形,使用折线等)?

4

1 回答 1

1

这可能不是将表面模型放入铯中的最佳选择,但我设法通过铯中的多边形实体来可视化表面模型。如果您使用带有选项 2(即 TIN)的Delaunay 三角剖分创建曲面模型,您可以获得创建曲面的每个单独的三角形。只需转储构建三角形的所有点,您将获得适当的有序点来可视化表面。它的其余部分是循环通过点并创建多边形。假设您将 postgis 中的点导出为 geojson,那么您需要三三个点遍历您的点,因为一个三角形包含 3 个点;

我们可以在铯中使用多边形实体,perPositionHeight选项为 true。所以代码在JS中可能是这样的;

for (var i = 0; i < designSurface.coordinates.length; i += 4) {
viewer.entities.add({
    parent: design,
    name: 'Cyan vertical polygon with per-position heights and outline',
    polygon: {
        hierarchy: Cesium.Cartesian3.fromDegreesArrayHeights([
            ...designSurface.coordinates[i],
            ...designSurface.coordinates[i + 1],
            ...designSurface.coordinates[i + 2],
        ]),
        perPositionHeight: true,
        material: Cesium.Color.CYAN.withAlpha(0.5),
        outline: true,
        outlineColor: Cesium.Color.BLACK,
        heightReference: Cesium.HeightReference.RELATIVE_TO_GROUND
    }
})

}

于 2020-06-14T18:38:05.877 回答