/** * 户型图 图层 * @class HuxingLayer * @extends {mars3d.layer.GraphicLayer} */ class HuxingLayer extends mars3d.layer.GraphicLayer { /** * 对象添加到地图前创建一些对象的钩子方法, * 只会调用一次 * @return {void} 无 */ _mountedHook() {} /** * 对象添加到地图上的创建钩子方法, * 每次add时都会调用 * @return {void} 无 */ _addedHook() { super._addedHook(); this.load(); this.on(mars3d.EventType.click, this._graphic_clickHandler, this); this._map.on(mars3d.EventType.clickMap, this._map_clickHandler, this); this.on(mars3d.EventType.mouseOver, this._graphic_mouseOverHandler, this); this.on(mars3d.EventType.mouseOut, this._graphic_mouseOutHandler, this); } /** * 对象从地图上移除的创建钩子方法, * 每次remove时都会调用 * @return {void} 无 */ _removedHook() { super._removedHook(); this.off(mars3d.EventType.click, this._graphic_clickHandler, this); this._map.off(mars3d.EventType.clickMap, this._map_clickHandler, this); this.off(mars3d.EventType.mouseOver, this._graphic_mouseOverHandler, this); this.off(mars3d.EventType.mouseOut, this._graphic_mouseOutHandler, this); } //加载数据 load(newOptions = {}) { this.options = { ...this.options, ...newOptions, }; if (this.options.url) { Cesium.Resource.fetchJson(this.options) .then((data) => { if (this._state == mars3d.State.REMOVED) { return; } this._load_data(data); }) .otherwise(function (error) { this.showError("服务出错", error); }); } else if (this.options.data) { this._load_data(this.options.data); } else { console.warn("HuxinLayer:没有传入 url 或 data 参数,请确认是否有误。"); } } _load_data(geojson) { this.clear(); this._cache_huxin = {}; let arr = mars3d.Util.geoJsonToGraphics(geojson); //解析geojson for (let i = 0; i < arr.length; i++) { this.addHuxing(arr[i].positions, arr[i].attr); } if (this.options.flyTo) { this.flyTo({ scale: 2 }); } this.fire(mars3d.EventType.load); } addHuxing(positions, attr) { if (!positions || positions.length == 0) { return; } var flrH = attr.floorh || 0; //底面高度 var lyrH = attr.layerh || 0; //楼层高度 var primitiveBian = new mars3d.graphic.CorridorPrimitive({ positions: positions, style: { height: flrH, diffHeight: lyrH, width: 0.2, cornerType: Cesium.CornerType.MITERED, color: "rgb(245,255,250)", }, attr: attr, }); this.addGraphic(primitiveBian); var primitiveDi = new mars3d.graphic.PolygonEntity({ positions: positions, style: { height: flrH, diffHeight: 0.1, color: "rgb(211,211,211)", outline: true, outlineWidth: 1, outlineColor: "#778899", }, attr: attr, }); this.addGraphic(primitiveDi); //记录到缓存中 var loudongHao = attr.LDH; //楼栋号 var cengHao = attr.CH; //层号 this._cache_huxin[loudongHao] = this._cache_huxin[loudongHao] || {}; this._cache_huxin[loudongHao][cengHao] = this._cache_huxin[loudongHao][cengHao] || []; this._cache_huxin[loudongHao][cengHao].push(primitiveBian); this._cache_huxin[loudongHao][cengHao].push(primitiveDi); } _graphic_clickHandler(event) { //将上次隐藏的层,恢复下 this._map_clickHandler(); var attr = event.graphic.attr; var loudongHao = attr.LDH; //楼栋号 var cengHao = attr.CH; //层号 let loudongGraphics = this._cache_huxin[loudongHao]; Object.keys(loudongGraphics).forEach((ceng) => { let showHu = Number(ceng) <= cengHao; //大于本层的隐藏不显示。 let cengGraphics = loudongGraphics[ceng]; cengGraphics.forEach((huGraphic) => { huGraphic.show = showHu; if (!showHu) { this._lastHideGraphics.push(huGraphic); } }); }); } _map_clickHandler(event) { //将上次隐藏的层,恢复下 if (this._lastHideGraphics) { this._lastHideGraphics.forEach((huGraphic) => { huGraphic.show = true; }); } this._lastHideGraphics = []; } _graphic_mouseOverHandler(event) { var graphic = event.graphic; this.openSmallTooltip(event.windowPosition, graphic.attr.WZ); } _graphic_mouseOutHandler(event) { this.closeSmallTooltip(); } }