From c20644ad462b6eecff39361881bc41d33d801f4a Mon Sep 17 00:00:00 2001 From: cavencj Date: Fri, 18 Oct 2024 17:10:25 +0800 Subject: [PATCH] add i3s layer --- examples/layer/i3s.html | 50 ++++++++++++++ examples/layer/tileset.html | 73 +++++++++++---------- examples/list.js | 6 ++ examples/model/3dtiles_shp.html | 97 ++++++++++++++-------------- examples/model/i3s.html | 50 ++++++++++++++ src/modules/index.js | 2 + src/modules/layer/index.js | 1 + src/modules/layer/type/I3SLayer.js | 37 +++++++++++ src/modules/overlay/Overlay.js | 12 ++-- src/modules/overlay/index.js | 2 +- src/modules/overlay/model/I3S.js | 43 ++++++++++++ src/modules/overlay/model/Tileset.js | 11 ++++ src/modules/utils/Util.js | 9 +++ 13 files changed, 301 insertions(+), 92 deletions(-) create mode 100644 examples/layer/i3s.html create mode 100644 examples/model/i3s.html create mode 100644 src/modules/layer/type/I3SLayer.js create mode 100644 src/modules/overlay/model/I3S.js diff --git a/examples/layer/i3s.html b/examples/layer/i3s.html new file mode 100644 index 00000000..c32d73cf --- /dev/null +++ b/examples/layer/i3s.html @@ -0,0 +1,50 @@ + + + + + + dc-example + + + + + + +
+ + + diff --git a/examples/layer/tileset.html b/examples/layer/tileset.html index 594fef00..9ee7e201 100644 --- a/examples/layer/tileset.html +++ b/examples/layer/tileset.html @@ -1,42 +1,41 @@ + + + + dc-example + + + + - - - - dc-example - - - - - - - -
- - + DC.ready({ + baseUrl: '../libs/dc-sdk/resources/', + }).then(initViewer) + + diff --git a/examples/list.js b/examples/list.js index 92af3bef..bdd132b0 100644 --- a/examples/list.js +++ b/examples/list.js @@ -261,6 +261,10 @@ const EXAMPLE_LIST = [ name: '栅格瓦片图层(数据图层)', page: 'raster_tile.html', }, + { + name: 'i3s模型图层', + page: 'i3s.html', + }, ], }, { @@ -539,6 +543,8 @@ const EXAMPLE_LIST = [ name: '3dtiles-样式和自定shader', page: '3dtiles_style_and_shader.html', }, + + { name: 'i3s', page: 'i3s.html' }, ], }, { diff --git a/examples/model/3dtiles_shp.html b/examples/model/3dtiles_shp.html index e897436b..828bbb5f 100644 --- a/examples/model/3dtiles_shp.html +++ b/examples/model/3dtiles_shp.html @@ -1,53 +1,54 @@ + + + + dc-example + + + + - - - - dc-example - - - - + +
+ - + function initViewer() { + viewer = new DC.Viewer('viewer-container') + let baseLayer = DC.ImageryLayerFactory.createImageryLayer( + DC.ImageryType.AMAP, + { + style: 'img', + crs: 'WGS84', + } + ) + viewer.addBaseLayer(baseLayer) + let layer = new DC.TilesetLayer('layer') + viewer.addLayer(layer) + let tileset = new DC.Tileset( + '//resource.dvgis.cn/data/3dtiles/ljz/tileset.json' + ) + let style = new DC.TilesetStyle() + style.color = { + conditions: [ + ['${Height} >= 300', 'rgba(45, 0, 75, 0.5)'], + ['${Height} >= 200', 'rgb(102, 71, 151)'], + ['${Height} >= 100', 'rgb(170, 162, 204)'], + ['${Height} >= 50', 'rgb(224, 226, 238)'], + ['${Height} >= 25', 'rgb(252, 230, 200)'], + ['${Height} >= 10', 'rgb(248, 176, 87)'], + ['${Height} >= 5', 'rgb(198, 106, 11)'], + ['true', 'rgb(127, 59, 8)'], + ], + } + tileset.setStyle(style) + layer.addOverlay(tileset) + viewer.flyTo(tileset) + } + DC.ready({ + baseUrl: '../libs/dc-sdk/resources/', + }).then(initViewer) + + diff --git a/examples/model/i3s.html b/examples/model/i3s.html new file mode 100644 index 00000000..c32d73cf --- /dev/null +++ b/examples/model/i3s.html @@ -0,0 +1,50 @@ + + + + + + dc-example + + + + + + +
+ + + diff --git a/src/modules/index.js b/src/modules/index.js index 3102ca18..24ede450 100644 --- a/src/modules/index.js +++ b/src/modules/index.js @@ -45,6 +45,7 @@ export { GraticuleLayer, GroundPrimitiveLayer, HtmlLayer, + I3SLayer, KmlLayer, LabelLayer, PrimitiveLayer, @@ -66,6 +67,7 @@ export { DivIcon, Model, Tileset, + I3S, AttackArrow, DoubleArrow, FineArrow, diff --git a/src/modules/layer/index.js b/src/modules/layer/index.js index cf992390..8d88435b 100644 --- a/src/modules/layer/index.js +++ b/src/modules/layer/index.js @@ -18,6 +18,7 @@ export { default as GpxLayer } from './type/GpxLayer' export { default as GraticuleLayer } from './type/GraticuleLayer' export { default as GroundPrimitiveLayer } from './type/GroundPrimitiveLayer' export { default as HtmlLayer } from './type/HtmlLayer' +export { default as I3SLayer } from './type/I3SLayer' export { default as KmlLayer } from './type/KmlLayer' export { default as LabelLayer } from './type/LabelLayer' export { default as PrimitiveLayer } from './type/PrimitiveLayer' diff --git a/src/modules/layer/type/I3SLayer.js b/src/modules/layer/type/I3SLayer.js new file mode 100644 index 00000000..502a2ebc --- /dev/null +++ b/src/modules/layer/type/I3SLayer.js @@ -0,0 +1,37 @@ +/** + * @Author : Caven Chen + */ + +import { Cesium } from '../../../namespace' +import State from '../../state/State' +import Layer from '../Layer' + +/** + * I3SLayer is used to add various I3S + */ +class I3SLayer extends Layer { + constructor(id) { + super(id) + this._delegate = new Cesium.PrimitiveCollection() + this._state = State.INITIALIZED + } + + get type() { + return Layer.getLayerType('i3s') + } + + /** + * Clear all tileset + * @returns {I3SLayer} + */ + clear() { + this._delegate.removeAll() + this._cache = {} + this._state = State.CLEARED + return this + } +} + +Layer.registerType('i3s') + +export default I3SLayer diff --git a/src/modules/overlay/Overlay.js b/src/modules/overlay/Overlay.js index ae24dd77..f298ddd8 100644 --- a/src/modules/overlay/Overlay.js +++ b/src/modules/overlay/Overlay.js @@ -43,11 +43,11 @@ class Overlay { set show(show) { this._show = show - if(this._delegate && this._delegate.then){ + if (Util.isPromise(this._delegate)) { this._delegate.then((obj) => { obj.show = this._show }) - }else { + } else { this._delegate && (this._delegate.show = this._show) } } @@ -185,8 +185,8 @@ class Overlay { if (this['update'] && this['destroy']) { this._layer.delegate.add(this) } - } else if (this._delegate && this._delegate.then) { - // for 3dtiles + } else if (Util.isPromise(this._delegate)) { + // for 3d-tiles and i3s this._delegate.then((obj) => { this._layer.delegate.add(obj) }) @@ -221,8 +221,8 @@ class Overlay { if (this['update'] && this['destroy']) { this._layer.delegate.remove(this) } - } else if (this._delegate && this._delegate.then) { - // for 3dtiles + } else if (Util.isPromise(this._delegate)) { + // for 3d-tiles and i3s this._delegate.then((obj) => { this._layer.delegate.remove(obj) }) diff --git a/src/modules/overlay/index.js b/src/modules/overlay/index.js index e72a7cd2..e9907dd5 100644 --- a/src/modules/overlay/index.js +++ b/src/modules/overlay/index.js @@ -26,6 +26,7 @@ export { default as DivIcon } from './html/DivIcon' * model */ export { default as Model } from './model/Model' +export { default as I3S } from './model/I3S' export { default as Tileset } from './model/Tileset' /** @@ -49,7 +50,6 @@ export { default as ElecEllipsoidPrimitive } from './primitive/ElecEllipsoidPrim export { default as FlowLinePrimitive } from './primitive/FlowLinePrimitive' export { default as LabelPrimitive } from './primitive/LabelPrimitive' export { default as LightCylinderPrimitive } from './primitive/LightCylinderPrimitive' -// export { default as ModelCollectionPrimitive } from './primitive/ModelCollectionPrimitive' export { default as ModelPrimitive } from './primitive/ModelPrimitive' export { default as PointPrimitive } from './primitive/PointPrimitive.js' export { default as PolylinePrimitive } from './primitive/PolylinePrimitive.js' diff --git a/src/modules/overlay/model/I3S.js b/src/modules/overlay/model/I3S.js new file mode 100644 index 00000000..02c90def --- /dev/null +++ b/src/modules/overlay/model/I3S.js @@ -0,0 +1,43 @@ +/** + * @Author : Caven Chen + */ + +import { Cesium } from '../../../namespace' +import Overlay from '../Overlay' +import State from '../../state/State' + +class I3S extends Overlay { + constructor(url, options = {}) { + super() + this._delegate = Cesium.I3SDataProvider.fromUrl(url, options) + this._state = State.INITIALIZED + } + + get type() { + return Overlay.getOverlayType('i3s') + } + + /** + * + * @param {*} callback + * @returns + */ + ready(callback) { + this._delegate.then(callback) + return this + } + + /** + * + * @param {*} text + * @param {*} textStyle + */ + setLabel(text, textStyle) { + console.warn('not support this function') + return this + } +} + +Overlay.registerType('i3s') + +export default I3S diff --git a/src/modules/overlay/model/Tileset.js b/src/modules/overlay/model/Tileset.js index 58b24931..f122b3ed 100644 --- a/src/modules/overlay/model/Tileset.js +++ b/src/modules/overlay/model/Tileset.js @@ -66,6 +66,16 @@ class Tileset extends Overlay { } } + /** + * + * @param {*} callback + * @returns + */ + ready(callback) { + this._delegate.then(callback) + return this + } + /** * Sets position * @param position @@ -123,6 +133,7 @@ class Tileset extends Overlay { * @param {*} textStyle */ setLabel(text, textStyle) { + console.warn('not support this function') return this } diff --git a/src/modules/utils/Util.js b/src/modules/utils/Util.js index 1bc9b82c..9bc5d4ee 100644 --- a/src/modules/utils/Util.js +++ b/src/modules/utils/Util.js @@ -170,6 +170,15 @@ class Util { } return new Blob([u8Arr], { type: mime }) } + + /** + * + * @param {*} obj + * @returns + */ + static isPromise(obj) { + return Promise.resolve(obj) == obj + } } export default Util