/////////////////////////////////////////////////////////////////////////// // Copyright © 2019 zhongsong. All Rights Reserved. // 模块描述: 图层管理 /////////////////////////////////////////////////////////////////////////// define([ 'dojo/_base/declare', 'dojo/_base/lang', 'dojo/_base/array', 'dojo/_base/html', 'dojo/topic', 'jimu/BaseWidget', 'jimu/utils', 'libs/layer/layer.js' ], function (declare, lang, array, html, topic, BaseWidget, aspect, string, utils, layer ) { return declare([BaseWidget], { baseClass: 'jimu-widget-Layermanagement', name: 'Layermanagement', layers: {}, LayerzNodes: [], entitys: {}, // 存放id的数组 layermanagementId: [], startup: function () { var that = this; // 暴露在外的接口 topic.subscribe("closeZtree", lang.hitch(this, this.closeZtreeBox)); this.inherited(arguments); $('#menu_switch span').click(function () { if ($('#ztree_container').is(":hidden")) { $('#ztree_container').stop().show(); } else { $('#ztree_container').stop().hide(); } topic.publish('closeMap', this.name); topic.publish('closeTool', this.name); }) $('#close_tag_bar').click(function () { $('#ztree_container').stop().hide(); }) }, closeZtreeBox: function (item) { if (item != this.name) { $('#ztree_container').stop().hide(); } }, onOpen: function () { var self = this; // this.map.scene.globe.depthTestAgainstTerrain = false; $.ajax({ url: self.folderUrl + "/datas.json", dataType: 'json', type: 'get', success: function (data) { setTimeout(function () { var parentOpen = null; var parentCheck = null; for (var i = 0; i < data.data.length; i++) { data.data[i].isOpen == 1 ? parentOpen = false : parentOpen = true; data.data[i].isCheck == 1 ? parentCheck = false : parentCheck = true; self.LayerzNodes.push({ id: data.data[i].id, pId: data.data[i].parentId, name: data.data[i].name, url: data.data[i].url, open: parentOpen, nocheck: parentCheck, }) // 存储数据得 var result = null; // 存储url最后面数字的 var layersNumber = null; // 存储 true, false var layerShow = null; // 存储除数字外的URL var layersUrl = null; for (var j = 0; j < data.data[i].children.length; j++) { result = data.data[i].children[j]; result.isCheck == 1 ? layerShow = false : layerShow = true; self.LayerzNodes.push({ id: result.id, pId: result.parentId, name: result.name, checked: layerShow, type: result.type, icon: result.icon, rendering: result.rendering, url: result.url, showheight: result.showheight }) // 从服务上 并且是服务端渲染的 的 就去添加图层 if (result.type == 1 && result.rendering == 1) { layersNumber = result.url.substring(result.url.length - 1); layersUrl = result.url.substring(0, result.url.length - 2); var layersObject = { icon: result.icon, label: result.name, show: layerShow, type: result.type, url: result.url, showheight: result.showheight }; if (!isNaN(layersNumber)) { layersObject.layers = layersNumber; layersObject.url = layersUrl; } self.createLayers(layersObject) } else if (result.type == 0 && result.rendering == 0) { // 从 接口上读取的数据 并且是 本地渲染,就去添加entity实体 layerShow && self.createEntity({ url: result.url, entityName: result.name, img: result.icon, delete: !layerShow, showheight: result.showheight }) } else if (result.type == 1 && result.rendering == 0) { layerShow && self.serviceEntity({ url: result.url, oname: result.name, img: result.icon, delete: !layerShow, showheight: result.showheight }) } } } // 获取现有图层 var imageryLayers = self.map.scene.globe.imageryLayers; for (var i = 0; i < imageryLayers.length; i++) { var layer = imageryLayers.get(i); self.layers[layer.label] = layer; // self.layers[layer.label].show = true; } var setting = { view: { selectedMulti: false }, check: { enable: true }, data: { simpleData: { enable: true } }, callback: { onCheck: onCheck, } }; $.fn.zTree.init($("#treeDemo"), setting, self.LayerzNodes); $("#treeDemo li ").on('click', 'a', function () { return false }) function onCheck(e, treeId, treeNode) { if (treeNode.isParent) { treeNode.children.forEach(function (item, index) { self.selectiveLoading(item); }) return; } self.selectiveLoading(treeNode); } }, 2000) } }) self.movehandLerLayer(); }, onClose: function () { //面板关闭的时候触发 (when this panel is closed trigger) }, onMinimize: function () { this.resize(); }, onMaximize: function () { this.resize(); }, resize: function () { }, destroy: function () { //销毁的时候触发 //todo //do something before this func this.inherited(arguments); }, // 选中与否,判断后进行添加或者删除实体 selectiveLoading: function (treeNodeItem) { var self = this; if (treeNodeItem.type == 1 && treeNodeItem.rendering == 1) { self.layers[treeNodeItem.name].show = treeNodeItem.checked; } else if (treeNodeItem.type == 0 && treeNodeItem.rendering == 0) { self.createEntity({ url: treeNodeItem.url, entityName: treeNodeItem.name, img: treeNodeItem.icon, delete: !treeNodeItem.checked, showheight: treeNodeItem.showheight }) } else if (treeNodeItem.type == 1 && treeNodeItem.rendering == 0) { self.serviceEntity({ url: treeNodeItem.url, oname: treeNodeItem.name, img: treeNodeItem.icon, delete: !treeNodeItem.checked, showheight: treeNodeItem.showheight }) } }, // 读取服务,并且服务端加载,添加图层 createLayers: function (layerConfig) { var layMap = { '1': 'ArcGisMapServerImageryProvider' }; var layers; if (false) { } else { var layers = new Cesium[layMap[layerConfig.type]](layerConfig); var imageryLayers = this.map.imageryLayers; var olayer = imageryLayers.addImageryProvider(layers); olayer.show = layerConfig.show; olayer.label = layerConfig.label; } }, // 获取事件 movehandLerLayer: function () { // 取消默认双击事件 this.map.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK); // 获取鼠标事件 var handler = new Cesium.ScreenSpaceEventHandler(this.map.scene.canvas); // 给鼠标左键添加事件函数 //handler.setInputAction(lang.hitch(this, this.clickHandLayer), Cesium.ScreenSpaceEventType.LEFT_CLICK); handler.setInputAction(lang.hitch(this, this.clickHandLayer), Cesium.ScreenSpaceEventType.LEFT_DOWN); }, // 注册鼠标左键单击事件 clickHandLayer: function (movement) { $("#nav_box").stop().hide(); $("#nav_box").find("li").remove(); var self = this; var pickRay = this.map.camera.getPickRay(movement.position); var featuresPromise = this.map.imageryLayers.pickImageryLayerFeatures(pickRay, this.map.scene); if (!Cesium.defined(featuresPromise)) { var pickedObjects = this.map.scene.drillPick(movement.position); if (Cesium.defined(pickedObjects)) { for (var i = 0; i < pickedObjects.length; ++i) { if (pickedObjects[i].id.id) { var id = pickedObjects[i].id.id; console.log(id) if (this.layermanagementId.indexOf(id) != -1) { if (id.indexOf("雨量站") != -1 && id.split("雨量站")[0].length == 8) { var swid = id.split("雨量站")[0]; var swName = pickedObjects[i].id.name; self.openWinLayer("雨量站", swid, swName); break; } else if (id.indexOf("水质站") != -1) { break; } } } } } console.log('No features picked.'); } else { Cesium.when(featuresPromise, function (features) { console.log(features) // This function is called asynchronously when the list if picked features is available. console.log('Number of features: ' + features.length); if (features.length > 0) { console.log('First feature name: ' + features[0].name); } if (features[0].imageryLayer.label == '水文站' && features[0].data.attributes.STCD.length == 8) { self.openWinLayer("水文站", features[0].data.attributes.STCD, features[0].data.attributes.STNM); } else if (features[0].imageryLayer.label == '水位站' && features[0].data.attributes.STCD.length == 8) { self.openWinLayer("水位站", features[0].data.attributes.STCD, features[0].data.attributes.STNM); } else if (features[0].imageryLayer.label == '中小河流站' && features[0].data.attributes.STCD.length == 8) { self.openWinLayer("中小河流站", features[0].data.attributes.STCD, features[0].data.attributes.STNM); } }); } }, openWinLayer: function (txt, id, name) { if (txt == "水文站" || txt == "水位站" || txt == "中小河流站") { var url = "./widgets/Layermanagement/popup/river.html"; } else if (txt == "雨量站") { var url = "./widgets/Layermanagement/popup/rain.html"; } layer.open({ title: name, type: 2, shadeClose: true, shade: false, maxmin: true, //开启最大化最小化按钮 area: ['802px', '526px'], offset: 'auto', content: url + "?id=" + id, id: "layermanagement", closeBtn: 1, }); }, // 创建entity实体 createEntity: function (entityConfig) { var self = this; $.ajax({ url: entityConfig.url, type: 'GET', dataType: 'JSON', success: function (data) { var labelHeight = null /*if (data.data.length < 100) { labelHeight = 260000; } else if (data.data.length >= 100 && data.data.length < 250) { labelHeight = 220000; } else if (data.data.length >= 250 && data.data.length < 500) { labelHeight = 180000; } else if (data.data.length >= 500) { labelHeight = 140000; }*/ var site = "siteCode"; if (entityConfig.entityName == "山洪隐患点") { var site = "siteId"; } data.data.forEach(function (item, index) { var id = item[site] + entityConfig.entityName + item['lgtd']; var angle = ""; if (typeof (item.angle) != "undefined") { angle = item.angle; } // 移除entity实体 if (entityConfig.delete == true) { self.map.entities.removeById(id); if (self.layermanagementId.indexOf(id) != -1) { self.layermanagementId.splice(id, 1); } return } self.layermanagementId.push(id); console.log(id); // 添加entity实体 self.map.entities.add({ id: id, // 实体ID name: item.siteName, // 实体名称 position: Cesium.Cartesian3.fromDegrees(Number(item.lgtd), Number(item.lttd)), // x,y 实体经纬度 label: { show: true, text: item.siteName, // text 与实体相关的文字 font: "700 14px '黑体'", fillColor: Cesium.Color.DEEPSKYBLUE, // backgroundColor: Cesium.Color.DEEPSKYBLUE, style: Cesium.LabelStyle.FILL_AND_OUTLINE, outlineWidth: 2, outlineColor: Cesium.Color.fromBytes(255, 255, 255), // 文字轮廓的颜色 verticalOrigin: Cesium.VerticalOrigin.CENTER,//垂直位置 horizontalOrigin: Cesium.HorizontalOrigin.LEFT,//水平位置 pixelOffset: new Cesium.Cartesian2(10, -10), // 文字位置 heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, distanceDisplayCondition: new Cesium.DistanceDisplayCondition(1, entityConfig.showheight), disableDepthTestDistance: Number.POSITIVE_INFINITY }, billboard: { show: true, image: entityConfig.img, // image: entityConfig.img, width: 20, height: 20, clampToGround: true, heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, disableDepthTestDistance: Number.POSITIVE_INFINITY, rotation: Cesium.Math.toRadians(angle), } }) /*self.map.entities.add({ id: item[site] + entityConfig.entityName, // 实体ID name: item.siteName, // 实体名称 position: Cesium.Cartesian3.fromDegrees(item.lgtd, item.lttd), // x,y 实体经纬度 label: { show: true, text: item.siteName, // text 与实体相关的文字 font: "700 16px '黑体'", fillColor: Cesium.Color.DEEPSKYBLUE, // backgroundColor: Cesium.Color.DEEPSKYBLUE, style: Cesium.LabelStyle.FILL_AND_OUTLINE, outlineWidth: 3, outlineColor: Cesium.Color.fromBytes(255, 255, 255), // 文字轮廓的颜色 verticalOrigin: Cesium.VerticalOrigin.CENTER,//垂直位置 horizontalOrigin: Cesium.HorizontalOrigin.LEFT,//水平位置 pixelOffset: new Cesium.Cartesian2(10, -10), // 文字位置 heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, distanceDisplayCondition: new Cesium.DistanceDisplayCondition(1, entityConfig.showheight), disableDepthTestDistance: Number.POSITIVE_INFINITY }, ellipse: { show: true, semiMajorAxis: 200, semiMinorAxis: 200, heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, rotation: Cesium.Math.toRadians(angle), material: new Cesium.ImageMaterialProperty({ image: entityConfig.img }), } })*/ }) } }) }, // 读取服务,并本地加载 serviceEntity: function (entityConfig) { var self = this; $.ajax({ url: entityConfig.url + "/query", type: 'get', data: { where: '1=1', returnGeometry: true, outFields: "*", f: "pjson" }, dataType: 'JSON', success: function (data) { if (data.geometryType == "esriGeometryPoint") { self.geometryPoints({ data: data, img: entityConfig.img, delete: entityConfig.delete, showheight: entityConfig.showheight }) } else if (data.geometryType == 'esriGeometryPolyline') { self.geometryPolylines({ data: data, img: entityConfig.img, delete: entityConfig.delete, showheight: entityConfig.showheight }) } else if (data.geometryType == 'esriGeometryPolygon') { self.geometryPolygon({ data: data, img: entityConfig.img, delete: entityConfig.delete, showheight: entityConfig.showheight }) } } }) }, // 读取服务,并且在本地渲染的,加载实体点方法 geometryPoints: function (entityConfig) { var self = this; var labelHeight = null if (entityConfig.data.features.length < 100) { labelHeight = 260000; } else if (entityConfig.data.features.length >= 100 && entityConfig.data.features.length < 250) { labelHeight = 220000; } else if (entityConfig.data.features.length >= 250 && entityConfig.data.features.length < 500) { labelHeight = 180000; } else if (entityConfig.data.features.length >= 500) { labelHeight = 140000; } for (var o = 0; o < entityConfig.data.features.length; o++) { if (entityConfig.delete == true) { self.map.entities.removeById(JSON.stringify(entityConfig.data.features[o].attributes)); if (self.layermanagementId.indexOf(JSON.stringify(entityConfig.data.features[o].attributes)) != -1) { self.layermanagementId.splice(self.layermanagementId.indexOf(JSON.stringify(entityConfig.data.features[o].attributes)), 1); } continue; } self.layermanagementId.push(JSON.stringify(entityConfig.data.features[o].attributes)); self.map.entities.add({ id: JSON.stringify(entityConfig.data.features[o].attributes), // 实体ID name: entityConfig.data.features[o].attributes[entityConfig.data.displayFieldName], // 实体名称 position: Cesium.Cartesian3.fromDegrees(entityConfig.data.features[o].geometry.x, entityConfig.data.features[o].geometry.y), // x,y 实体经纬度 show: true, //字体标签样式 label: { show: true, text: entityConfig.data.features[o].attributes[entityConfig.data.displayFieldName], // text 与实体相关的文字 font: "700 14px '黑体'", fillColor: Cesium.Color.DEEPSKYBLUE, style: Cesium.LabelStyle.FILL_AND_OUTLINE, outlineWidth: 2, outlineColor: Cesium.Color.fromBytes(255, 255, 255), // 文字轮廓的颜色 verticalOrigin: Cesium.VerticalOrigin.CENTER,//垂直位置 horizontalOrigin: Cesium.HorizontalOrigin.LEFT,//水平位置 pixelOffset: new Cesium.Cartesian2(14, -10), // 文字位置 heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, distanceDisplayCondition: new Cesium.DistanceDisplayCondition(1, entityConfig.showheight), disableDepthTestDistance: Number.POSITIVE_INFINITY }, billboard: { show: true, image: entityConfig.img, width: 20, height: 20, heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, disableDepthTestDistance: Number.POSITIVE_INFINITY } }) } }, // 读取服务,并且在本地渲染的,加载实体线段方法 geometryPolylines: function (entityConfig) { var self = this; var position = []; for (var o = 0; o < entityConfig.data.features.length; o++) { for (var i = 0; i < entityConfig.data.features[o].geometry.paths[0].length; i++) { position.push(entityConfig.data.features[o].geometry.paths[0][i][0], entityConfig.data.features[o].geometry.paths[0][i][1]) } if (entityConfig.delete == true) { self.map.entities.removeById(JSON.stringify(entityConfig.data.features[o].attributes)); if (self.layermanagementId.indexOf(JSON.stringify(entityConfig.data.features[o].attributes)) != -1) { self.layermanagementId.splice(self.layermanagementId.indexOf(JSON.stringify(entityConfig.data.features[o].attributes)), 1); } continue; } self.layermanagementId.push(JSON.stringify(entityConfig.data.features[o].attributes)); // 绘制线段的 self.map.entities.add({ id: JSON.stringify(entityConfig.data.features[o].attributes), show: true, polyline: { positions: Cesium.Cartesian3.fromDegreesArray(position), width: 20, material: new Cesium.ImageMaterialProperty({ // 明天需要修改,备注。。!!!! image: entityConfig.img, // image: 'images/1111.png', repeat: new Cesium.Cartesian2(position.length / 8, 1), // transparent: true, }), // granularity: Cesium.Math.RADIANS_PER_DEGREE, // arcType: Cesium.ArcType.RHUMB, // classificationType: Cesium.ClassificationType.TERRAIN, clampToGround: true, }, }) position = []; } }, // 读取服务,并且在本地渲染的,加载实体多边形方法 geometryPolygon: function (entityConfig) { var self = this; var position = []; for (var o = 0; o < entityConfig.data.features.length; o++) { for (var i = 0; i < entityConfig.data.features[o].geometry.rings[0].length; i++) { position.push(entityConfig.data.features[o].geometry.rings[0][i][0], entityConfig.data.features[o].geometry.rings[0][i][1]) } if (entityConfig.delete == true) { self.map.entities.removeById(JSON.stringify(entityConfig.data.features[o].attributes)); if (self.layermanagementId.indexOf(JSON.stringify(entityConfig.data.features[o].attributes)) != -1) { self.layermanagementId.splice(self.layermanagementId.indexOf(JSON.stringify(entityConfig.data.features[o].attributes)), 1); } continue; } self.layermanagementId.push(JSON.stringify(entityConfig.data.features[o].attributes)); // 绘制多边形的 self.map.entities.add({ id: JSON.stringify(entityConfig.data.features[o].attributes), show: true, polygon: { hierarchy: { positions: Cesium.Cartesian3.fromDegreesArray(position) }, material: new Cesium.ImageMaterialProperty({ image: entityConfig.img }), clampToGround: true, }, }) position = []; } } }); });