官网上有相关的案例,但是官网上的是需要用户手动去点击地图才能进行添加(目前我看到的是这种类型)。我的需求是地图一加载就自动添加到地图上,无需用户再次手动点击。直接上代码。
methods: {
loadGlbModel() {
loadModules([
"esri/symbols/PointSymbol3D",
"esri/symbols/ObjectSymbol3DLayer",
"esri/widgets/Expand",
"esri/Graphic",
"esri/layers/GraphicsLayer",
]).then(
([
PointSymbol3D,
ObjectSymbol3DLayer,
Expand,
Graphic,
GraphicsLayer,
]) => {
// 添加模型
this.$graphicsLayer = new GraphicsLayer();
this.$map.add(this.$graphicsLayer);
const modelSymbol = new PointSymbol3D({
symbolLayers: [
new ObjectSymbol3DLayer({
resource: {
href: "xxx.glb", // 你的glb模型的url
},
}),
],
});
const modelGraphic = new Graphic({
geometry: {
type: "point",
// 指定加载的经纬度和高度
longitude: 108.959419,
latitude: 34.219819,
// 高度可以先设置高一点,以免模型嵌入地下
z: 450,
spatialReference: this.$view.spatialReference,
},
symbol: modelSymbol,
});
this.$graphicsLayer.add(modelGraphic);
// 移动视角到加载处,以免模型太小看不见
this.$view.goTo({
zoom: 20,
center: [108.959419, 34.219819],
});
}
);
}
},
代码中的$xxx都是我防止vue规避监听的作用,具体可以参考我的另外一篇关于cesium的文章(Vue2解决cesium动画卡顿_cesium加载大量entity_XFIRR的博客-CSDN博客)。
要清除小部件,我以legend举例。
this.$view.ui.empty("top-right");
// 方式一:清除之后可能显示一个无图例的小部件在右上角
this.$view.ui.remove(this.$heatMapLegend,"bottom-right");
// 方式二: 清楚后将整个heatMapLegend全部清除,不会留有无图例的小部件。可以根据需求自行选择