From 3d0493e0dd28f5abb01803f1b1f2fd94649f2795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=8F=E5=A4=A7=E8=83=86?= <1101282782@qq.com> Date: Wed, 20 Aug 2025 17:52:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=A8=A1=E5=9E=8B=20?= =?UTF-8?q?=E9=AB=98=E5=BA=A6=E4=BC=98=E5=8C=96=20=E5=AE=9A=E4=BD=8D=20?= =?UTF-8?q?=E9=87=8D=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Obj/Base/BatchModel/_element.js | 1 + src/Obj/Base/BatchModel/index.js | 102 ++++++++++++++++++++-------- 2 files changed, 73 insertions(+), 30 deletions(-) diff --git a/src/Obj/Base/BatchModel/_element.js b/src/Obj/Base/BatchModel/_element.js index da8c30f..afe7ff8 100644 --- a/src/Obj/Base/BatchModel/_element.js +++ b/src/Obj/Base/BatchModel/_element.js @@ -11,6 +11,7 @@ function html() { 间距
+
diff --git a/src/Obj/Base/BatchModel/index.js b/src/Obj/Base/BatchModel/index.js index 61673bd..84045dd 100644 --- a/src/Obj/Base/BatchModel/index.js +++ b/src/Obj/Base/BatchModel/index.js @@ -47,7 +47,7 @@ class BatchModel extends Base { this.pointArr = [] this.sdk.addIncetance(this.options.id, this) // BatchModel.computeDis(this) - if (this.options.positions.length > 0) { + if (this.options.positions.length > 0 || this.options.positions.lng) { BatchModel.computeDis(this) } else { this.edit(true) @@ -55,7 +55,7 @@ class BatchModel extends Base { } // 计算距离 - static computeDis(that) { + static async computeDis(that) { let fromDegreesArray = [] let arr let posiArr = [] @@ -65,7 +65,7 @@ class BatchModel extends Base { fromDegreesArray.push(item.lng, item.lat) }) // arr = that.generateInterpolatedPoints(Cesium.Cartesian3.fromDegreesArray(fromDegreesArray), that.options.spacing) - arr = that.computedArea(Cesium.Cartesian3.fromDegreesArray(fromDegreesArray), that.options.spacing) + arr = await that.computedArea(Cesium.Cartesian3.fromDegreesArray(fromDegreesArray), that.options.spacing) array[0] = arr array[1] = that.calculateRoadAngle(Cesium.Cartesian3.fromDegreesArray(fromDegreesArray)[0], Cesium.Cartesian3.fromDegreesArray(fromDegreesArray)[3]) arr.forEach((item, index) => { @@ -85,7 +85,7 @@ class BatchModel extends Base { that.options.positions.forEach(item => { fromDegreesArray.push(item.lng, item.lat) }) - array = that.linePoint(Cesium.Cartesian3.fromDegreesArray(fromDegreesArray), that.options.spacing) + array = await that.linePoint(Cesium.Cartesian3.fromDegreesArray(fromDegreesArray), that.options.spacing) arr = array[0] that.pointArr = arr arr.forEach((item, index) => { @@ -102,22 +102,23 @@ class BatchModel extends Base { }) }) } else if (that.options.type == '点') { - posiArr = [that.options.positions] + let height = await that.getClampToHeight({ lng: that.options.positions.lng, lat: that.options.positions.lat }) + posiArr = [{ lng: that.options.positions.lng, lat: that.options.positions.lat, alt: height }] + // posiArr = [that.options.positions] that.pointArr = posiArr } - posiArr.forEach((item, index) => { let model = new Model(that.sdk, { id: 'model' + index, show: that.options.show, url: that.options.url, position: item, - rotate: { x: 0, y: 0, z: array[1] && (array[1][index] || array[1]) } + rotate: that.options.type == '点' ? undefined : { x: 0, y: 0, z: array[1] && (array[1][index] || array[1]) } }) that.pointArr.push(model) }) } - linePoint(polygonPositions, spacing) { + async linePoint(polygonPositions, spacing) { let boundaryPoints = []; let boundaryAngle = []; for (let i = 0; i < polygonPositions.length - 1; i++) { @@ -129,9 +130,20 @@ class BatchModel extends Base { for (let j = 0; j <= segments; j++) { const ratio = j / segments; - const point = Cesium.Cartesian3.lerp( + let point = Cesium.Cartesian3.lerp( start, end, ratio, new Cesium.Cartesian3() ); + + const cartographic = Cesium.Cartographic.fromCartesian( + point // Cartesian3对象 {x, y, z} + ); + const longitude = Cesium.Math.toDegrees(cartographic.longitude); + const latitude = Cesium.Math.toDegrees(cartographic.latitude); + + + let height = await this.getClampToHeight({ lng: longitude, lat: latitude }) + point = Cesium.Cartesian3.fromDegrees(longitude, latitude, height); + boundaryPoints.push(point); if (j != segments || i == polygonPositions.length - 2) { boundaryAngle.push(this.calculateRoadAngle(start, end)) @@ -248,7 +260,7 @@ class BatchModel extends Base { north: Math.max(...lats) }; } - computedArea(polygonPositions, spacing) { + async computedArea(polygonPositions, spacing) { let dis12 = Cesium.Cartesian3.distance(polygonPositions[0], polygonPositions[1]); let dis23 = Cesium.Cartesian3.distance(polygonPositions[1], polygonPositions[2]); let vec12 = Cesium.Cartesian3.subtract(polygonPositions[1], polygonPositions[0], new Cesium.Cartesian3()); @@ -259,22 +271,22 @@ class BatchModel extends Base { let line1 = [] for (let i = 0; i < num12; i++) { - line1.push(this.calculatePointB(polygonPositions[0], polygonPositions[1], i * spacing)) + line1.push(await this.calculatePointB(polygonPositions[0], polygonPositions[1], i * spacing)) } let line2 = [] for (let i = 0; i < num12; i++) { - line2.push(this.calculatePointB(polygonPositions[3], polygonPositions[2], i * spacing)) + line2.push(await this.calculatePointB(polygonPositions[3], polygonPositions[2], i * spacing)) } let allPoints = [] for (let i = 0; i < line1.length; i++) { for (let j = 0; j < num23; j++) { - allPoints.push(this.calculatePointB(line1[i], line2[i], j * spacing)) + allPoints.push(await this.calculatePointB(line1[i], line2[i], j * spacing)) } } return allPoints } - calculatePointB(pointA, pointC, distance) { + async calculatePointB(pointA, pointC, distance) { // 将输入坐标转换为Cartesian3类型 // const pointA = Cesium.Cartesian3.fromDegrees(a.longitude, a.latitude, a.height); // const pointC = Cesium.Cartesian3.fromDegrees(c.longitude, c.latitude, c.height); @@ -292,6 +304,16 @@ class BatchModel extends Base { const scaledVector = Cesium.Cartesian3.multiplyByScalar(unitVector, distance, new Cesium.Cartesian3()); const pointB = Cesium.Cartesian3.add(pointA, scaledVector, new Cesium.Cartesian3()); + + const cartographic = Cesium.Cartographic.fromCartesian( + pointB // Cartesian3对象 {x, y, z} + ); + const longitude = Cesium.Math.toDegrees(cartographic.longitude); + const latitude = Cesium.Math.toDegrees(cartographic.latitude); + + + let height = await this.getClampToHeight({ lng: longitude, lat: latitude }) + let point = Cesium.Cartesian3.fromDegrees(longitude, latitude, height); // 转换回经纬度 // const cartographic = Cesium.Cartographic.fromCartesian(pointB); // return { @@ -299,7 +321,8 @@ class BatchModel extends Base { // latitude: Cesium.Math.toDegrees(cartographic.latitude), // height: cartographic.height // }; - return pointB + // return pointB + return point } get show() { return this.options.show @@ -328,6 +351,10 @@ class BatchModel extends Base { set spacing(v) { this.options.spacing = v + this._elms.spacing && + this._elms.spacing.forEach(item => { + item.value = v + }) } /** * @description 编辑框 @@ -373,8 +400,8 @@ class BatchModel extends Base { } Draw && Draw.start((a, positions) => { this.options.positions = positions - this.callback(this.options) - this.options.positions.length && BatchModel.computeDis(this) + this.callback(this.options); + (this.options.positions.length || this.options.positions.lng) && BatchModel.computeDis(this) }) this.originalOptions = this.deepCopyObj(this.options) @@ -506,6 +533,7 @@ class BatchModel extends Base { this.type = this.originalOptions.type this.spacing = this.originalOptions.spacing this.show = this.originalOptions.show + this.options.spacing = this.originalOptions.spacing } /** @@ -567,22 +595,36 @@ class BatchModel extends Base { } else { let positionArray = [] - for (let i = 0; i < this.options.positions.length; i++) { - let a = Cesium.Cartesian3.fromDegrees( - this.options.positions[i].lng, - this.options.positions[i].lat, - this.options.positions[i].alt - ) - positionArray.push(a.x, a.y, a.z) - } - let BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray) - this.viewer.camera.flyToBoundingSphere(BoundingSphere, { - offset: { + if (this.options.positions.length > 0) { + for (let i = 0; i < this.options.positions.length; i++) { + let a = Cesium.Cartesian3.fromDegrees( + this.options.positions[i].lng, + this.options.positions[i].lat, + this.options.positions[i].alt + ) + positionArray.push(a.x, a.y, a.z) + } + let BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray) + this.viewer.camera.flyToBoundingSphere(BoundingSphere, { + offset: { + heading: Cesium.Math.toRadians(0.0), + pitch: Cesium.Math.toRadians(-20.0), + roll: Cesium.Math.toRadians(0.0) + } + }) + } else if (this.options.positions.lng) { + let orientation = { heading: Cesium.Math.toRadians(0.0), - pitch: Cesium.Math.toRadians(-20.0), + pitch: Cesium.Math.toRadians(-60.0), roll: Cesium.Math.toRadians(0.0) } - }) + this.sdk.viewer.camera.flyTo({ + destination: Cesium.Cartesian3.fromDegrees(this.options.positions.lng, this.options.positions.lat, this.options.positions.alt + 100), + // orientation: orientation + }) + + } + } } /**