批量模型 高度优化 定位 重加载
This commit is contained in:
@ -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>
|
||||||
|
@ -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,6 +595,7 @@ class BatchModel extends Base {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let positionArray = []
|
let positionArray = []
|
||||||
|
if (this.options.positions.length > 0) {
|
||||||
for (let i = 0; i < this.options.positions.length; i++) {
|
for (let i = 0; i < this.options.positions.length; i++) {
|
||||||
let a = Cesium.Cartesian3.fromDegrees(
|
let a = Cesium.Cartesian3.fromDegrees(
|
||||||
this.options.positions[i].lng,
|
this.options.positions[i].lng,
|
||||||
@ -583,6 +612,19 @@ class BatchModel extends Base {
|
|||||||
roll: Cesium.Math.toRadians(0.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(-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
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user