I3SFeature
是 CesiumJS 中的一个接口,可以用于展示实例化 3D (I3S) 数据中的要素(feature)。I3S 数据是 Esri 公司开发的一种基于 REST 的可视化 GIS 格式。它采用数据压缩、分级裁剪等技术,使得在浏览器中展示大规模的空间数据变得更加高效。
要创建一个 I3SFeature
,需要提供数据源的 URL 和属性索引器(attributes indexer)。属性索引器是一个按照属性名索引对应属性值的对象,例如:
const attributes = {
OBJECTID: 123,
NAME: 'test',
TYPE: 'building',
HEIGHT: 50,
...
};
现假设有一个 I3S 数据在 https://i3s.esri.com/arcgis/rest/services/Hosted/BuildingSceneLayers/SceneServer/layers/0
,属性索引器中的属性和 I3S 数据中的特征属性相符,可以这样创建一个 I3SFeature
:
const feature = new Cesium.I3SFeature({
url: 'https://i3s.esri.com/arcgis/rest/services/Hosted/BuildingSceneLayers/SceneServer/layers/0',
attributes: attributes
});
I3SFeature
还支持设置一些样式和交互属性。例如,可以针对该要素设置选中的颜色:
feature.color = Cesium.Color.BLUE;
feature.selectedColor = Cesium.Color.GREEN;
如果该要素支持移动,可以设置它的位置、缩放和旋转:
feature.position = new Cesium.Cartesian3(0, 0, 0);
feature.scale = new Cesium.Cartesian3(1, 1, 1);
feature.orientation = Cesium.Transforms.headingPitchRollQuaternion(
new Cesium.Vector3(0, 0, 0),
new Cesium.HeadingPitchRoll(0, 0, 0)
);
创建好 I3SFeature
后,就可以将它添加到 Cesium
场景中了。例如,将 feature
添加到 Cesium
Entity 中:
const entity = viewer.scene.entities.add({
name: 'My I3S feature',
feature: feature
});
也可以将其添加到独立的 Cesium
Primitive 中:
const primitive = new Cesium.Primitive({
geometryInstances: new Cesium.GeometryInstance({
geometry: feature,
attributes: feature.attributes,
}),
appearance: new Cesium.EllipsoidSurfaceAppearance({
material: new Cesium.Material({
fabric: {
type: 'Color',
uniforms: {
color: Cesium.Color.WHITE,
},
},
}),
}),
});
viewer.scene.primitives.add(primitive);
I3SFeature
支持多种事件。例如,可以监听其被选中的事件:
feature.selected = true;
feature.addEventListener(Cesium.I3SFeatureEventType.SELECTED_CHANGED, function() {
console.log('I3SFeature is selected:', feature.selected);
});
feature.addEventListener(Cesium.I3SFeatureEventType.RIGHT_CLICK, function() {
console.log('I3SFeature is right clicked:', feature);
});
当不再需要 I3SFeature
时,应该将其销毁以释放资源:
feature.destroy();