/**
* 绘制折线
* @param {*} viewer
* @param {*} options
*/
function DrawPolyLine(viewer, options) {
this.viewer = viewer;
this.ismeare = options.ismeare || false;
this.positions = [];
this.poly = null;
this.tooltip = document.getElementById(options.toolTip || "toolTip");
this.cartesian = null;
this.floatingPoint = null;
this.mouseHandler = null;
this.onCompleted = options.onCompleted;
this._pointLabels = [];
this._totalLengthPointLabel = undefined;
this._originCursor = undefined;
}
DrawPolyLine.prototype.end = function() {
this.positions = [];
this.poly = null;
this.cartesian = null;
this.floatingPoint = null;
if (this.tooltip) {
this.tooltip.style.display = "none";
}
if (this.mouseHandler) {
this.mouseHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
this.mouseHandler.removeInputAction(
Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK
);
this.mouseHandler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
this.mouseHandler.removeInputAction(
Cesium.ScreenSpaceEventType.RIGHT_CLICK
);
this.mouseHandler.destroy();
this.mouseHandler = null;
}
if (this.floatingPoint) {
this.viewer.entities.remove(this.floatingPoint);
}
this._pointLabels = [];
this._totalLengthPointLabel = undefined;
viewer.scene.canvas.style.cursor = this._originCursor;
this.viewer.selectedEntity = null;
this.viewer.trackedEntity = null;
};
/**
* 清除绘制
*/
DrawPolyLine.prototype.clear = function() {
let removeLayerName = ["drawpolyline", "drawpolylinepoint"];
for (var i = 0; i < window.viewer.entities.values.length; i++) {
var entity = window.viewer.entities.values[i];
if (removeLayerName.indexOf(entity.name) > -1) {
window.viewer.entities.removeById(entity.id);
i--;
}
}
this.end();
};
/**
* 开始绘制
*/
DrawPolyLine.prototype.startDraw = function() {
this.clear();
let tooltip = this.tooltip;
this.ismeare = true;
let ismeare = this.ismeare;
let viewer = this.viewer;
let cartesian = this.cartesian;
let positions = this.positions;
let floatingPoint = this.floatingPoint;
this.mouseHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
let handler = this.mouseHandler;
let poly = this.poly;
let that = this;
this._originCursor = viewer.scene.canvas.style.cursor;
viewer.scene.canvas.style.cursor = "crosshair";
handler.setInputAction(function(movement) {
if (!ismeare) {
return;
}
tooltip.style.display = "block";
tooltip.style.left = movement.endPosition.x + 3 + "px";
tooltip.style.top = movement.endPosition.y - 25 + "px";
tooltip.innerHTML = "<p>单击开始,双击结束,右键取消</p>";
let ray = viewer.camera.getPickRay(movement.endPosition);
//cartesian = viewer.scene.globe.pick(ray, viewer.scene);
cartesian = pickPosition(viewer, movement.endPosition);
if (positions.length >= 2) {
if (!Cesium.defined(poly)) {
poly = new PolyLinePrimitive(positions);
} else {
positions.pop();
positions.push(cartesian);
}
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
//鼠标左键单击事件
handler.setInputAction(function(movement) {
if (!ismeare) {
return;
}
let ray = viewer.camera.getPickRay(movement.position);
//cartesian = viewer.scene.pickPosition(movement.position, new Cesium.Cartesian3());
//cartesian = viewer.scene.globe.pick(ray, viewer.scene);
cartesian = pickPosition(viewer, movement.position);
if (!cartesian) {
return;
}
if (ismeare) {
tooltip.style.display = "none";
if (!cartesian) {
return;
}
if (positions.length == 0) {
positions.push(cartesian.clone());
}
positions.push(cartesian);
floatingPoint = viewer.entities.add({
name: "drawpolylinepoint",
position: positions[positions.length - 1],
point: {
pixelSize: 4,
color: Cesium.Color.RED,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2
}
});
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
/**
* 双击事件
*/
handler.setInputAction(function(movement) {
that.mouseHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
// that.mouseHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
// that.mouseHandler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
// that.mouseHandler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK);
that.end();
if (that.onCompleted) {
that.onCompleted(that.positions);
}
}, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
handler.setInputAction(function(movement) {
that.clear();
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
var PolyLinePrimitive = (function() {
function _(positions) {
this.options = {
name: "drawpolyline",
polyline: {
show: true,
positions: [],
material: Cesium.Color.CHARTREUSE,
width: 3
//clampToGround: true
}
};
this.positions = positions;
this._init();
}
_.prototype._init = function() {
var _self = this;
var _update = function() {
return _self.positions;
this.options.polyline.positions = new Cesium.CallbackProperty(
_update,
false
);
viewer.entities.add(this.options);
};
return _;
})();
};
methods: {
// 在vuex main 模块中查找
...homeMapActions(["setNavIdx"]),
// 地球初始化
earthInit() {
this.$cesiumUtil.cesiumCommon.init3D();
},
loadBIM() {},
dblclickFunc(model) {
let entity = this.billboardEntityList.find(v => v.name === model.name);
if (entity) {
viewer.flyTo(entity, {
duration: 2,
offset: new Cesium.HeadingPitchRange(0, -0.7, 20)
});
}
},
loadData() {
let that = this;
viewer.scene.postProcessStages.fxaa.enabled = true;
threeDataManager.add3Dtiles(
"http://localhost:8083/cesium148/xiongan/models/pc/0/terra_b3dms/tileset.json",
{
maximumScreenSpaceError: 5.0
},
function(tileset) {
if (tileset) {
threeDataManager.update3DtilesHeight(tileset, -210);
//threeDataManager.flyTo3dtiles(tileset, 2, 1.5);
that.modelset = tileset;
that.flyHome();
setTimeout(that.addOtherData, 1000);
//that.addOtherData();
}
}
);
let tilesetBIM = threeDataManager.add3Dtiles(
"http://localhost:8083/cesium148/xiongan/tiles/tileset.json",
{
maximumScreenSpaceError: 2.0
},
function(tileset) {
if (tileset) {
that.bimset = tileset;
// threeDataManager.flyTo3dtiles(tileset);
//threeDataManager.update3DtilesHeight(tileset, -210);
threeDataManager.update3dtilesMaxtrix(tileset, {
rx: 0,
ry: 0,
rz: 0,
tx: 115.916939,
ty: 39.045741,
tz: 0.0,
scale: 1.0
});
}
}
);
new BIMMousePickUtil({
viewer: viewer,
tileset: tilesetBIM,
picking: true
});
},
addOtherData() {
this.billboardList.map(v => {
this.addBill(v.name, v.params, v.position, v.color, v.chName);
});
//this.$cesiumUtil.popupcesium.init(viewer, "#cesiumContainer");
let minlon = 115.915263;
let minlat = 39.046234;
let maxlat = minlat;
let maxlon = 115.915345;
let minheight = -0.585;
let maxheight = 3.962;
this.$cesiumUtil.cesiumUtil.addGao1(
minlon,
minlat,
maxlat,
maxlon,
minheight,
maxheight
);
let minlon1 = 115.91584;
let minlat1 = 39.046733;
let maxlat1 = 39.046792;
let maxlon1 = minlon1;
let minheight1 = 5.983;
let maxheight1 = 14.783;
this.$cesiumUtil.cesiumUtil.addGao2(
minlon1,
minlat1,
maxlat1,
maxlon1,
minheight1,
maxheight1
);
//左边的那个柱子
let minlon2 = 115.914828;
let minlat2 = 39.046194;
let maxlat2 = minlat2;
let maxlon2 = 115.914885;
let minheight2 = -1.111;
let maxheight2 = 7.949;
this.$cesiumUtil.cesiumUtil.addGao1(
minlon2,
minlat2,
maxlat2,
maxlon2,
minheight2,
maxheight2
);
//左边的那个测量坡度和高度
let middlePoint = [115.914799, 39.046336, -1.22];
let rightPoint = [115.914887, 39.046336, -1.22];
let leftPoint = [115.914751, 39.046336, 5.4];
this.$cesiumUtil.cesiumUtil.addsimpleline0(
[...leftPoint, ...middlePoint, ...rightPoint],
6,
Cesium.Color.YELLOW,
"louti",
true
);
let minlon3 = leftPoint[0];
let minlat3 = leftPoint[1];
let maxlat3 = minlat3;
let maxlon3 = middlePoint[0] + 0.00006;
let minheight3 = middlePoint[2];
let maxheight3 = leftPoint[2];
this.$cesiumUtil.cesiumUtil.addGao1(
minlon3,
minlat3,
maxlat3,
maxlon3,
minheight3,
maxheight3,
true
);
/
let point1 = [115.915271, 39.046487, 4];
let point2 = [115.915273, 39.046294, 4];
let point3 = [115.91534, 39.046288, 4];
let point4 = [115.915341, 39.046119, 4];
let point5 = [115.915873, 39.046107, 4];
this.$cesiumUtil.cesiumUtil.addsimpleline0(
[...point1, ...point2, ...point3, ...point4, ...point5],
5,
Cesium.Color.BLUE,
"louti"
);
let flashPointOption = this.$cesiumUtil.cesiumUtil.getFlashPoint(
Cesium.Color.DARKORANGE
);
this.$cesiumUtil.cesiumUtil.addEntity(
"louti",
flashPointOption,
Cesium.Cartesian3.fromDegrees(point1[0], point1[1], point1[2] + 0.1)
);
this.$cesiumUtil.cesiumUtil.addEntity(
"louti",
flashPointOption,
Cesium.Cartesian3.fromDegrees(point2[0], point2[1], point2[2] + 0.1)
);
this.$cesiumUtil.cesiumUtil.addEntity(
"louti",
flashPointOption,
Cesium.Cartesian3.fromDegrees(point3[0], point3[1], point3[2] + 0.1)
);
this.$cesiumUtil.cesiumUtil.addEntity(
"louti",
flashPointOption,
Cesium.Cartesian3.fromDegrees(point4[0], point4[1], point4[2] + 0.1)
);
this.$cesiumUtil.cesiumUtil.addEntity(
"louti",
flashPointOption,
Cesium.Cartesian3.fromDegrees(point5[0], point5[1], point5[2] + 0.1)
);
let dis1 = this.$cesiumUtil.cesiumCoordUtil.getDistanceF(point1, point2);
this.$cesiumUtil.cesiumUtil.addwalllabel(
(point1[0] + point2[0]) / 2,
(point1[1] + point2[1]) / 2,
point1[2] + 0.1,
dis1.toFixed(2) + "米",
"louti"
);
let dis2 = this.$cesiumUtil.cesiumCoordUtil.getDistanceF(point2, point3);
this.$cesiumUtil.cesiumUtil.addwalllabel(
(point2[0] + point3[0]) / 2,
(point2[1] + point3[1]) / 2,
point2[2] + 0.1,
dis2.toFixed(2) + "米",
"louti"
);
let dis3 = this.$cesiumUtil.cesiumCoordUtil.getDistanceF(point3, point4);
this.$cesiumUtil.cesiumUtil.addwalllabel(
(point3[0] + point4[0]) / 2,
(point3[1] + point4[1]) / 2,
point3[2] + 0.1,
dis3.toFixed(2) + "米",
"louti"
);
let dis4 = this.$cesiumUtil.cesiumCoordUtil.getDistanceF(point4, point5);
this.$cesiumUtil.cesiumUtil.addwalllabel(
(point4[0] + point5[0]) / 2,
(point4[1] + point5[1]) / 2,
point4[2] + 0.1,
dis4.toFixed(2) + "米",
"louti"
);
//圈梁
this.$cesiumUtil.cesiumUtil.addcorridor();
//右边的那个圈线
this.addLineFeatuers(this.rightRightPoints, Cesium.Color.BLUE, 0.15);
//左边那个圈线
this.addLineFeatuers(this.leftPoints, Cesium.Color.YELLOW, 0.5);
//左上那个圈线
this.addLineFeatuers(this.leftTopPoints, Cesium.Color.YELLOW, 0.5);
},
addLineFeatuers(linePoints, lineColor, addHeight) {
linePoints.forEach((e, index) => {
if ((index + 1) % 3 === 0) {
linePoints[index] += addHeight;
}
});
this.$cesiumUtil.cesiumUtil.addsimpleline0(
linePoints,
3,
lineColor || Cesium.Color.YELLOW,
"louti",
false
);
let flashPointOption = this.$cesiumUtil.cesiumUtil.getFlashPoint(
Cesium.Color.DARKORANGE
);
for (let index = 0; index < linePoints.length - 2; index += 3) {
this.$cesiumUtil.cesiumUtil.addEntity(
"louti",
flashPointOption,
Cesium.Cartesian3.fromDegrees(
linePoints[index],
linePoints[index + 1],
linePoints[index + 2] + 0.15
)
);
}
for (let index = 0; index < linePoints.length - 5; index += 3) {
let point1 = [
linePoints[index],
linePoints[index + 1],
linePoints[index + 2]
];
let point2 = [
linePoints[index + 3],
linePoints[index + 4],
linePoints[index + 5]
];
let dis = this.$cesiumUtil.cesiumCoordUtil.getDistanceF(point1, point2);
if (dis < 10) {
continue;
}
this.$cesiumUtil.cesiumUtil.addwalllabel(
(point1[0] + point2[0]) / 2,
(point1[1] + point2[1]) / 2,
point1[2] + 0.1,
dis.toFixed(2) + "米",
"louti"
);
}
},
addBill(type, datainfo, pos, color, label = "楼 体") {
var pinBuilder = new Cesium.PinBuilder();
var entity = viewer.entities.add({
// id: label,
name: type,
position: Cesium.Cartesian3.fromDegrees(pos.jd, pos.wd, pos.gd),
billboard: {
//image:pinBuilder.fromText("楼 体", Cesium.Color.ROYALBLUE, 65).toDataURL(),
image: pinBuilder.fromColor(color, 48).toDataURL(),
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
},
datainfo: datainfo
});
this.addinfobiaoqian(entity, label);
if (!this.billboardEntityList.find(v => v.name === type)) {
this.billboardEntityList.push(entity);
}
},
// 初始化方法
init() {
this.$refs.eleCheckList.open();
this.earthInit();
this.loadData();
},
openAnalyMask() {
bus.$emit("analysis_measure", true);
},
closemeasure() {
bus.$emit("analysis_measure", false);
},
closeCheck() {
this.$refs.eleCheckList.close();
},
flyHome() {
let that = this;
viewer.camera.flyTo({
destination: new Cesium.Cartesian3(
that.homePos.position.x,
that.homePos.position.y,
that.homePos.position.z
),
orientation: {
direction: new Cesium.Cartesian3(
that.homePos.direction.x,
that.homePos.direction.y,
that.homePos.direction.z
),
up: new Cesium.Cartesian3(
that.homePos.up.x,
that.homePos.up.y,
that.homePos.up.z
)
}
});
},