批量模型 高度优化 定位 重加载

This commit is contained in:
2025-08-20 17:52:51 +08:00
parent 4d35b29526
commit 3d0493e0dd
2 changed files with 73 additions and 30 deletions

View File

@ -11,6 +11,7 @@ function html() {
<span class="label">间距</span>
<div class="input-number input-number-unit-1">
<input class="input" type="number" title="" min="1" max="99999" @model="spacing">
<span class="unit">米</span>
<span class="arrow"></span>
</div>
</div>

View File

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