//地形开挖 function digEarth(drawCartesian, unionClippingRegions, buildings, isCircle,iscutearth) { if (isCircle == undefined) { isCircle = true; } var points = [ ]; var latLngArr = []; for (var i = 0; i < drawCartesian.length; i++) { var cartographic = Cesium.Cartographic.fromCartesian(drawCartesian[i]); latLngArr.push({ lng: cartographic.longitude, lat: cartographic.latitude }); var p = Cesium.Cartesian3.clone(drawCartesian[i]); points.push(p); } var clockWise = isClockWise(latLngArr); if(iscutearth==1){ viewer.scene.globe.clippingPlanes = new Cesium.ClippingPlaneCollection({ planes: buildClippingPlanes1(points, unionClippingRegions != clockWise), edgeWidth: 1.0, edgeColor: Cesium.Color.WHITE, unionClippingRegions: unionClippingRegions }) if (!isCircle) { viewer.scene.globe.clippingPlanes._planes.length = 1; } } for (var i in buildings) { if (buildings[i].clippingPlanes == undefined) { buildings[i].clippingPlanes = new Cesium.ClippingPlaneCollection({ planes: buildClippingPlanes2(points, unionClippingRegions != clockWise, getInverseTransform(buildings[i])), edgeWidth: 1.0, edgeColor: Cesium.Color.WHITE, unionClippingRegions: unionClippingRegions }); } else { buildings[i].clippingPlanes._planes = buildClippingPlanes2(points, unionClippingRegions != clockWise, getInverseTransform(buildings[i])); buildings[i].clippingPlanes.unionClippingRegions = unionClippingRegions; } if (!isCircle) { buildings[i].clippingPlanes._planes.length = 1; } } } function getInverseTransform(tileSet) { let transform; let tmp = tileSet.root.transform console.log(tmp); // if ((tmp && tmp.equals(Cesium.Matrix4.IDENTITY)) || !tmp) { // 如果root.transform不存在,则3DTiles的原点变成了boundingSphere.center transform = Cesium.Transforms.eastNorthUpToFixedFrame(tileSet.boundingSphere.center) // } else { // transform = Cesium.Matrix4.fromArray(tileSet.root.transform) // } return Cesium.Matrix4.inverseTransformation(transform, new Cesium.Matrix4()) } function getOriginCoordinateSystemPoint(point, inverseTransform) { return Cesium.Matrix4.multiplyByPoint( inverseTransform, point, new Cesium.Cartesian3(0, 0, 0)) } function buildClippingPlanes1(points, invert) { var pointsLength = points.length; var clippingPlanes = []; // 存储ClippingPlane集合 for (var i = 0; i < pointsLength; ++i) { var nextIndex = (i + 1) % pointsLength; var midpoint = Cesium.Cartesian3.add(points[i], points[nextIndex], new Cesium.Cartesian3()); midpoint = Cesium.Cartesian3.multiplyByScalar(midpoint, 0.5, midpoint); var right = Cesium.Cartesian3.subtract(invert ? points[i] : points[nextIndex], midpoint, new Cesium.Cartesian3()); var up = Cesium.Cartesian3.normalize(midpoint, new Cesium.Cartesian3()); right = Cesium.Cartesian3.normalize(right, right); var normal = Cesium.Cartesian3.cross(right, up, new Cesium.Cartesian3()); normal = Cesium.Cartesian3.normalize(normal, normal); var originCenteredPlane = new Cesium.Plane(normal, 0.0); var distance = Cesium.Plane.getPointDistance(originCenteredPlane, midpoint); clippingPlanes.push(new Cesium.ClippingPlane(normal, distance)); } return clippingPlanes; } function buildClippingPlanes2(points, invert, inverseTransform) { var pointsLength = points.length; var clippingPlanes = []; // 存储ClippingPlane集合 for (var i = 0; i < pointsLength; ++i) { var nextIndex = (i + 1) % pointsLength; clippingPlanes.push(invert ? createPlane(points[nextIndex], points[i], inverseTransform) : createPlane(points[i], points[nextIndex], inverseTransform)); } return clippingPlanes; } function createPlane(p1, p2, inverseTransform) { // 将仅包含经纬度信息的p1,p2,转换为相应坐标系的cartesian3对象 let p1C3 = getOriginCoordinateSystemPoint(p1, inverseTransform) let p2C3 = getOriginCoordinateSystemPoint(p2, inverseTransform) // 定义一个垂直向上的向量up let up = new Cesium.Cartesian3(0, 0, 10) // right 实际上就是由p1指向p2的向量 let right = Cesium.Cartesian3.subtract(p2C3, p1C3, new Cesium.Cartesian3()) // 计算normal, right叉乘up,得到平面法向量,这个法向量指向right的右侧 let normal = Cesium.Cartesian3.cross(right, up, new Cesium.Cartesian3()) normal = Cesium.Cartesian3.normalize(normal, normal) //由于已经获得了法向量和过平面的一点,因此可以直接构造Plane,并进一步构造ClippingPlane let planeTmp = Cesium.Plane.fromPointNormal(p1C3, normal) return Cesium.ClippingPlane.fromPlane(planeTmp) } //判断点序 function isClockWise(latLngArr) { // if (latLngArr.length < 3) { // return null // } if (latLngArr[0] === latLngArr[latLngArr.length - 1]) { latLngArr = latLngArr.slice(0, latLngArr.length - 1) } let latMin = { i: -1, val: 90 } for (let i = 0; i < latLngArr.length; i++) { let { lat } = latLngArr[i] if (lat < latMin.val) { latMin.val = lat latMin.i = i } } let i1 = (latMin.i + latLngArr.length - 1) % latLngArr.length let i2 = latMin.i let i3 = (latMin.i + 1) % latLngArr.length let v2_1 = { lat: latLngArr[i2].lat - latLngArr[i1].lat, lng: latLngArr[i2].lng - latLngArr[i1].lng } let v3_2 = { lat: latLngArr[i3].lat - latLngArr[i2].lat, lng: latLngArr[i3].lng - latLngArr[i2].lng } let result = v3_2.lng * v2_1.lat - v2_1.lng * v3_2.lat // result>0 3-2在2-1的顺时针方向 result<0 3-2在2-1的逆时针方向 result==0 3-2和2-1共线,可能同向也可能反向 return result === 0 ? (latLngArr[i3].lng < latLngArr[i1].lng) : (result > 0) } function clip2(options) { // var projectinfo; layui.use('layer', function () { layer.load(1, { shade: [0.5, '#000'] }); // layer.open({ // type: 1 // , title: false //不显示标题栏 // , closeBtn: false // , area: '300px;' // , shade: 0.8 // , id: 'WaitLayer' //设定一个id,防止重复弹出 // , btnAlign: 'c' // , moveType: 1 //拖拽模式,0或者1 // , content: '
请稍后
' // }); var pid = currentProjectId; var node = getNodeById(pid, layerMenu); var buildings = []; for (let i in node.children) { if (node.children[i].ext.tilesType == "building") { var model = getprimitiveModel(node.children[i].id); if (model != undefined) { buildings.push(model); } } } //查询项目下模型的偏移量 var modeloffsetx = 0; var modeloffsety = 0; var modeloffsetz = 0; $.ajax({ type: "get", async: false, url: httpConfig.webApiUrl + "landstamp/front/3dtileList?id=" + pid, contentType: "application/json;charset=utf-8", timeout: 3000, success: function (data) { if (data == null || data.length == 0) { layer.msg('未查询到数据!'); return; } for (var i = 0; i < data.length; i++) { if (data[i].status == "0") {//禁用的模型 continue; } var tiletype = data[i].tilesType; if (tiletype == "layer") { modeloffsetx = data[i].tilesX; modeloffsety = data[i].tilesY; modeloffsetz = data[i].tilesZ; } } }, error: function (XMLHttpRequest, textStatus, errorThrown) { console.log("ajax请求失败!"); }, }); if (node != undefined) { let projectinfo = node.ext; var lon = projectinfo.lng; var lat = projectinfo.lat; var Ox = projectinfo.dcartX; var Oy = projectinfo.dcartY; var Oz = projectinfo.dcartZ; var positionOnEllipsoid = Cesium.Cartesian3.fromDegrees(lon, lat); var translateMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(positionOnEllipsoid); var a = options.drawPositions; var list = a.split(";"); var newpoints = ""; for (var i = 0; i < list.length; i++) { var p = list[i].split(","); if (p.length == 3) { var x = (p[0] - translateMatrix[12]) * translateMatrix[0] + (p[1] - translateMatrix[13]) * translateMatrix[1] + (p[2] - translateMatrix[14]) * translateMatrix[2] + Ox; var y = (p[0] - translateMatrix[12]) * translateMatrix[4] + (p[1] - translateMatrix[13]) * translateMatrix[5] + (p[2] - translateMatrix[14]) * translateMatrix[6] + Oy; var z = (p[0] - translateMatrix[12]) * translateMatrix[8] + (p[1] - translateMatrix[13]) * translateMatrix[9] + (p[2] - translateMatrix[14]) * translateMatrix[10] + Oz; newpoints = newpoints + x; newpoints = newpoints + ","; newpoints = newpoints + y; newpoints = newpoints + ","; newpoints = newpoints + z; newpoints = newpoints + ";"; } } newpoints = newpoints.substr(0, newpoints.length - 1); var iscliptube = options.iscliptube; var isinvert = options.isinvert; var depth = options.depth; var isclip = options.type == 'clip' ? 1 : (options.type == 'dig' ? 0 : 2); var iscutearth=options.iscutearth?options.iscutearth:0; var url = httpConfig.webApiUrl + "/landstamp/front/clipping?position=" + newpoints + "&projectId=" + parent.currentProjectId + "&depth=" + depth + "&iscliptube=" + iscliptube + "&isinvert=" + isinvert + "&isclip=" + isclip + "&userId=1&userName=admin"; $.ajax({ type: "GET", contentType: "application/json;charset=utf-8", url: url, async: true, dataType: 'json', success: function (result) { if (isclip != 1) { digEarth(options.drawCartesian, isinvert == 1, buildings, isclip == 0,iscutearth); } var tileset = new Cesium.Cesium3DTileset({ url: httpConfig.nginxUrl + result.msg, }); tileset.modelMatrix[12] = modeloffsetx; tileset.modelMatrix[13] = modeloffsety; tileset.modelMatrix[14] = modeloffsetz; tileset.readyPromise.then(function (tileset) { viewer.scene.primitives.add(tileset); tileset._id = options.type + new Date().format("yyyyMMddhhmmss") var node = { "title": (options.type == 'clip' ? "剖面" : (options.type == 'dig' ? "开挖" : "切块")) + new Date().format("yyyyMMddhhmmss"), "id": tileset._id, "field": "Primitive", "checked": true, "spread": true, "children": [], "ext": { "lng": lon, "lat": lat } }; addTreeNode(node, node.id);//将剖切后的模型挂载到当前项目节点下:zzf }).otherwise(function (error) { console.log(error); }); } }).then(function (responseText) { //提示以及关闭图层:zzf //changeChildrenChecked(false,) if(responseText.msg.indexOf("json")){ for (let i in node.children) { if (node.children[i].ext.tilesType != "building") { changeParentChecked(false,node.children[i]) changeChildrenChecked(false,node.children[i]) } } layer.closeAll('loading'); //关闭loading let tip=options.type == 'clip'? "剖切" : (options.type == 'dig' ? "开挖" : "切块") layer.msg(tip+"完成") } else{ layer.msg(responseText.msg) } }); } }) } //关闭图层和控制树勾选:zzf function changeParentChecked(ischeck, data) { var parentOfData = parent.getParentByChildrenId(data.id); if (parentOfData != null && parentOfData != undefined) { parentOfData.checked = ischeck; changeParentChecked(ischeck, parentOfData); } } function changeChildrenChecked(ischeck, tdata) { tdata.checked = false; var N = new Array(); N.push(tdata); while (N.length > 0) { var data = N.shift(); if (data.children != null && data.children != undefined) { for (var i in data.children) { N.push(data.children[i]); } } data.checked = ischeck; var model = undefined; switch (data.field) { case 'Primitive': { model = parent.getprimitiveModel(data.id); if (model != undefined) { model.show = ischeck; } break; } case 'Entity': { model = parent.getentityModel(data.id); if (model != undefined) { model.show = ischeck; } break; } case '3DTile': { if (ischeck == true) { model = parent.getprimitiveModel(data.parentId); if (model != undefined) { model.show = ischeck; } } var tile = parent.get3DTile(data.ext.tilesId, data.url); if (tile != undefined) { // tile.children[0]._content._batchTable.setAllShow(ischeck); tile.children[0]._content._model.show = ischeck; } break; } } } } function clip() { var objpath = "C:/Users/QT/Desktop/layer"; var pa = 547425; var pb = 4207432; var pc = 0; var lon = 114.53966; var lat = 37.99802; var xlsxpath = "C:/Users/QT/Desktop/地层属性.xlsx"; var outpath = "D:/Software/Cesium-1.82/Apps/SampleData/my3Dtiles/poumian"; var clip = ""; for (var i = 0; i < clickpos.length; i++) { for (var j = 0; j < 3; j++) { clip = clip + clickpos[i][j]; clip = clip + ","; } clip = clip.substr(0, clip.length - 1); clip = clip + ";"; } clip = clip.substr(0, clip.length - 1); var depth = 20; var isclip = 1; var isinvert = 1; var iscliptube = document.getElementById("clip_tube").checked ? 1 : 0; var tubepath = "C:/Users/QT/Desktop/tube"; var tubexlsx = "C:/Users/QT/Desktop/管线属性.xlsx"; var mydata = "{objpath:'" + objpath + "',"; mydata = mydata + "x:" + pa + ","; mydata = mydata + "y:" + pb + ","; mydata = mydata + "z:" + pc + ","; mydata = mydata + "lon:" + lon + ","; mydata = mydata + "lat:" + lat + ","; mydata = mydata + "propertypath:'" + xlsxpath + "',"; mydata = mydata + "outpath:'" + outpath + "',"; mydata = mydata + "pos:'" + clip + "',"; mydata = mydata + "depth:" + depth + ","; mydata = mydata + "isclip:" + isclip + ","; mydata = mydata + "isinvert:" + isinvert + ","; mydata = mydata + "iscliptube:" + iscliptube + ","; mydata = mydata + "tubepath:'" + tubepath + "',"; mydata = mydata + "tubexlsx:'" + tubexlsx + "'}"; console.log(mydata); $.ajax({ type: "POST", contentType: "application/json", url: "http://127.0.0.1:801/WebService1.asmx/clipDig",             //这里跟上面的情况一样 //                data:"{x:0,y:0,z:5,r:5,name:'1.obj'}", data: mydata, dataType: 'json', success: function (result) { //                alert(result.d); console.log(result); var baseurl = "../../SampleData/my3Dtiles/poumian" + result.d; viewer.scene.primitives.remove(tileset3); tileset3 = new Cesium.Cesium3DTileset({ url: baseurl, }); viewer.scene.primitives.add(tileset3); tileset3.show = true; } }); } function dig() { var objpath = "C:/Users/QT/Desktop/layer"; var pa = 547425; var pb = 4207432; var pc = 0; var lon = 114.53966; var lat = 37.99802; var xlsxpath = "C:/Users/QT/Desktop/地层属性.xlsx"; var outpath = "D:/Software/Cesium-1.82/Apps/SampleData/my3Dtiles/kaiwa"; var clip = ""; for (var i = 0; i < clickpos.length; i++) { for (var j = 0; j < 3; j++) { clip = clip + clickpos[i][j]; clip = clip + ","; } clip = clip.substr(0, clip.length - 1); clip = clip + ";"; } clip = clip.substr(0, clip.length - 1); var depth = document.getElementById("dig_depth").value; var isclip = 0; var isinvert = document.getElementById("dig_invert").checked ? 1 : 0; var iscliptube = document.getElementById("clip_tube").checked ? 1 : 0; var tubepath = "C:/Users/QT/Desktop/tube"; var tubexlsx = "C:/Users/QT/Desktop/管线属性.xlsx"; var mydata = "{objpath:'" + objpath + "',"; mydata = mydata + "x:" + pa + ","; mydata = mydata + "y:" + pb + ","; mydata = mydata + "z:" + pc + ","; mydata = mydata + "lon:" + lon + ","; mydata = mydata + "lat:" + lat + ","; mydata = mydata + "propertypath:'" + xlsxpath + "',"; mydata = mydata + "outpath:'" + outpath + "',"; mydata = mydata + "pos:'" + clip + "',"; mydata = mydata + "depth:" + depth + ","; mydata = mydata + "isclip:" + isclip + ","; mydata = mydata + "isinvert:" + isinvert + ","; mydata = mydata + "iscliptube:" + iscliptube + ","; mydata = mydata + "tubepath:'" + tubepath + "',"; mydata = mydata + "tubexlsx:'" + tubexlsx + "'}"; console.log(mydata); $.ajax({ type: "POST", contentType: "application/json", url: "http://127.0.0.1:801/WebService1.asmx/clipDig",             //这里跟上面的情况一样 //                data:"{x:0,y:0,z:5,r:5,name:'1.obj'}", data: mydata, dataType: 'json', success: function (result) { //                alert(result.d); console.log(result); var baseurl = "../../SampleData/my3Dtiles/kaiwa" + result.d; viewer.scene.primitives.remove(tileset3); tileset3 = new Cesium.Cesium3DTileset({ url: baseurl, }); viewer.scene.primitives.add(tileset3); tileset3.show = true; } }); } function terrainDraw(options) { console.log(options); options.viewer = viewer; options.polylinecolor = new Cesium.Color.fromBytes(255, 124, 0, 255); options.pointcolor = Cesium.Color.WHITE; if (options.drawMarkArr == undefined) { options.drawMarkArr = []; } switch (options.type) { case 'clip': { drawClipPolyline(options); break; } case 'cut': { drawCutPolyline(options); break; } case 'dig': { drawDigtPolygon(options); break; } } } function terrainDrawClean(options) { options.drawHandler = options.drawHandler && options.drawHandler.destroy(); if ((options.viewer.entities.getById('measureDigPolygonEntity') !== undefined)) { options.viewer.entities.removeById('measureDigPolygonEntity'); } if ((options.viewer.entities.getById('dynamicClipLineEntity') !== undefined)) { options.viewer.entities.removeById('dynamicClipLineEntity'); } if ((options.viewer.entities.getById('measureClipLineEntity') !== undefined)) { options.viewer.entities.removeById('measureClipLineEntity'); } if ((options.viewer.entities.getById('dynamicCutLineEntity') !== undefined)) { options.viewer.entities.removeById('dynamicCutLineEntity'); } if ((options.viewer.entities.getById('measureCutLineEntity') !== undefined)) { options.viewer.entities.removeById('measureCutLineEntity'); } for (var i = 0; i < options.drawMarkArr.length; i++) { options.viewer.entities.remove(options.drawMarkArr[i]); } } function terrainRecovery() { viewer.scene.globe.clippingPlanes = undefined; var node = getNodeById(currentProjectId, layerMenu); var buildings = []; for (let i in node.children) { if (node.children[i].ext.tilesType == "building") { var model = getprimitiveModel(node.children[i].id); if (model != undefined) { buildings.push(model); } } } for (var i in buildings) { buildings[i].clippingPlanes.removeAll(); } } /** * 绘制剖切路径 * options{ * 'viewer':viewer, //Cesim.Viewer * 'polylinecolor': Cesium.Color.YELLOW, //线颜色 * 'pointcolor': Cesium.Color.RED.withAlpha(0.8), //端点颜色 * 'printId': 'textid', //显示路径点坐标的前端elem的id * 'drawMarkArr': //端点entity数组 * 'drawHandler': //屏幕控制处理,无需传递 * 'drawPositions': //路径端点坐标存储,无需传递,剖切时取用(字符串类型,逗号分隔,需要自行分割) * } */ function drawClipPolyline(options) { options.drawHandler = options.drawHandler && options.drawHandler.destroy(); if ((options.viewer.entities.getById('dynamicClipLineEntity') !== undefined)) { options.viewer.entities.removeById('dynamicClipLineEntity'); } if ((options.viewer.entities.getById('measureClipLineEntity') !== undefined)) { options.viewer.entities.removeById('measureClipLineEntity'); } for (var i = 0; i < options.drawMarkArr.length; i++) { options.viewer.entities.remove(options.drawMarkArr[i]); } options.drawMarkArr = []; var isFirst = true;//是否为第一个点 var previousPosition;//前一个点的坐标 var currentPosition;//当前点坐标 var dynamicPositions = []; var dynamicClipLineEntity = options.viewer.entities.add({ id: 'dynamicClipLineEntity', polyline: { clampToGround: true, width: 2, material: options.pointcolor, } }); dynamicClipLineEntity.polyline.positions = new Cesium.CallbackProperty(function () { return dynamicPositions; }, false) //已输入的线段的entity var measureLinePositonsArray = [];//存储已量测的线段的折点 var measureClipLineEntity = options.viewer.entities.add({ id: 'measureClipLineEntity', polyline: { clampToGround: true, width: 1, material: options.polylinecolor, } }); measureClipLineEntity.polyline.positions = new Cesium.CallbackProperty(function () { return measureLinePositonsArray; }, false) //节点添加标签 function addPin(carPoi) { options.drawMarkArr.push(options.viewer.entities.add({ position: carPoi, point: { pixelSize: 5, color: options.pointcolor, disableDepthTestDistance: Number.POSITIVE_INFINITY, outlineWidth: 2, outlineColor: options.polylinecolor }, })); } function popPin() { options.viewer.entities.remove(options.drawMarkArr[options.drawMarkArr.length - 1]); measureLinePositonsArray.pop(); options.drawMarkArr.pop(); if (measureLinePositonsArray.length > 0) { previousPosition = measureLinePositonsArray[measureLinePositonsArray.length - 1]; dynamicPositions = [previousPosition, currentPosition]; } else { previousPosition = undefined; isFirst = true; dynamicPositions = []; } } options.drawHandler = new Cesium.ScreenSpaceEventHandler(options.viewer.scene.canvas); //左键事件 options.drawHandler.setInputAction(function (movement) { console.log(movement); entityMouseClickListenerIsEnable = false; if (isFirst) { previousPosition = options.viewer.scene.pickPosition(movement.position); var cartographic = Cesium.Cartographic.fromCartesian(previousPosition); var height = cartographic.height;//模型高度 if (Number(height) < 0) { var ray = options.viewer.camera.getPickRay(movement.position); previousPosition = options.viewer.scene.globe.pick(ray, options.viewer.scene); } if (previousPosition && previousPosition.x) { var tmp1 = previousPosition.clone(); measureLinePositonsArray.push(tmp1); isFirst = false; addPin(tmp1); } } else { currentPosition = options.viewer.scene.pickPosition(movement.position); var cartographic = Cesium.Cartographic.fromCartesian(currentPosition); var height = cartographic.height;//模型高度 if (Number(height) < 0) { var ray = options.viewer.camera.getPickRay(movement.position); currentPosition = options.viewer.scene.globe.pick(ray, options.viewer.scene); } if (currentPosition && currentPosition.x) { if (Math.abs(previousPosition.x - currentPosition.x) > 0.000001 || Math.abs(previousPosition.y - currentPosition.y) > 0.000001) { var tmp2 = currentPosition.clone(); measureLinePositonsArray.push(tmp2); previousPosition = currentPosition.clone(); dynamicPositions = [previousPosition, currentPosition]; addPin(tmp2); } } } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); //鼠标移动事件(停下时触发) options.drawHandler.setInputAction(function (movement) { if (!isFirst) { //获取当前点的坐标 currentPosition = options.viewer.scene.pickPosition(movement.endPosition); var cartographic = Cesium.Cartographic.fromCartesian(currentPosition); var height = cartographic.height;//模型高度 if (Number(height) < 0) { var ray = options.viewer.camera.getPickRay(movement.endPosition); currentPosition = options.viewer.scene.globe.pick(ray, options.viewer.scene); } if (currentPosition && currentPosition.x) { dynamicPositions = [previousPosition, currentPosition]; } } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); //右键事件 options.drawHandler.setInputAction(function () { if (!isFirst) { popPin(); } }, Cesium.ScreenSpaceEventType.RIGHT_CLICK); //双击事件 options.drawHandler.setInputAction(function () { if (!isFirst) { options.viewer.entities.remove(dynamicClipLineEntity); options.drawHandler = options.drawHandler && options.drawHandler.destroy(); if (options.drawMarkArr.length < 2) { popPin(); options.viewer.entities.remove(measureClipLineEntity); } else { let tempPointsStr = ''; for (var i = 0; i < measureLinePositonsArray.length; i++) { tempPointsStr += measureLinePositonsArray[i].x + "," + measureLinePositonsArray[i].y + "," + measureLinePositonsArray[i].z + ";"; } options.drawPositions = tempPointsStr.substring(0, tempPointsStr.length - 1); terrainDrawPage.update(); } for (var i = 0; i < options.drawMarkArr.length; i++) { options.viewer.entities.remove(options.drawMarkArr[i]); } } entityMouseClickListenerIsEnable = true; }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK); } /** * 绘制切块路径 * options{ * 'viewer':viewer, //Cesim.Viewer * 'polylinecolor': Cesium.Color.YELLOW, //线颜色 * 'pointcolor': Cesium.Color.RED.withAlpha(0.8), //端点颜色 * 'printId': 'textid', //显示路径点坐标的前端elem的id * 'drawMarkArr': //端点entity数组 * 'drawHandler': //屏幕控制处理,无需传递 * 'drawPositions': //路径端点坐标存储,无需传递,剖切时取用(字符串类型,逗号分隔,需要自行分割) * } */ function drawCutPolyline(options) { options.drawHandler = options.drawHandler && options.drawHandler.destroy(); if ((options.viewer.entities.getById('dynamicCutLineEntity') !== undefined)) { options.viewer.entities.removeById('dynamicCutLineEntity'); } if ((options.viewer.entities.getById('measureCutLineEntity') !== undefined)) { options.viewer.entities.removeById('measureCutLineEntity'); } for (var i = 0; i < options.drawMarkArr.length; i++) { options.viewer.entities.remove(options.drawMarkArr[i]); } options.drawMarkArr = []; var isFirst = true;//是否为第一个点 var previousPosition;//前一个点的坐标 var currentPosition;//当前点坐标 var dynamicPositions = []; var dynamicCutLineEntity = options.viewer.entities.add({ id: 'dynamicCutLineEntity', polyline: { clampToGround: true, width: 2, material: Cesium.Color.RED, } }); dynamicCutLineEntity.polyline.positions = new Cesium.CallbackProperty(function () { return dynamicPositions; }, false); //已输入的线段的entity var measureLinePositonsArray = [];//存储已量测的线段的折点 var measureCutLineEntity = options.viewer.entities.add({ id: 'measureCutLineEntity', polyline: { clampToGround: true, width: 1, material: options.polylinecolor, } }); measureCutLineEntity.polyline.positions = new Cesium.CallbackProperty(function () { return measureLinePositonsArray; }, false); //节点添加标签 function addPin(carPoi) { options.drawMarkArr.push(options.viewer.entities.add({ position: carPoi, point: { pixelSize: 5, color: options.pointcolor, disableDepthTestDistance: Number.POSITIVE_INFINITY, outlineWidth: 2, outlineColor: Cesium.Color.WHITE.withAlpha(1) }, })); } function popPin() { options.viewer.entities.remove(options.drawMarkArr[options.drawMarkArr.length - 1]); measureLinePositonsArray.pop(); options.drawMarkArr.pop(); if (measureLinePositonsArray.length > 0) { previousPosition = measureLinePositonsArray[measureLinePositonsArray.length - 1]; dynamicPositions = [previousPosition, currentPosition]; } else { previousPosition = undefined; isFirst = true; dynamicPositions = []; } } options.drawHandler = new Cesium.ScreenSpaceEventHandler(options.viewer.scene.canvas); //左键事件 options.drawHandler.setInputAction(function (movement) { console.log(movement); if (isFirst) { entityMouseClickListenerIsEnable = false; previousPosition = options.viewer.scene.pickPosition(movement.position); var cartographic = Cesium.Cartographic.fromCartesian(previousPosition); var height = cartographic.height;//模型高度 if (Number(height) < 0) { var ray = options.viewer.camera.getPickRay(movement.position); previousPosition = options.viewer.scene.globe.pick(ray, options.viewer.scene); } if (previousPosition && previousPosition.x) { var tmp1 = previousPosition.clone(); measureLinePositonsArray.push(tmp1); isFirst = false; addPin(tmp1); } } else { currentPosition = options.viewer.scene.pickPosition(movement.position); var cartographic = Cesium.Cartographic.fromCartesian(currentPosition); var height = cartographic.height;//模型高度 if (Number(height) < 0) { var ray = options.viewer.camera.getPickRay(movement.position); currentPosition = options.viewer.scene.globe.pick(ray, options.viewer.scene); } if (currentPosition && currentPosition.x) { if (Math.abs(previousPosition.x - currentPosition.x) > 0.000001 || Math.abs(previousPosition.y - currentPosition.y) > 0.000001) { var tmp2 = currentPosition.clone(); measureLinePositonsArray.push(tmp2); previousPosition = currentPosition.clone(); dynamicPositions = [previousPosition, currentPosition]; addPin(tmp2); } } let tempPointsStr = ''; var coordinates = ''; for (var i = 0; i < measureLinePositonsArray.length; i++) { tempPointsStr += measureLinePositonsArray[i].x + "," + measureLinePositonsArray[i].y + "," + measureLinePositonsArray[i].z + ";"; } options.drawCartesian = JSON.parse(JSON.stringify(measureLinePositonsArray)); options.drawPositions = tempPointsStr.substring(0, tempPointsStr.length - 1); terrainDrawPage.update(); for (var i = 0; i < options.drawMarkArr.length; i++) { options.viewer.entities.remove(options.drawMarkArr[i]); } viewer.entities.remove(dynamicCutLineEntity); options.drawHandler = options.drawHandler && options.drawHandler.destroy(); entityMouseClickListenerIsEnable = true; } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); //鼠标移动事件(停下时触发) options.drawHandler.setInputAction(function (movement) { if (!isFirst) { //获取当前点的坐标 currentPosition = options.viewer.scene.pickPosition(movement.endPosition); var cartographic = Cesium.Cartographic.fromCartesian(currentPosition); var height = cartographic.height;//模型高度 if (Number(height) < 0) { var ray = options.viewer.camera.getPickRay(movement.endPosition); currentPosition = options.viewer.scene.globe.pick(ray, options.viewer.scene); } if (currentPosition && currentPosition.x) { dynamicPositions = [previousPosition, currentPosition]; } } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); //右键事件 options.drawHandler.setInputAction(function () { if (!isFirst) { popPin(); } }, Cesium.ScreenSpaceEventType.RIGHT_CLICK); } /* * options = { * 'viewer':viewer, //Cesim.Viewer * 'polygoncolor':Cesium.Color.YELLOW, //线颜色 * 'pointcolor':Cesium.Color.RED.withAlpha(0.8), //端点颜色 * 'printId':'textid', //显示路径点坐标的前端elem的id * 'type':'net', * 'drawMarkArr': //端点entity数组,无需传递 * 'drawHandler': //屏幕控制处理,无需传递 * 'drawPositions': //路径端点坐标存储,无需传递,剖切时取用(字符串类型,逗号分隔,需要自行分割) * }; * */ //绘制多边形面 function drawDigtPolygon(options) { if ((options.viewer.entities.getById('measureDigPolygonEntity') !== undefined)) { options.viewer.entities.removeById('measureDigPolygonEntity'); } for (var i = 0; i < options.drawMarkArr.length; i++) { options.viewer.entities.remove(options.drawMarkArr[i]); } options.drawMarkArr = []; var polygon = new Cesium.PolygonHierarchy(); var measureDigPolygonEntity = options.viewer.entities.add({ id: 'measureDigPolygonEntity', polygon: { material: new Cesium.ColorMaterialProperty(Cesium.Color.RED.withAlpha(0.3)), classificationType: Cesium.ClassificationType.BOTH, outline: true, outlineColor: Cesium.Color.WHITE, hierarchy: new Cesium.CallbackProperty(function () { return polygon; }, false) } }); options.drawHandler = options.drawHandler && options.drawHandler.destroy(); options.drawHandler = new Cesium.ScreenSpaceEventHandler(options.viewer.scene.canvas); options.drawHandler.setInputAction(function (movement) { entityMouseClickListenerIsEnable = false; var earthPosition = options.viewer.scene.pickPosition(movement.position); var cartographic = Cesium.Cartographic.fromCartesian(earthPosition); var height = cartographic.height; //模型高度 if (Number(height) < 0) { var ray = options.viewer.camera.getPickRay(movement.position); earthPosition = options.viewer.scene.globe.pick(ray, options.viewer.scene); } console.log(earthPosition); if (earthPosition && earthPosition.x) { if (polygon.positions.length > 1) { let last = polygon.positions[polygon.positions.length - 2]; if (Math.abs(earthPosition.x - last.x) > 0.000001 && Math.abs(earthPosition.y - last.y) > 0.000001) { polygon.positions.push(earthPosition); createPoint(earthPosition); } } else { polygon.positions.push(earthPosition); createPoint(earthPosition); } if (polygon.positions.length > 2) { measureDigPolygonEntity.show = true; } } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); options.drawHandler.setInputAction(function (movement) { var newPosition = options.viewer.scene.pickPosition(movement.endPosition); var cartographic = Cesium.Cartographic.fromCartesian(newPosition); var height = cartographic.height; //模型高度 if (Number(height) < 0) { var ray = options.viewer.camera.getPickRay(movement.endPosition); newPosition = options.viewer.scene.globe.pick(ray, options.viewer.scene); } if (newPosition && newPosition.x) { polygon.positions.pop(); polygon.positions.push(newPosition); } if (polygon.positions.length > 2) { measureDigPolygonEntity.show = true; } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); options.drawHandler.setInputAction(function (movement) { if (polygon.positions.length > 1) { polygon.positions.splice(polygon.positions.length - 2, 1); } if (polygon.positions.length < 3) { measureDigPolygonEntity.show = false; } options.viewer.entities.remove(options.drawMarkArr[options.drawMarkArr.length - 1]); options.drawMarkArr.pop(); }, Cesium.ScreenSpaceEventType.RIGHT_CLICK); options.drawHandler.setInputAction(function (movement) { polygon.positions.pop(); options.drawHandler = options.drawHandler && options.drawHandler.destroy(); if (polygon.positions.length < 3) { options.viewer.entities.remove(measureDigPolygonEntity); } else { var tempPointsStr = ''; for (var pindex = 0; pindex < polygon.positions.length; pindex++) { tempPointsStr += polygon.positions[pindex].x + "," + polygon.positions[pindex].y + "," + polygon.positions[pindex].z + ";"; } options.drawCartesian = JSON.parse(JSON.stringify(polygon.positions)); options.drawPositions = tempPointsStr.substring(0, tempPointsStr.length - 1); terrainDrawPage.update(); } for (let i in options.drawpointArr) { options.viewer.entities.remove(options.drawpointArr[i]); } entityMouseClickListenerIsEnable = true; }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK); function createPoint(worldPosition) { options.drawMarkArr.push(options.viewer.entities.add({ position: worldPosition, point: { color: Cesium.Color.RED, pixelSize: 5, outlineWidth: 2, outlineColor: Cesium.Color.WHITE, disableDepthTestDistance: Number.POSITIVE_INFINITY } })); } };