| @@ -3,19 +3,60 @@ | |||
| * @Date: 2020-04-24 14:49:37 | |||
| */ | |||
| import { Cesium } from '@dc-modules/namespace' | |||
| import { Transform } from '@dc-modules/transform' | |||
| /** | |||
| * | |||
| * @param p0 | |||
| * @param p1 | |||
| * @param p2 | |||
| * @returns {number} | |||
| * @private | |||
| */ | |||
| function triangleArea(p0, p1, p2) { | |||
| let v0 = Cesium.Cartesian3.subtract(p0, p1, new Cesium.Cartesian3()) | |||
| let v1 = Cesium.Cartesian3.subtract(p2, p1, new Cesium.Cartesian3()) | |||
| let cross = Cesium.Cartesian3.cross(v0, v1, v0) | |||
| return Cesium.Cartesian3.magnitude(cross) * 0.5 | |||
| } | |||
| export default function area(positions) { | |||
| let result = 0 | |||
| if (positions && Array.isArray(positions)) { | |||
| let h = 0 | |||
| let pos = positions.concat(positions[0]) | |||
| for (let i = 1; i < pos.length; i++) { | |||
| let oel = Transform.transformWGS84ToCartesian(pos[i - 1]) | |||
| let el = Transform.transformWGS84ToCartesian(pos[i]) | |||
| h += oel.x * el.y - el.x * oel.y | |||
| } | |||
| result = Math.abs(h).toFixed(2) | |||
| if (!Array.isArray(positions)) { | |||
| return result | |||
| } | |||
| if (!(positions[0] instanceof Cesium.Cartesian3)) { | |||
| positions = Transform.transformWGS84ArrayToCartesianArray(positions) | |||
| } | |||
| let geometry = Cesium.CoplanarPolygonGeometry.createGeometry( | |||
| Cesium.CoplanarPolygonGeometry.fromPositions({ | |||
| positions: positions, | |||
| vertexFormat: Cesium.VertexFormat.POSITION_ONLY | |||
| }) | |||
| ) | |||
| if (!geometry) { | |||
| return result | |||
| } | |||
| let flatPositions = geometry.attributes.position.values | |||
| let indices = geometry.indices | |||
| for (let i = 0; i < indices.length; i += 3) { | |||
| let p0 = Cesium.Cartesian3.unpack( | |||
| flatPositions, | |||
| indices[i] * 3, | |||
| new Cesium.Cartesian3() | |||
| ) | |||
| let p1 = Cesium.Cartesian3.unpack( | |||
| flatPositions, | |||
| indices[i + 1] * 3, | |||
| new Cesium.Cartesian3() | |||
| ) | |||
| let p2 = Cesium.Cartesian3.unpack( | |||
| flatPositions, | |||
| indices[i + 2] * 3, | |||
| new Cesium.Cartesian3() | |||
| ) | |||
| result += triangleArea(p0, p1, p2) | |||
| } | |||
| return result | |||
| } | |||