import * as turf from '@turf/turf'; import store from '../../../store'; var drawGrid = { id: "Rectangle", drawRect: function () { this.handler = new Cesium.ScreenSpaceEventHandler(Viewer.canvas); var points = []; var shape = this.renderRect(points); var step = 0; var $this = this; this.handler.setInputAction(function (e) { var cartesian = Viewer.scene.pickPosition(e.position); if (!Cesium.defined(cartesian)) { var ray = Viewer.camera.getPickRay(e.position); cartesian = Viewer.scene.globe.pick(ray, Viewer.scene); } points[step] = cartesian; step++; if (step === 3) { $this.handler.destroy(); store.state.isshowGrid= true } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); this.handler.setInputAction(function (e) { var cartesian = Viewer.scene.pickPosition(e.startPosition); if (!Cesium.defined(cartesian)) { var ray = Viewer.camera.getPickRay(e.startPosition); cartesian = Viewer.scene.globe.pick(ray, Viewer.scene); } points[2] = cartesian; }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); }, renderRect: function (points) { var shape = Viewer.entities.add({ id: this.id, polygon: { hierarchy: new Cesium.CallbackProperty(function () { if (points[0] && points[1] && points[2]) { var r0 = Cesium.Cartographic.fromCartesian(points[0]); var r1 = Cesium.Cartographic.fromCartesian(points[1]); // 辅助点 var r2 = Cesium.Cartographic.fromCartesian(points[2]); var p0 = turf.point([ (r0.longitude * 180) / Math.PI, (r0.latitude * 180) / Math.PI ]); var p1 = turf.point([ (r1.longitude * 180) / Math.PI, (r1.latitude * 180) / Math.PI ]); var p2 = turf.point([ (r2.longitude * 180) / Math.PI, (r2.latitude * 180) / Math.PI ]); this.rectanglePoint = p1; var bearing1 = turf.rhumbBearing(p0, p1); var bearing2 = turf.rhumbBearing(p0, p2); var angle1 = bearing2 - bearing1; // 对角长度 var length = turf.distance(p0, p2, { units: "meters" }); var len1 = Math.cos((angle1 / 180) * Math.PI) * length; var dest1 = turf.destination(p0, len1, bearing1, { units: "meters" }); var angle2 = 90 - angle1; var len2 = Math.cos((angle2 / 180) * Math.PI) * length; var dest2 = turf.destination(p0, len2, 90 + bearing1, { units: "meters", }); var coordinates = [ points[0], Cesium.Cartesian3.fromDegrees(dest1.geometry.coordinates[0], dest1.geometry.coordinates[1]), points[2], Cesium.Cartesian3.fromDegrees(dest2.geometry.coordinates[0], dest2.geometry.coordinates[1]) ]; return new Cesium.PolygonHierarchy(coordinates); } }, false), material: Cesium.Color.CYAN.withAlpha(0.5), outline: true, outlineColor: Cesium.Color.BLACK, }, }); return shape; }, drawPoint: function ( res) { var rect = Viewer.entities.getById(this.id); if (!rect) return; var points = rect.polygon.hierarchy.getValue().positions; //var r0 = Cesium.Cartographic.fromCartesian(points[0]); //var r1 = Cesium.Cartographic.fromCartesian(points[1]); //var r2 = Cesium.Cartographic.fromCartesian(points[2]); var r0 = Cesium.Cartographic.fromCartesian(points[0]); var r1 = Cesium.Cartographic.fromCartesian(points[1]); var r2 = Cesium.Cartographic.fromCartesian(points[2]); var p0 = turf.point([(r0.longitude * 180) / Math.PI, (r0.latitude * 180) / Math.PI]); var p1 = turf.point([(r1.longitude * 180) / Math.PI, (r1.latitude * 180) / Math.PI]); var p2 = turf.point([(r2.longitude * 180) / Math.PI, (r2.latitude * 180) / Math.PI]); // 做成 3 * 4 的网格 var wCount =res.col, hCount = res.row; var wStep = turf.distance(p0, p1, { units: "meters" }) / (wCount - 1); var hStep = turf.distance(p1, p2, { units: "meters" }) / (hCount - 1); var wAngle = turf.bearing(p0, p1); var hAngle = turf.bearing(p1, p2); var op = { units: "meters", }; var arr = [p0.geometry.coordinates]; for (var i = 1; i < wCount; i++) { var dest = turf.destination(p0, wStep * i, wAngle, op); arr.push(dest.geometry.coordinates); } for (var i = 0; i < wCount; i++) { var p = arr[i]; for (var j = 1; j < hCount; j++) { var dest = turf.destination(p, hStep * j, hAngle, op); arr.push(dest.geometry.coordinates); } } console.log(arr); // 显示点 // for (var i = 0; i < arr.length; i++) { // var p = arr[i]; // console.log(arr[i]) // Viewer.entities.add({ // name: "点", // show: true, // position: Cesium.Cartesian3.fromDegrees(p[0], p[1], 0), // point: { // color: Cesium.Color.RED, // pixelSize: 5, // heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // // 无论如何缩放,标记点不被地形遮挡 // disableDepthTestDistance: Number.POSITIVE_INFINITY // } // }); // } }, setGridRowCol:function(res){ store.state.isshowGrid= false; this.drawPoint(res); }, }; export default drawGrid