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
+ })
+
+ }
+
}
}
/**