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

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> <span class="label">间距</span>
<div class="input-number input-number-unit-1"> <div class="input-number input-number-unit-1">
<input class="input" type="number" title="" min="1" max="99999" @model="spacing"> <input class="input" type="number" title="" min="1" max="99999" @model="spacing">
<span class="unit">米</span>
<span class="arrow"></span> <span class="arrow"></span>
</div> </div>
</div> </div>

View File

@ -47,7 +47,7 @@ class BatchModel extends Base {
this.pointArr = [] this.pointArr = []
this.sdk.addIncetance(this.options.id, this) this.sdk.addIncetance(this.options.id, this)
// BatchModel.computeDis(this) // BatchModel.computeDis(this)
if (this.options.positions.length > 0) { if (this.options.positions.length > 0 || this.options.positions.lng) {
BatchModel.computeDis(this) BatchModel.computeDis(this)
} else { } else {
this.edit(true) this.edit(true)
@ -55,7 +55,7 @@ class BatchModel extends Base {
} }
// 计算距离 // 计算距离
static computeDis(that) { static async computeDis(that) {
let fromDegreesArray = [] let fromDegreesArray = []
let arr let arr
let posiArr = [] let posiArr = []
@ -65,7 +65,7 @@ class BatchModel extends Base {
fromDegreesArray.push(item.lng, item.lat) fromDegreesArray.push(item.lng, item.lat)
}) })
// arr = that.generateInterpolatedPoints(Cesium.Cartesian3.fromDegreesArray(fromDegreesArray), that.options.spacing) // 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[0] = arr
array[1] = that.calculateRoadAngle(Cesium.Cartesian3.fromDegreesArray(fromDegreesArray)[0], Cesium.Cartesian3.fromDegreesArray(fromDegreesArray)[3]) array[1] = that.calculateRoadAngle(Cesium.Cartesian3.fromDegreesArray(fromDegreesArray)[0], Cesium.Cartesian3.fromDegreesArray(fromDegreesArray)[3])
arr.forEach((item, index) => { arr.forEach((item, index) => {
@ -85,7 +85,7 @@ class BatchModel extends Base {
that.options.positions.forEach(item => { that.options.positions.forEach(item => {
fromDegreesArray.push(item.lng, item.lat) 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] arr = array[0]
that.pointArr = arr that.pointArr = arr
arr.forEach((item, index) => { arr.forEach((item, index) => {
@ -102,22 +102,23 @@ class BatchModel extends Base {
}) })
}) })
} else if (that.options.type == '点') { } 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 that.pointArr = posiArr
} }
posiArr.forEach((item, index) => { posiArr.forEach((item, index) => {
let model = new Model(that.sdk, { let model = new Model(that.sdk, {
id: 'model' + index, id: 'model' + index,
show: that.options.show, show: that.options.show,
url: that.options.url, url: that.options.url,
position: item, 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) that.pointArr.push(model)
}) })
} }
linePoint(polygonPositions, spacing) { async linePoint(polygonPositions, spacing) {
let boundaryPoints = []; let boundaryPoints = [];
let boundaryAngle = []; let boundaryAngle = [];
for (let i = 0; i < polygonPositions.length - 1; i++) { for (let i = 0; i < polygonPositions.length - 1; i++) {
@ -129,9 +130,20 @@ class BatchModel extends Base {
for (let j = 0; j <= segments; j++) { for (let j = 0; j <= segments; j++) {
const ratio = j / segments; const ratio = j / segments;
const point = Cesium.Cartesian3.lerp( let point = Cesium.Cartesian3.lerp(
start, end, ratio, new Cesium.Cartesian3() 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); boundaryPoints.push(point);
if (j != segments || i == polygonPositions.length - 2) { if (j != segments || i == polygonPositions.length - 2) {
boundaryAngle.push(this.calculateRoadAngle(start, end)) boundaryAngle.push(this.calculateRoadAngle(start, end))
@ -248,7 +260,7 @@ class BatchModel extends Base {
north: Math.max(...lats) north: Math.max(...lats)
}; };
} }
computedArea(polygonPositions, spacing) { async computedArea(polygonPositions, spacing) {
let dis12 = Cesium.Cartesian3.distance(polygonPositions[0], polygonPositions[1]); let dis12 = Cesium.Cartesian3.distance(polygonPositions[0], polygonPositions[1]);
let dis23 = Cesium.Cartesian3.distance(polygonPositions[1], polygonPositions[2]); let dis23 = Cesium.Cartesian3.distance(polygonPositions[1], polygonPositions[2]);
let vec12 = Cesium.Cartesian3.subtract(polygonPositions[1], polygonPositions[0], new Cesium.Cartesian3()); let vec12 = Cesium.Cartesian3.subtract(polygonPositions[1], polygonPositions[0], new Cesium.Cartesian3());
@ -259,22 +271,22 @@ class BatchModel extends Base {
let line1 = [] let line1 = []
for (let i = 0; i < num12; i++) { 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 = [] let line2 = []
for (let i = 0; i < num12; i++) { 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 = [] let allPoints = []
for (let i = 0; i < line1.length; i++) { for (let i = 0; i < line1.length; i++) {
for (let j = 0; j < num23; j++) { 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 return allPoints
} }
calculatePointB(pointA, pointC, distance) { async calculatePointB(pointA, pointC, distance) {
// 将输入坐标转换为Cartesian3类型 // 将输入坐标转换为Cartesian3类型
// const pointA = Cesium.Cartesian3.fromDegrees(a.longitude, a.latitude, a.height); // const pointA = Cesium.Cartesian3.fromDegrees(a.longitude, a.latitude, a.height);
// const pointC = Cesium.Cartesian3.fromDegrees(c.longitude, c.latitude, c.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 scaledVector = Cesium.Cartesian3.multiplyByScalar(unitVector, distance, new Cesium.Cartesian3());
const pointB = Cesium.Cartesian3.add(pointA, scaledVector, 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); // const cartographic = Cesium.Cartographic.fromCartesian(pointB);
// return { // return {
@ -299,7 +321,8 @@ class BatchModel extends Base {
// latitude: Cesium.Math.toDegrees(cartographic.latitude), // latitude: Cesium.Math.toDegrees(cartographic.latitude),
// height: cartographic.height // height: cartographic.height
// }; // };
return pointB // return pointB
return point
} }
get show() { get show() {
return this.options.show return this.options.show
@ -328,6 +351,10 @@ class BatchModel extends Base {
set spacing(v) { set spacing(v) {
this.options.spacing = v this.options.spacing = v
this._elms.spacing &&
this._elms.spacing.forEach(item => {
item.value = v
})
} }
/** /**
* @description 编辑框 * @description 编辑框
@ -373,8 +400,8 @@ class BatchModel extends Base {
} }
Draw && Draw.start((a, positions) => { Draw && Draw.start((a, positions) => {
this.options.positions = positions this.options.positions = positions
this.callback(this.options) this.callback(this.options);
this.options.positions.length && BatchModel.computeDis(this) (this.options.positions.length || this.options.positions.lng) && BatchModel.computeDis(this)
}) })
this.originalOptions = this.deepCopyObj(this.options) this.originalOptions = this.deepCopyObj(this.options)
@ -506,6 +533,7 @@ class BatchModel extends Base {
this.type = this.originalOptions.type this.type = this.originalOptions.type
this.spacing = this.originalOptions.spacing this.spacing = this.originalOptions.spacing
this.show = this.originalOptions.show this.show = this.originalOptions.show
this.options.spacing = this.originalOptions.spacing
} }
/** /**
@ -567,22 +595,36 @@ class BatchModel extends Base {
} }
else { else {
let positionArray = [] let positionArray = []
for (let i = 0; i < this.options.positions.length; i++) { if (this.options.positions.length > 0) {
let a = Cesium.Cartesian3.fromDegrees( for (let i = 0; i < this.options.positions.length; i++) {
this.options.positions[i].lng, let a = Cesium.Cartesian3.fromDegrees(
this.options.positions[i].lat, this.options.positions[i].lng,
this.options.positions[i].alt this.options.positions[i].lat,
) this.options.positions[i].alt
positionArray.push(a.x, a.y, a.z) )
} positionArray.push(a.x, a.y, a.z)
let BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray) }
this.viewer.camera.flyToBoundingSphere(BoundingSphere, { let BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray)
offset: { 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), heading: Cesium.Math.toRadians(0.0),
pitch: Cesium.Math.toRadians(-20.0), pitch: Cesium.Math.toRadians(-60.0),
roll: Cesium.Math.toRadians(0.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
})
}
} }
} }
/** /**