UNPKG

@vtx/cs-map

Version:

React components for Vortex

303 lines (297 loc) 11.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = require("react"); var _cesium = require("cesium"); var useTerrainClipPlan = function useTerrainClipPlan(props) { var viewer = props.viewer; var showResult = (0, _react.useRef)(true); var wellWall = (0, _react.useRef)(); var bottomSurface = (0, _react.useRef)(); var wellData = (0, _react.useRef)(); var excavateMinHeight = (0, _react.useRef)(9999); var wallImgStr = (0, _react.useRef)(); var bottomImgStr = (0, _react.useRef)(); var splitNumber = (0, _react.useRef)(); var heightNum = (0, _react.useRef)(0); var positionsCur = (0, _react.useRef)([]); // 设置是否显示 var show = function show(isShow) { showResult.current = isShow; if (viewer.scene.globe.clippingPlanes) viewer.scene.globe.clippingPlanes.enabled = isShow; switchExcavate(isShow); }; var switchExcavate = function switchExcavate(isSHow) { if (!bottomSurface.current) return; if (isSHow) { viewer.scene.globe.material = _cesium.Material.fromType("WaJue"); if (wellWall.current) wellWall.current.show = isSHow; bottomSurface.current.show = isSHow; } else { viewer.globe.material = null; if (wellWall.current) wellWall.current.show = !isSHow; bottomSurface.current.show = !isSHow; } }; var updateExcavateDepth = function updateExcavateDepth(height) { if (!wellData.current) return; if (bottomSurface.current) viewer.scene.primitives.remove(bottomSurface.current); if (wellWall.current) viewer.scene.primitives.remove(wellWall.current); var lerpos = wellData.current.lerp_pos; var res = []; for (var i = 0; i < lerpos.length; i++) { res.push(_cesium.Cartesian3.fromRadians(lerpos[i].latitude, excavateMinHeight.current - height)); } heightNum.current = height; updateData(positionsCur.current); }; // 开挖分析 var start = function start(attrs) { var wallImg = attrs.wallImg, splitNum = attrs.splitNum, height = attrs.height, positions = attrs.positions, bottomImg = attrs.bottomImg; wallImgStr.current = wallImg; splitNumber.current = splitNum; heightNum.current = height; bottomImgStr.current = bottomImg; positionsCur.current = positions; updateData(positionsCur.current); }; var createWell = function createWell(data) { if (viewer.terrainProvider._layers) { createBottomSurface(data.bottom_pos); var handleData = function handleData(arr) { var no_height_top = []; for (var i = 0; i < arr.length; i++) { var s = _cesium.Cartesian3.fromRadians(arr[i].longitude, arr[i].latitude, arr[i].height); no_height_top.push(s); } createWellWall(data.bottom_pos, no_height_top); }; // 针对低于 1.90.0 版本 if (_cesium.when) { (0, _cesium.when)((0, _cesium.sampleTerrainMostDetailed)(viewer.terrainProvider, data.lerp_pos), handleData); } else { (0, _cesium.sampleTerrainMostDetailed)(viewer.terrainProvider, data.lerp_pos).then(handleData); } } else { createBottomSurface(data.bottom_pos); createWellWall(data.bottom_pos, data.no_height_top); } }; var createBottomSurface = function createBottomSurface(bottom_pos) { if (bottom_pos.length) { var minHeight = getMinHeight(bottom_pos); var points = []; for (var i = 0; i < bottom_pos.length; i++) { var p = ellipsoidToLonLat(bottom_pos[i]); points.push(p.longitude); points.push(p.latitude); points.push(minHeight); } if (!points) return; var polygon = new _cesium.PolygonGeometry({ polygonHierarchy: new _cesium.PolygonHierarchy(_cesium.Cartesian3.fromDegreesArrayHeights(points)), perPositionHeight: true }); var geometry = _cesium.PolygonGeometry.createGeometry(polygon); var material = new _cesium.Material({ fabric: { type: 'Image', uniforms: { image: bottomImgStr.current } } }); var appearance = new _cesium.MaterialAppearance({ translucent: false, flat: true, material: material }); if (!geometry) return; bottomSurface.current = new _cesium.Primitive({ geometryInstances: new _cesium.GeometryInstance({ geometry: geometry }), appearance: appearance, asynchronous: false }); viewer.scene.primitives.add(bottomSurface.current); } }; var createWellWall = function createWellWall(bottom_pos, no_height_topt) { var minHeight = getMinHeight(bottom_pos); var maxHeights = []; var minHeights = []; for (var i = 0; i < no_height_topt.length; i++) { maxHeights.push(ellipsoidToLonLat(no_height_topt[i]).altitude); minHeights.push(minHeight); } var wall = new _cesium.WallGeometry({ positions: no_height_topt, maximumHeights: maxHeights, minimumHeights: minHeights }); var geometry = _cesium.WallGeometry.createGeometry(wall); var material = new _cesium.Material({ fabric: { type: 'Image', uniforms: { image: wallImgStr.current } } }); var appearance = new _cesium.MaterialAppearance({ translucent: false, flat: true, material: material }); if (geometry) { var primitive = new _cesium.Primitive({ geometryInstances: new _cesium.GeometryInstance({ geometry: geometry, attributes: { color: _cesium.ColorGeometryInstanceAttribute.fromColor(_cesium.Color.GREY) }, id: 'PitWall' }), appearance: appearance, asynchronous: false }); wellWall.current = primitive; viewer.scene.primitives.add(primitive); } }; var getMinHeight = function getMinHeight(cartesians) { var _minPoint; var minHeight = 5000000; var minPoint = null; for (var i = 0; i < cartesians.length; i++) { var height = cartesians[i]['z']; if (height < minHeight) { minHeight = height; minPoint = ellipsoidToLonLat(cartesians[i]); } } return (_minPoint = minPoint) === null || _minPoint === void 0 ? void 0 : _minPoint.altitude; }; var ellipsoidToLonLat = function ellipsoidToLonLat(cartesian) { var ellipsoid = viewer.scene.globe.ellipsoid; var cartesian3 = new _cesium.Cartesian3(cartesian.x, cartesian.y, cartesian.z); var cartographic = ellipsoid.cartesianToCartographic(cartesian3); var latitude = _cesium.Math.toDegrees(cartographic.latitude); var longitude = _cesium.Math.toDegrees(cartographic.longitude); var altitude = cartographic.height; return { longitude: longitude, latitude: latitude, altitude: altitude }; }; // 更新开挖深度 var updateData = function updateData(points) { clear(); var planes = []; var pointsLength = points.length; // 计算分量差 // const subtr = Cartesian3.subtract(positions[0], positions[1], new Cartesian3()) excavateMinHeight.current = 9999; for (var i = 0; i < pointsLength; ++i) { var nextIndex = (i + 1) % pointsLength; // 计算中间值 var midpoint = _cesium.Cartesian3.midpoint(points[i], points[nextIndex], new _cesium.Cartesian3()); var catographic = _cesium.Cartographic.fromCartesian(points[i]); var height = viewer.scene.globe.getHeight(catographic) || catographic.height; height < excavateMinHeight.current && (excavateMinHeight.current = height); var up = _cesium.Cartesian3.normalize(midpoint, new _cesium.Cartesian3()); var right = _cesium.Cartesian3.subtract(points[nextIndex], midpoint, new _cesium.Cartesian3()); right = _cesium.Cartesian3.normalize(right, right); var cross = _cesium.Cartesian3.cross(right, up, new _cesium.Cartesian3()); cross = _cesium.Cartesian3.normalize(cross, cross); var plane = new _cesium.Plane(cross, 0.0); var distance = _cesium.Plane.getPointDistance(plane, midpoint); planes.push(new _cesium.ClippingPlane(cross, distance)); } viewer.scene.globe.clippingPlanes = new _cesium.ClippingPlaneCollection({ planes: planes, edgeWidth: 1, edgeColor: _cesium.Color.WHITE, enabled: true, unionClippingRegions: false }); prepareWell(points); if (wellData.current) { createWell(wellData.current); } }; // 清除开挖分析结果 var clear = function clear() { var _viewer$scene$globe$c; if (viewer.scene.globe.clippingPlanes) { viewer.scene.globe.clippingPlanes.enabled = !1; viewer.scene.globe.clippingPlanes.removeAll(); } if (viewer.scene.globe.clippingPlanes && !((_viewer$scene$globe$c = viewer.scene.globe.clippingPlanes) !== null && _viewer$scene$globe$c !== void 0 && _viewer$scene$globe$c.isDestroyed)) { viewer.scene.globe.clippingPlanes.destroy(); } viewer.scene.globe.clippingPlanes = undefined; if (bottomSurface.current) viewer.scene.primitives.remove(bottomSurface.current); if (wellWall.current) viewer.scene.primitives.remove(wellWall.current); bottomSurface.current = undefined; wellWall.current = undefined; viewer.scene.render(); }; var prepareWell = function prepareWell(points) { var len = points.length; if (len !== 0) { var no_height_top = []; var height_top = []; var bottom_pos = []; var lerp_pos = []; var diff = excavateMinHeight.current - heightNum.current; for (var i = 0; i < len; i++) { var nextIndex = i === len - 1 ? 0 : i + 1; var currentCattesian = _cesium.Cartographic.fromCartesian(points[i]); var nextCartorghic = _cesium.Cartographic.fromCartesian(points[nextIndex]); var currLonLat = [currentCattesian.longitude, currentCattesian.latitude]; var nextLonLat = [nextCartorghic.longitude, nextCartorghic.latitude]; if (i === 0) { lerp_pos.push(new _cesium.Cartographic(currLonLat[0], currLonLat[1])); bottom_pos.push(_cesium.Cartesian3.fromRadians(currLonLat[0], currLonLat[1], diff)); no_height_top.push(_cesium.Cartesian3.fromRadians(currLonLat[0], currLonLat[1], 0)); height_top.push(_cesium.Cartesian3.fromRadians(currLonLat[0], currLonLat[1], nextCartorghic.height)); } if (!splitNumber.current) return; for (var p = 1; p <= splitNumber.current; p++) { var firstLerp = _cesium.Math.lerp(currLonLat[0], nextLonLat[0], p / splitNumber.current); var lastLerp = _cesium.Math.lerp(currLonLat[1], nextLonLat[1], p / splitNumber.current); if (i !== len - 1 || p !== splitNumber.current) { lerp_pos.push(new _cesium.Cartographic(firstLerp, lastLerp)); bottom_pos.push(_cesium.Cartesian3.fromRadians(firstLerp, lastLerp, diff)); no_height_top.push(_cesium.Cartesian3.fromRadians(firstLerp, lastLerp, 0)); height_top.push(_cesium.Cartesian3.fromRadians(firstLerp, lastLerp, nextCartorghic.height)); } } } wellData.current = { lerp_pos: lerp_pos, bottom_pos: bottom_pos, no_height_top: no_height_top, height_top: height_top }; } }; return { start: start, clear: clear, updateData: updateData, updateExcavateDepth: updateExcavateDepth, show: show }; }; var _default = exports["default"] = useTerrainClipPlan; //# sourceMappingURL=useTerrainClipPlan.js.map