Создание и загрузка больших 3D объектов в Цезий
Я пытаюсь создать и загрузить 3D-объекты в Цезий. Мне нужно создать эти объекты программно (с помощью некоторого сервиса импорта-преобразования, используемой платформы.NET) из разных источников.
У меня есть опыт сделать это в ТРИ. Я читаю файл DXF, конвертирую объекты в геометрии PostGIS, триангулирую (для создания поверхности из данных высот), создаю геометрию тесселяции и, наконец, создаю THREEJS-совместимую сцену (формат JSON, Gzipped, THREE.BufferGeometry). Это работает очень хорошо: нет проблем с загрузкой тысяч треугольников / точек. Иногда я использую веб-работников только для запроса и анализа JSON.
Кроме того, я смог без проблем загрузить довольно большой (40 МБ) geojson в мое клиентское приложение OpenLayers (Map и WebGLMap)
Но я не могу загрузить даже 20 МБ геоджонов (полилиний) в цезий (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 для загрузки сложных геометрий, использования полилиний и т. Д.)?
0 ответов
Возможно, это не лучший вариант для получения модели поверхности из цезия, но мне удается визуализировать модели поверхности с помощью полигонального объекта в цезии. Если вы создаете модель поверхности с помощью триангуляции Делоне с опцией 2, что означает TIN, вы можете получить каждый отдельный треугольник, создающий поверхность. Просто сбросьте все точки, из которых строятся треугольники, и вы получите правильно упорядоченные точки для визуализации поверхности. Остальное - это цикл по точкам и создание многоугольников. Допустим, вы экспортируете точки из postgis как geojson, тогда вам нужно перебрать свои точки три на три, потому что один треугольник содержит 3 точки;
Мы можем использовать объект многоугольника в цезии с perPositionHeight
вариант верный. Таким образом, код в 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
}
})
}