var DrawDynamicClampGround = (function () { var mouseHandlerDraw; function GetNorthCartesain(cartesain0, cartesain1) { var cartographic0 = Cesium.Cartographic.fromCartesian(cartesain0); var cartographic1 = Cesium.Cartographic.fromCartesian(cartesain1); var height = cartographic0.height > cartographic1.height ? cartographic0.height : cartographic1.height; var length = Math.sqrt((cartographic0.longitude - cartographic1.longitude) * (cartographic0.longitude - cartographic1.longitude)+ (cartographic0.latitude - cartographic1.latitude) * (cartographic0.latitude - cartographic1.latitude)); var cartographicN = new Cesium.Cartographic(cartographic0.longitude, cartographic0.latitude + length, height); var cartesainN = Cesium.Cartesian3.fromRadians(cartographicN.longitude, cartographicN.latitude, cartographicN.height); return cartesainN; } function _() { } //绘制点 _.startDrawPoint = function (viewer, callback) { var scene = viewer.scene; if (mouseHandlerDraw) { mouseHandlerDraw.destroy(); mouseHandlerDraw = null; } else { mouseHandlerDraw = new Cesium.ScreenSpaceEventHandler(scene.canvas); } TooltipDiv.initTool(viewer.cesiumWidget.container); mouseHandlerDraw.setInputAction(function (movement) { if (movement.position != null) { var cartesian = viewer.scene.pickPosition(movement.position); if (cartesian) { var cartographic = Cesium.Cartographic.fromCartesian(cartesian); if (cartographic) { if (typeof callback == 'function') { callback(cartographic); } if (mouseHandlerDraw) { mouseHandlerDraw.destroy(); mouseHandlerDraw = null; } TooltipDiv.setVisible(false); } } } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); mouseHandlerDraw.setInputAction(function (movement) { var cartesian = viewer.scene.pickPosition(movement.endPosition); if (cartesian) { TooltipDiv.showAt(movement.endPosition, '点击添加点'); } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); } //绘制线段 _.startDrawingLine = function (viewer, callback) { var scene = viewer.scene; if (mouseHandlerDraw) { mouseHandlerDraw.destroy(); mouseHandlerDraw = null; } else { mouseHandlerDraw = new Cesium.ScreenSpaceEventHandler(scene.canvas); } TooltipDiv.initTool(viewer.cesiumWidget.container); var drawingPolyline = null; var positions = []; mouseHandlerDraw.setInputAction(function (movement) { if (movement.position != null) { var cartesian = viewer.scene.pickPosition(movement.position); if (cartesian) { if (positions.length == 0) { positions.push(cartesian.clone()); } else if (positions.length == 1) { positions.push(cartesian.clone()); if (typeof callback == 'function') { callback(positions); } if (mouseHandlerDraw) { mouseHandlerDraw.destroy(); mouseHandlerDraw = null; } TooltipDiv.setVisible(false); //移除 if (drawingPolyline != undefined) viewer.entities.remove(drawingPolyline); } } } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); mouseHandlerDraw.setInputAction(function (movement) { var cartesian = viewer.scene.pickPosition(movement.endPosition); if (cartesian) { if (positions.length == 0) { TooltipDiv.showAt(movement.endPosition, '点击添加起点'); } else if (positions.length == 1) { //更新entity var positionArr = []; positionArr.push(positions[0]); positionArr.push(cartesian); if (drawingPolyline != undefined) viewer.entities.remove(drawingPolyline); var lineOpts = { polyline: { positions: positionArr, clampToGround: true, // width: 3, material: Cesium.Color.BLUE.withAlpha(0.5), } }; drawingPolyline = viewer.entities.add(lineOpts); TooltipDiv.showAt(movement.endPosition, "点击添加终点"); } } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); }; //绘制多段线 _.startDrawingPolyline = function (viewer, callback) { var scene = viewer.scene; if (mouseHandlerDraw) { mouseHandlerDraw.destroy(); mouseHandlerDraw = null; } else { mouseHandlerDraw = new Cesium.ScreenSpaceEventHandler(scene.canvas); } TooltipDiv.initTool(viewer.cesiumWidget.container); var drawingPolyline = null; var positions = []; mouseHandlerDraw.setInputAction(function (movement) { if (movement.position != null) { var cartesian = viewer.scene.pickPosition(movement.position); if (cartesian) { positions.push(cartesian.clone()); // var cartographic = Cesium.Cartographic.fromCartesian(cartesian);//当前点 // if (cartographic) { // if (cartesian) { // var isIntersect = false; // if (positions.length >= 3) { // var cartographicArr = []; // for (var i = 0; i < positions.length; i++) { // cartographicArr.push(Cesium.Cartographic.fromCartesian(positions[i])); // } // var line1 = turf.lineString([[cartographic.longitude, cartographic.latitude], [cartographicArr[cartographicArr.length - 1].longitude, cartographicArr[cartographicArr.length - 1].latitude]]); // for (var i = 2; i < positions.length; i++) { // var line2 = turf.lineString([ // [cartographicArr[i - 2].longitude, cartographicArr[i - 2].latitude], // [cartographicArr[i - 1].longitude, cartographicArr[i - 1].latitude]]); // var intersects = turf.lineIntersect(line1, line2); // if (intersects && intersects.features && intersects.features.length > 0) { // isIntersect = true; // alert('图形自相交!'); // break; // } // } // } // if (isIntersect) { } else { // positions.push(cartesian.clone()); // } // } // } } } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); mouseHandlerDraw.setInputAction(function (movement) { var cartesian = viewer.scene.pickPosition(movement.endPosition); if (cartesian) { if (positions.length == 0) { TooltipDiv.showAt(movement.endPosition, '点击添加起点'); } else { var positionArr = []; for (var i = 0; i < positions.length; i++) { positionArr.push(positions[i]); } positionArr.push(cartesian); if (drawingPolyline != undefined) viewer.entities.remove(drawingPolyline); var lineOpts = { polyline: { positions: positionArr, clampToGround: true, // width: 3, material: Cesium.Color.BLUE.withAlpha(0.5), } }; drawingPolyline = viewer.entities.add(lineOpts); TooltipDiv.showAt(movement.endPosition, "双击结束"); } } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); mouseHandlerDraw.setInputAction(function (movement) { if (movement.position != null) { var cartesian = viewer.scene.pickPosition(movement.position); if (cartesian) { if (positions.length < 2) { return; } else { if (typeof callback == 'function') { callback(positions); } if (mouseHandlerDraw) { mouseHandlerDraw.destroy(); mouseHandlerDraw = null; } TooltipDiv.setVisible(false); //移除entity if (drawingPolyline != undefined) viewer.entities.remove(drawingPolyline); } } } }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK); }; //绘制方位线 _.startDrawingVLine = function (viewer, callback) { var scene = viewer.scene; if (mouseHandlerDraw) { mouseHandlerDraw.destroy(); mouseHandlerDraw = null; } else { mouseHandlerDraw = new Cesium.ScreenSpaceEventHandler(scene.canvas); } TooltipDiv.initTool(viewer.cesiumWidget.container); var drawingPolylineN = null; var drawingPolylineT = null; var positions = []; mouseHandlerDraw.setInputAction(function (movement) { if (movement.position != null) { var cartesian = viewer.scene.pickPosition(movement.position); if (cartesian) { if (positions.length == 0) { positions.push(cartesian.clone()); } else if (positions.length == 1) { positions.push(cartesian.clone()); if (typeof callback == 'function') { callback(positions); } if (mouseHandlerDraw) { mouseHandlerDraw.destroy(); mouseHandlerDraw = null; } TooltipDiv.setVisible(false); //移除 if (drawingPolylineN != undefined) viewer.entities.remove(drawingPolylineN); if (drawingPolylineT != undefined) viewer.entities.remove(drawingPolylineT); } } } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); mouseHandlerDraw.setInputAction(function (movement) { var cartesian = viewer.scene.pickPosition(movement.endPosition); if (cartesian) { if (positions.length == 0) { TooltipDiv.showAt(movement.endPosition, '点击添加起点'); } else if (positions.length == 1) { //更新entity var positionArr = []; positionArr.push(positions[0]); positionArr.push(cartesian); //实时 if (drawingPolylineT != undefined) viewer.entities.remove(drawingPolylineT); var lineOptsT = { polyline: { positions: positionArr, clampToGround: true, // width: 3, material: Cesium.Color.BLUE.withAlpha(0.5), } }; drawingPolylineT = viewer.entities.add(lineOptsT); //正北 var positionN = []; positionN.push(positions[0]); positionN.push(GetNorthCartesain(positions[0], cartesian)); if (drawingPolylineN != undefined) viewer.entities.remove(drawingPolylineN); var lineOptsN = { polyline: { positions: positionN, clampToGround: true, // width: 3, material: Cesium.Color.RED.withAlpha(0.5), } }; drawingPolylineN = viewer.entities.add(lineOptsN); TooltipDiv.showAt(movement.endPosition, "点击结束"); } } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); } return _; })();