2020-06-29 11:14:44 +08:00
|
|
|
//直线箭头
|
|
|
|
var StraightArrow = function (viewer) {
|
|
|
|
this.type = "StraightArrow";
|
|
|
|
this.objId = Number((new Date()).getTime() + "" + Number(Math.random() * 1000).toFixed(0)); //用于区分多个相同箭头时
|
|
|
|
this.viewer = viewer;
|
|
|
|
this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
|
|
|
|
this.pointImageUrl = "img/point.png";
|
|
|
|
this.fillMaterial = Cesium.Color.fromCssColorString('#0000FF').withAlpha(0.8);
|
|
|
|
this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({
|
|
|
|
dashLength: 16,
|
|
|
|
color: Cesium.Color.fromCssColorString('#f00').withAlpha(0.7)
|
|
|
|
});
|
|
|
|
this.positions = [];
|
|
|
|
this.firstPoint = null;
|
|
|
|
this.floatPoint = null;
|
|
|
|
this.arrowEntity = null;
|
|
|
|
this.state = -1; //state用于区分当前的状态 0 为删除 1为添加 2为编辑
|
|
|
|
this.selectPoint = null;
|
|
|
|
this.clickStep = 0;
|
|
|
|
this.modifyHandler = null;
|
|
|
|
}
|
|
|
|
StraightArrow.prototype = {
|
|
|
|
disable: function () {
|
2019-11-21 15:46:14 +08:00
|
|
|
this.positions = [];
|
2020-06-29 11:14:44 +08:00
|
|
|
if (this.firstPoint) {
|
|
|
|
this.viewer.entities.remove(this.firstPoint);
|
|
|
|
this.firstPoint = null;
|
|
|
|
}
|
|
|
|
if (this.floatPoint) {
|
|
|
|
this.viewer.entities.remove(this.floatPoint);
|
|
|
|
this.floatPoint = null;
|
|
|
|
}
|
2019-11-21 15:46:14 +08:00
|
|
|
if (this.arrowEntity) {
|
|
|
|
this.viewer.entities.remove(this.arrowEntity);
|
|
|
|
this.arrowEntity = null;
|
|
|
|
}
|
|
|
|
this.state = -1;
|
|
|
|
if (this.handler) {
|
|
|
|
this.handler.destroy();
|
|
|
|
this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
|
|
|
|
}
|
|
|
|
if (this.selectPoint) {
|
|
|
|
this.viewer.entities.remove(this.selectPoint);
|
|
|
|
this.selectPoint = null;
|
|
|
|
}
|
|
|
|
if (this.modifyHandler) {
|
|
|
|
this.modifyHandler.destroy();
|
|
|
|
this.modifyHandler = null;
|
|
|
|
}
|
|
|
|
this.clickStep = 0;
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
startDraw: function () {
|
2019-11-21 15:46:14 +08:00
|
|
|
var $this = this;
|
|
|
|
this.state = 1;
|
2020-06-29 11:14:44 +08:00
|
|
|
this.handler.setInputAction(function (evt) { //单机开始绘制
|
|
|
|
// var ray = viewer.camera.getPickRay(evt.position);
|
|
|
|
// if (!ray) return;
|
|
|
|
// var cartesian = viewer.scene.globe.pick(ray, $this.viewer.scene);
|
|
|
|
debugger;
|
|
|
|
var cartesian;
|
|
|
|
cartesian = getCatesian3FromPX(evt.position, $this.viewer);
|
|
|
|
if (!cartesian) return;
|
2019-11-21 15:46:14 +08:00
|
|
|
if ($this.positions.length == 0) {
|
2020-06-29 11:14:44 +08:00
|
|
|
$this.firstPoint = $this.creatPoint(cartesian);
|
|
|
|
$this.firstPoint.type = "firstPoint";
|
2019-11-21 15:46:14 +08:00
|
|
|
$this.floatPoint = $this.creatPoint(cartesian);
|
2020-06-29 11:14:44 +08:00
|
|
|
$this.floatPoint.type = "floatPoint";
|
|
|
|
$this.positions.push(cartesian);
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
if ($this.positions.length == 3) {
|
|
|
|
$this.firstPoint.show = false;
|
|
|
|
$this.floatPoint.show = false;
|
2019-11-21 15:46:14 +08:00
|
|
|
$this.handler.destroy();
|
2020-06-29 11:14:44 +08:00
|
|
|
$this.arrowEntity.objId = $this.objId;
|
|
|
|
$this.state = -1;
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
$this.positions.push(cartesian.clone());
|
2019-11-21 15:46:14 +08:00
|
|
|
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
2020-06-29 11:14:44 +08:00
|
|
|
this.handler.setInputAction(function (evt) { //移动时绘制面
|
|
|
|
if ($this.positions.length < 1) return;
|
|
|
|
// var ray = viewer.camera.getPickRay(evt.endPosition);
|
|
|
|
// if (!ray) return;
|
|
|
|
// var cartesian = viewer.scene.globe.pick(ray, $this.viewer.scene);
|
|
|
|
var cartesian;
|
|
|
|
cartesian = getCatesian3FromPX(evt.endPosition, $this.viewer);
|
|
|
|
if (!cartesian) return;
|
2019-11-21 15:46:14 +08:00
|
|
|
|
|
|
|
$this.floatPoint.position.setValue(cartesian);
|
|
|
|
if ($this.positions.length >= 2) {
|
|
|
|
if (!Cesium.defined($this.arrowEntity)) {
|
|
|
|
$this.positions.push(cartesian);
|
|
|
|
$this.arrowEntity = $this.showArrowOnMap($this.positions);
|
|
|
|
} else {
|
|
|
|
$this.positions.pop();
|
|
|
|
$this.positions.push(cartesian);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
startModify: function () { //修改箭头
|
2019-11-21 15:46:14 +08:00
|
|
|
this.state = 2;
|
2020-06-29 11:14:44 +08:00
|
|
|
this.firstPoint.show = true;
|
|
|
|
this.floatPoint.show = true;
|
2019-11-21 15:46:14 +08:00
|
|
|
var $this = this;
|
2020-06-29 11:14:44 +08:00
|
|
|
this.clickStep = 0;
|
2019-11-21 15:46:14 +08:00
|
|
|
if (!this.modifyHandler) this.modifyHandler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
|
2020-06-29 11:14:44 +08:00
|
|
|
this.modifyHandler.setInputAction(function (evt) { //单机开始绘制
|
2019-11-21 15:46:14 +08:00
|
|
|
var pick = $this.viewer.scene.pick(evt.position);
|
|
|
|
if (Cesium.defined(pick) && pick.id) {
|
|
|
|
$this.clickStep++;
|
2020-06-29 11:14:44 +08:00
|
|
|
if (!pick.id.objId)
|
2019-11-21 15:46:14 +08:00
|
|
|
$this.selectPoint = pick.id;
|
2020-06-29 11:14:44 +08:00
|
|
|
} else { //激活移动点之后 单机面之外 移除这个事件
|
|
|
|
$this.modifyHandler.destroy();
|
2019-11-21 15:46:14 +08:00
|
|
|
$this.modifyHandler = null;
|
2020-06-29 11:14:44 +08:00
|
|
|
$this.firstPoint.show = false;
|
|
|
|
$this.floatPoint.show = false;
|
|
|
|
$this.state = -1;
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
|
|
|
|
//选中点后 第二次点击 则重新定位该点
|
2019-11-21 15:46:14 +08:00
|
|
|
if ($this.clickStep == 2) {
|
|
|
|
$this.clickStep = 0;
|
2020-06-29 11:14:44 +08:00
|
|
|
var cartesian;
|
|
|
|
cartesian = getCatesian3FromPX(evt.position, $this.viewer);
|
|
|
|
if (!cartesian) return;
|
|
|
|
if ($this.selectPoint) {
|
|
|
|
$this.selectPoint.position.setValue(cartesian);
|
|
|
|
$this.selectPoint = null;
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
2020-06-29 11:14:44 +08:00
|
|
|
this.modifyHandler.setInputAction(function (evt) {
|
2019-11-21 15:46:14 +08:00
|
|
|
if ($this.selectPoint) {
|
2020-06-29 11:14:44 +08:00
|
|
|
var cartesian;
|
|
|
|
cartesian = getCatesian3FromPX(evt.endPosition, $this.viewer);
|
|
|
|
if (!cartesian) return;
|
2019-11-21 15:46:14 +08:00
|
|
|
$this.selectPoint.position.setValue(cartesian);
|
2020-06-29 11:14:44 +08:00
|
|
|
if ($this.selectPoint.type == "firstPoint") {
|
|
|
|
$this.positions[1] = cartesian;
|
|
|
|
}
|
|
|
|
if ($this.selectPoint.type == "floatPoint") {
|
|
|
|
$this.positions[2] = cartesian;
|
|
|
|
}
|
2019-11-21 15:46:14 +08:00
|
|
|
} else {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
createByData: function (data) { //通过传入的经纬度数组 构建箭头
|
|
|
|
this.state = -1;
|
|
|
|
this.positions = [];
|
|
|
|
var arr = [];
|
|
|
|
for (var i = 0; i < data.length; i++) {
|
|
|
|
var cart3 = Cesium.Cartesian3.fromDegrees(data[i][0], data[i][1]);
|
|
|
|
arr.push(cart3);
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
this.positions = arr;
|
|
|
|
this.firstPoint = this.creatPoint(this.positions[1]);
|
|
|
|
this.firstPoint.type = "firstPoint";
|
|
|
|
this.floatPoint = this.creatPoint(this.positions[2]);
|
|
|
|
this.floatPoint.type = "floatPoint";
|
|
|
|
this.arrowEntity = this.showArrowOnMap(this.positions);
|
|
|
|
this.firstPoint.show = false;
|
|
|
|
this.floatPoint.show = false;
|
|
|
|
this.arrowEntity.objId = this.objId;
|
|
|
|
},
|
|
|
|
clear: function () { //清除绘制箭头
|
|
|
|
this.state = 0;
|
|
|
|
if (this.firstPoint) this.viewer.entities.remove(this.firstPoint);
|
2019-11-21 15:46:14 +08:00
|
|
|
if (this.floatPoint) this.viewer.entities.remove(this.floatPoint);
|
|
|
|
if (this.arrowEntity) this.viewer.entities.remove(this.arrowEntity);
|
|
|
|
this.state = -1;
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
getLnglats: function () {
|
2019-11-21 15:46:14 +08:00
|
|
|
var arr = [];
|
|
|
|
for (var i = 0; i < this.positions.length; i++) {
|
|
|
|
var item = this.cartesianToLatlng(this.positions[i]);
|
|
|
|
arr.push(item);
|
|
|
|
}
|
|
|
|
return arr;
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
getPositions: function () { //获取直角箭头中的关键点
|
2019-11-21 15:46:14 +08:00
|
|
|
return this.positions;
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
creatPoint: function (cartesian) {
|
|
|
|
var point = this.viewer.entities.add({
|
2019-11-21 15:46:14 +08:00
|
|
|
position: cartesian,
|
|
|
|
billboard: {
|
|
|
|
image: this.pointImageUrl,
|
|
|
|
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
|
2020-06-29 11:14:44 +08:00
|
|
|
//heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
|
|
|
|
disableDepthTestDistance: Number.POSITIVE_INFINITY
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|
|
|
|
});
|
2020-06-29 11:14:44 +08:00
|
|
|
point.attr = "editPoint";
|
|
|
|
return point;
|
|
|
|
},
|
|
|
|
showArrowOnMap: function (positions) {
|
2019-11-21 15:46:14 +08:00
|
|
|
var $this = this;
|
2020-06-29 11:14:44 +08:00
|
|
|
var update = function () {
|
|
|
|
if (positions.length < 2) {
|
2019-11-21 15:46:14 +08:00
|
|
|
return null;
|
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
var p1 = positions[1];
|
|
|
|
var p2 = positions[2];
|
|
|
|
var firstPoint = $this.cartesianToLatlng(p1);
|
|
|
|
var endPoints = $this.cartesianToLatlng(p2);
|
|
|
|
var arrow = [];
|
|
|
|
var res = xp.algorithm.fineArrow([firstPoint[0], firstPoint[1]], [endPoints[0], endPoints[1]]);
|
|
|
|
var index = JSON.stringify(res).indexOf("null");
|
|
|
|
if (index != -1) return [];
|
|
|
|
for(var i=0;i<res.length;i++){
|
|
|
|
var c3 = new Cesium.Cartesian3(res[i].x,res[i].y,res[i].z);
|
|
|
|
arrow.push(c3);
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
return new Cesium.PolygonHierarchy(arrow);
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
return this.viewer.entities.add({
|
2019-11-21 15:46:14 +08:00
|
|
|
polygon: new Cesium.PolygonGraphics({
|
|
|
|
hierarchy: new Cesium.CallbackProperty(update, false),
|
|
|
|
show: true,
|
|
|
|
fill: true,
|
|
|
|
material: $this.fillMaterial
|
|
|
|
})
|
2020-06-29 11:14:44 +08:00
|
|
|
});
|
|
|
|
},
|
|
|
|
cartesianToLatlng: function (cartesian) {
|
2019-11-21 15:46:14 +08:00
|
|
|
var latlng = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
|
|
|
|
var lat = Cesium.Math.toDegrees(latlng.latitude);
|
|
|
|
var lng = Cesium.Math.toDegrees(latlng.longitude);
|
|
|
|
return [lng, lat];
|
|
|
|
}
|
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
|
|
|
|
///====================================================================================================
|
|
|
|
//攻击箭头
|
|
|
|
var AttackArrow = function () {
|
|
|
|
this.type = "AttackArrow";
|
|
|
|
this.objId = Number((new Date()).getTime() + "" + Number(Math.random() * 1000).toFixed(0))
|
|
|
|
this.viewer = viewer;
|
|
|
|
this.pointImageUrl = "img/point.png";
|
|
|
|
this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
|
|
|
|
this.fillMaterial = Cesium.Color.RED.withAlpha(0.8);
|
|
|
|
this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({
|
|
|
|
dashLength: 16,
|
|
|
|
color: Cesium.Color.fromCssColorString('#f00').withAlpha(0.7)
|
|
|
|
});
|
|
|
|
this.positions = []; //控制点
|
|
|
|
this.state = -1; //state用于区分当前的状态 0 为删除 1为添加 2为编辑
|
|
|
|
this.floatPoint = null;
|
|
|
|
this.arrowEntity = null;
|
|
|
|
this.pointArr = []; //中间各点
|
|
|
|
this.selectPoint = null;
|
|
|
|
this.clickStep = 0; //用于控制点的移动结束
|
|
|
|
this.modifyHandler = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
AttackArrow.prototype = {
|
|
|
|
disable: function () {
|
2019-11-21 15:46:14 +08:00
|
|
|
this.positions = [];
|
|
|
|
if (this.arrowEntity) {
|
|
|
|
this.viewer.entities.remove(this.arrowEntity);
|
|
|
|
this.arrowEntity = null;
|
|
|
|
}
|
|
|
|
this.state = -1;
|
|
|
|
if (this.handler) {
|
|
|
|
this.handler.destroy();
|
|
|
|
this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
|
|
|
|
}
|
|
|
|
if (this.floatPoint) {
|
|
|
|
this.viewer.entities.remove(this.floatPoint);
|
|
|
|
this.floatPoint = null;
|
|
|
|
}
|
|
|
|
if (this.selectPoint) {
|
|
|
|
this.viewer.entities.remove(this.selectPoint);
|
|
|
|
this.selectPoint = null;
|
|
|
|
}
|
|
|
|
for (var i = 0; i < this.pointArr.length; i++) {
|
|
|
|
if (this.pointArr[i]) this.viewer.entities.remove(this.pointArr[i]);
|
|
|
|
}
|
|
|
|
if (this.modifyHandler) {
|
|
|
|
this.modifyHandler.destroy();
|
|
|
|
this.modifyHandler = null;
|
|
|
|
}
|
|
|
|
this.clickStep = 0;
|
|
|
|
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
startDraw: function () {
|
2019-11-21 15:46:14 +08:00
|
|
|
var $this = this;
|
|
|
|
this.state = 1;
|
2020-06-29 11:14:44 +08:00
|
|
|
this.handler.setInputAction(function (evt) { //单机开始绘制
|
|
|
|
var cartesian;
|
|
|
|
cartesian = getCatesian3FromPX(evt.position, $this.viewer);
|
|
|
|
if (!cartesian) return;
|
|
|
|
// var ray = viewer.camera.getPickRay(evt.position);
|
|
|
|
// if (!ray) return;
|
|
|
|
// var cartesian = viewer.scene.globe.pick(ray, $this.viewer.scene);
|
2019-11-21 15:46:14 +08:00
|
|
|
if ($this.positions.length == 0) {
|
|
|
|
$this.floatPoint = $this.creatPoint(cartesian);
|
|
|
|
$this.floatPoint.wz = -1;
|
|
|
|
}
|
|
|
|
$this.positions.push(cartesian);
|
|
|
|
var point = $this.creatPoint(cartesian);
|
|
|
|
if ($this.positions.length > 2) {
|
2020-06-29 11:14:44 +08:00
|
|
|
point.wz = $this.positions.length - 1; //点对应的在positions中的位置 屏蔽mouseMove里往postions添加时 未创建点
|
2019-11-21 15:46:14 +08:00
|
|
|
} else {
|
2020-06-29 11:14:44 +08:00
|
|
|
point.wz = $this.positions.length; //点对应的在positions中的位置
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|
|
|
|
$this.pointArr.push(point);
|
|
|
|
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
2020-06-29 11:14:44 +08:00
|
|
|
this.handler.setInputAction(function (evt) { //移动时绘制面
|
2019-11-21 15:46:14 +08:00
|
|
|
if ($this.positions.length < 2) return;
|
2020-06-29 11:14:44 +08:00
|
|
|
// var ray = viewer.camera.getPickRay(evt.endPosition);
|
|
|
|
// if (!ray) return;
|
|
|
|
// var cartesian = viewer.scene.globe.pick(ray, $this.viewer.scene);
|
|
|
|
var cartesian;
|
|
|
|
cartesian = getCatesian3FromPX(evt.endPosition, $this.viewer);
|
|
|
|
if (!cartesian) return;
|
2019-11-21 15:46:14 +08:00
|
|
|
$this.floatPoint.position.setValue(cartesian);
|
|
|
|
if ($this.positions.length >= 2) {
|
|
|
|
if (!Cesium.defined($this.arrowEntity)) {
|
|
|
|
$this.positions.push(cartesian);
|
|
|
|
$this.arrowEntity = $this.showArrowOnMap($this.positions);
|
|
|
|
$this.arrowEntity.objId = $this.objId;
|
|
|
|
} else {
|
|
|
|
$this.positions.pop();
|
|
|
|
$this.positions.push(cartesian);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
2020-06-29 11:14:44 +08:00
|
|
|
this.handler.setInputAction(function (evt) { //右击结束绘制
|
|
|
|
// var ray = viewer.camera.getPickRay(evt.position);
|
|
|
|
// if (!ray) return;
|
|
|
|
// var cartesian = viewer.scene.globe.pick(ray, $this.viewer.scene);
|
|
|
|
var cartesian;
|
|
|
|
cartesian = getCatesian3FromPX(evt.position, $this.viewer);
|
|
|
|
if (!cartesian) return;
|
2019-11-21 15:46:14 +08:00
|
|
|
for (var i = 0; i < $this.pointArr.length; i++) {
|
|
|
|
$this.pointArr[i].show = false;
|
|
|
|
}
|
|
|
|
$this.floatPoint.show = false;
|
|
|
|
$this.viewer.entities.remove($this.floatPoint);
|
|
|
|
$this.floatPoint = null;
|
|
|
|
var point = $this.creatPoint(cartesian);
|
|
|
|
point.show = false;
|
|
|
|
point.wz = $this.positions.length;
|
|
|
|
$this.pointArr.push(point);
|
|
|
|
$this.handler.destroy();
|
|
|
|
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
createByData: function (data) { //根据传入的数据构建箭头
|
|
|
|
this.positions = []; //控制点
|
|
|
|
this.state = -1; //state用于区分当前的状态 0 为删除 1为添加 2为编辑
|
2019-11-21 15:46:14 +08:00
|
|
|
this.floatPoint = null;
|
2020-06-29 11:14:44 +08:00
|
|
|
this.pointArr = []; //中间各点
|
2019-11-21 15:46:14 +08:00
|
|
|
this.selectPoint = null;
|
2020-06-29 11:14:44 +08:00
|
|
|
this.clickStep = 0; //用于控制点的移动结束
|
2019-11-21 15:46:14 +08:00
|
|
|
this.modifyHandler = null;
|
|
|
|
var arr = [];
|
|
|
|
for (var i = 0; i < data.length; i++) {
|
|
|
|
var cart3 = Cesium.Cartesian3.fromDegrees(data[i][0], data[i][1]);
|
|
|
|
arr.push(cart3);
|
|
|
|
}
|
|
|
|
this.positions = arr;
|
2020-06-29 11:14:44 +08:00
|
|
|
//构建控制点
|
2019-11-21 15:46:14 +08:00
|
|
|
for (var i = 0; i < this.positions.length; i++) {
|
|
|
|
var point = this.creatPoint(this.positions[i]);
|
|
|
|
point.show = false;
|
|
|
|
point.wz = i + 1;
|
|
|
|
this.pointArr.push(point);
|
|
|
|
}
|
|
|
|
this.arrowEntity = this.showArrowOnMap(this.positions);
|
|
|
|
this.arrowEntity.objId = this.objId;
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
startModify: function () { //修改箭头
|
2019-11-21 15:46:14 +08:00
|
|
|
this.state = 2;
|
|
|
|
var $this = this;
|
|
|
|
for (var i = 0; i < $this.pointArr.length; i++) {
|
|
|
|
$this.pointArr[i].show = true;
|
|
|
|
}
|
|
|
|
if (!this.modifyHandler) this.modifyHandler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
|
2020-06-29 11:14:44 +08:00
|
|
|
this.modifyHandler.setInputAction(function (evt) { //单机开始绘制
|
2019-11-21 15:46:14 +08:00
|
|
|
var pick = $this.viewer.scene.pick(evt.position);
|
|
|
|
if (Cesium.defined(pick) && pick.id) {
|
|
|
|
$this.clickStep++;
|
2020-06-29 11:14:44 +08:00
|
|
|
if (!pick.id.objId)
|
2019-11-21 15:46:14 +08:00
|
|
|
$this.selectPoint = pick.id;
|
2020-06-29 11:14:44 +08:00
|
|
|
} else { //激活移动点之后 单机面之外 移除这个事件
|
2019-11-21 15:46:14 +08:00
|
|
|
for (var i = 0; i < $this.pointArr.length; i++) {
|
|
|
|
$this.pointArr[i].show = false;
|
|
|
|
}
|
|
|
|
if ($this.floatPoint) $this.floatPoint.show = false;
|
|
|
|
$this.state = -1;
|
|
|
|
$this.modifyHandler.destroy();
|
|
|
|
$this.modifyHandler = null;
|
|
|
|
}
|
|
|
|
if ($this.clickStep == 2) {
|
|
|
|
$this.clickStep = 0;
|
2020-06-29 11:14:44 +08:00
|
|
|
// var ray = $this.viewer.camera.getPickRay(evt.position);
|
|
|
|
// if (!ray) return;
|
|
|
|
// var cartesian = $this.viewer.scene.globe.pick(ray, $this.viewer.scene);
|
|
|
|
var cartesian;
|
|
|
|
cartesian = getCatesian3FromPX(evt.position, $this.viewer);
|
|
|
|
if (!cartesian) return;
|
|
|
|
if ($this.selectPoint) {
|
2019-11-21 15:46:14 +08:00
|
|
|
$this.selectPoint.position.setValue(cartesian);
|
|
|
|
$this.selectPoint = null;
|
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
|
2019-11-21 15:46:14 +08:00
|
|
|
};
|
|
|
|
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
2020-06-29 11:14:44 +08:00
|
|
|
this.modifyHandler.setInputAction(function (evt) { //单机开始绘制
|
|
|
|
// var ray = $this.viewer.camera.getPickRay(evt.endPosition);
|
|
|
|
// if (!ray) return;
|
|
|
|
// var cartesian = $this.viewer.scene.globe.pick(ray, $this.viewer.scene);
|
|
|
|
var cartesian;
|
|
|
|
cartesian = getCatesian3FromPX(evt.endPosition, $this.viewer);
|
|
|
|
if (!cartesian) return;
|
2019-11-21 15:46:14 +08:00
|
|
|
if ($this.selectPoint) {
|
|
|
|
$this.selectPoint.position.setValue(cartesian);
|
2020-06-29 11:14:44 +08:00
|
|
|
$this.positions[$this.selectPoint.wz - 1] = cartesian; //上方的wz用于此处辨识修改positions数组里的哪个元素
|
2019-11-21 15:46:14 +08:00
|
|
|
} else {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
clear: function () { //清除绘制箭头
|
2019-11-21 15:46:14 +08:00
|
|
|
this.state = 0;
|
|
|
|
for (var i = 0; i < this.pointArr.length; i++) {
|
|
|
|
if (this.pointArr[i]) this.viewer.entities.remove(this.pointArr[i]);
|
|
|
|
}
|
|
|
|
if (this.floatPoint) this.viewer.entities.remove(this.floatPoint);
|
|
|
|
if (this.arrowEntity) this.viewer.entities.remove(this.arrowEntity);
|
|
|
|
this.state = -1;
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
getLnglats: function () {
|
2019-11-21 15:46:14 +08:00
|
|
|
var arr = [];
|
|
|
|
for (var i = 0; i < this.positions.length; i++) {
|
|
|
|
var item = this.cartesianToLatlng(this.positions[i]);
|
|
|
|
arr.push(item);
|
|
|
|
}
|
|
|
|
return arr;
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
getPositions: function () { //获取直角箭头中的控制点 世界坐标
|
2019-11-21 15:46:14 +08:00
|
|
|
return this.positions;
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
creatPoint: function (cartesian) {
|
|
|
|
var point = this.viewer.entities.add({
|
2019-11-21 15:46:14 +08:00
|
|
|
position: cartesian,
|
|
|
|
billboard: {
|
|
|
|
image: this.pointImageUrl,
|
|
|
|
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
|
2020-06-29 11:14:44 +08:00
|
|
|
//heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|
|
|
|
});
|
2020-06-29 11:14:44 +08:00
|
|
|
point.attr = "editPoint";
|
|
|
|
return point;
|
|
|
|
},
|
|
|
|
showArrowOnMap: function (positions) {
|
2019-11-21 15:46:14 +08:00
|
|
|
var $this = this;
|
2020-06-29 11:14:44 +08:00
|
|
|
var update = function () {
|
|
|
|
//计算面
|
2019-11-21 15:46:14 +08:00
|
|
|
if (positions.length < 3) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
var lnglatArr = [];
|
|
|
|
for (var i = 0; i < positions.length; i++) {
|
|
|
|
var lnglat = $this.cartesianToLatlng(positions[i]);
|
|
|
|
lnglatArr.push(lnglat)
|
|
|
|
}
|
|
|
|
var res = xp.algorithm.tailedAttackArrow(lnglatArr);
|
|
|
|
var index = JSON.stringify(res.polygonalPoint).indexOf("null");
|
|
|
|
var returnData = [];
|
|
|
|
if (index == -1) returnData = res.polygonalPoint;
|
2020-06-29 11:14:44 +08:00
|
|
|
return new Cesium.PolygonHierarchy(returnData);
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
return this.viewer.entities.add({
|
2019-11-21 15:46:14 +08:00
|
|
|
polygon: new Cesium.PolygonGraphics({
|
|
|
|
hierarchy: new Cesium.CallbackProperty(update, false),
|
|
|
|
show: true,
|
|
|
|
fill: true,
|
|
|
|
material: $this.fillMaterial
|
|
|
|
})
|
2020-06-29 11:14:44 +08:00
|
|
|
});
|
|
|
|
},
|
|
|
|
cartesianToLatlng: function (cartesian) {
|
2019-11-21 15:46:14 +08:00
|
|
|
var latlng = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
|
|
|
|
var lat = Cesium.Math.toDegrees(latlng.latitude);
|
|
|
|
var lng = Cesium.Math.toDegrees(latlng.longitude);
|
|
|
|
return [lng, lat];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-29 11:14:44 +08:00
|
|
|
///====================================================================================================
|
|
|
|
//钳击箭头
|
|
|
|
var PincerArrow = function () {
|
|
|
|
this.type = "PincerArrow";
|
|
|
|
this.objId = Number((new Date()).getTime() + "" + Number(Math.random() * 1000).toFixed(0))
|
|
|
|
this.viewer = viewer;
|
|
|
|
this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
|
|
|
|
this.pointImageUrl = "img/point.png";
|
|
|
|
this.fillMaterial = Cesium.Color.YELLOW.withAlpha(0.8);
|
|
|
|
this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({
|
|
|
|
dashLength: 16,
|
|
|
|
color: Cesium.Color.fromCssColorString('#f00').withAlpha(0.7)
|
|
|
|
});
|
|
|
|
this.positions = [];
|
|
|
|
this.state = -1; //state用于区分当前的状态 0 为删除 1为添加 2为编辑
|
|
|
|
this.floatPoint = null;
|
|
|
|
this.pointArr = [];
|
|
|
|
this.selectPoint = null;
|
|
|
|
this.clickStep = 0; //用于控制点的移动结束
|
|
|
|
this.modifyHandler = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
PincerArrow.prototype = {
|
|
|
|
disable: function () {
|
2019-11-21 15:46:14 +08:00
|
|
|
this.positions = [];
|
|
|
|
if (this.arrowEntity) {
|
|
|
|
this.viewer.entities.remove(this.arrowEntity);
|
|
|
|
this.arrowEntity = null;
|
|
|
|
}
|
|
|
|
this.state = -1;
|
|
|
|
if (this.handler) {
|
|
|
|
this.handler.destroy();
|
|
|
|
this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
|
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
if (this.floatPoint) {
|
|
|
|
this.viewer.entities.remove(this.floatPoint);
|
|
|
|
this.floatPoint = null;
|
|
|
|
}
|
2019-11-21 15:46:14 +08:00
|
|
|
if (this.selectPoint) {
|
|
|
|
this.viewer.entities.remove(this.selectPoint);
|
|
|
|
this.selectPoint = null;
|
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
for (var i = 0; i < this.pointArr.length; i++) {
|
|
|
|
if (this.pointArr[i]) this.viewer.entities.remove(this.pointArr[i]);
|
|
|
|
}
|
2019-11-21 15:46:14 +08:00
|
|
|
if (this.modifyHandler) {
|
|
|
|
this.modifyHandler.destroy();
|
|
|
|
this.modifyHandler = null;
|
|
|
|
}
|
|
|
|
this.clickStep = 0;
|
2020-06-29 11:14:44 +08:00
|
|
|
|
|
|
|
},
|
|
|
|
startDraw: function () {
|
2019-11-21 15:46:14 +08:00
|
|
|
var $this = this;
|
|
|
|
this.state = 1;
|
2020-06-29 11:14:44 +08:00
|
|
|
this.handler.setInputAction(function (evt) { //单机开始绘制
|
|
|
|
// var ray = viewer.camera.getPickRay(evt.position);
|
|
|
|
// if (!ray) return;
|
|
|
|
// var cartesian = viewer.scene.globe.pick(ray, $this.viewer.scene);
|
|
|
|
var cartesian;
|
|
|
|
cartesian = getCatesian3FromPX(evt.position, $this.viewer);
|
|
|
|
if (!cartesian) return;
|
|
|
|
|
2019-11-21 15:46:14 +08:00
|
|
|
if ($this.positions.length == 0) {
|
|
|
|
$this.floatPoint = $this.creatPoint(cartesian);
|
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
if ($this.positions.length > 4) { //结束绘制
|
|
|
|
var point = $this.creatPoint(cartesian);
|
|
|
|
point.wz = $this.positions.length;
|
|
|
|
$this.pointArr.push(point);
|
|
|
|
for (var i = 0; i < $this.pointArr.length; i++) {
|
|
|
|
$this.pointArr[i].show = false;
|
|
|
|
}
|
|
|
|
if ($this.floatPoint) { //移除动态点
|
|
|
|
$this.floatPoint.show = false;
|
|
|
|
$this.viewer.entities.remove($this.floatPoint);
|
|
|
|
$this.floatPoint = null;
|
|
|
|
}
|
2019-11-21 15:46:14 +08:00
|
|
|
$this.handler.destroy();
|
2020-06-29 11:14:44 +08:00
|
|
|
return;
|
|
|
|
} else {
|
|
|
|
$this.positions.push(cartesian);
|
|
|
|
var point = $this.creatPoint(cartesian);
|
|
|
|
if ($this.positions.length > 2) {
|
|
|
|
point.wz = $this.positions.length - 1; //点对应的在positions中的位置 屏蔽mouseMove里往postions添加时 未创建点
|
|
|
|
} else {
|
|
|
|
point.wz = $this.positions.length; //点对应的在positions中的位置
|
|
|
|
}
|
|
|
|
$this.pointArr.push(point);
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|
|
|
|
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
2020-06-29 11:14:44 +08:00
|
|
|
|
|
|
|
this.handler.setInputAction(function (evt) { //移动时绘制面
|
|
|
|
if ($this.positions.length < 2) return;
|
|
|
|
// var ray = viewer.camera.getPickRay(evt.endPosition);
|
|
|
|
// if (!ray) return;
|
|
|
|
// var cartesian = viewer.scene.globe.pick(ray, $this.viewer.scene);
|
|
|
|
var cartesian;
|
|
|
|
cartesian = getCatesian3FromPX(evt.endPosition, $this.viewer);
|
|
|
|
if (!cartesian) return;
|
2019-11-21 15:46:14 +08:00
|
|
|
$this.floatPoint.position.setValue(cartesian);
|
|
|
|
if ($this.positions.length >= 2) {
|
|
|
|
if (!Cesium.defined($this.arrowEntity)) {
|
|
|
|
$this.positions.push(cartesian);
|
|
|
|
$this.arrowEntity = $this.showArrowOnMap($this.positions);
|
2020-06-29 11:14:44 +08:00
|
|
|
$this.arrowEntity.objId = $this.objId;
|
2019-11-21 15:46:14 +08:00
|
|
|
} else {
|
|
|
|
$this.positions.pop();
|
|
|
|
$this.positions.push(cartesian);
|
|
|
|
}
|
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
|
2019-11-21 15:46:14 +08:00
|
|
|
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
2020-06-29 11:14:44 +08:00
|
|
|
|
|
|
|
},
|
|
|
|
createByData: function (data) { //根据传入的数据构建箭头
|
|
|
|
this.positions = []; //控制点
|
|
|
|
this.state = -1; //state用于区分当前的状态 0 为删除 1为添加 2为编辑
|
|
|
|
this.floatPoint = null;
|
|
|
|
this.pointArr = []; //中间各点
|
|
|
|
this.selectPoint = null;
|
|
|
|
this.clickStep = 0; //用于控制点的移动结束
|
|
|
|
this.modifyHandler = null;
|
|
|
|
var arr = [];
|
|
|
|
for (var i = 0; i < data.length; i++) {
|
|
|
|
var cart3 = Cesium.Cartesian3.fromDegrees(data[i][0], data[i][1]);
|
|
|
|
arr.push(cart3);
|
|
|
|
}
|
|
|
|
this.positions = arr;
|
|
|
|
//构建控制点
|
|
|
|
for (var i = 0; i < this.positions.length; i++) {
|
|
|
|
var point = this.creatPoint(this.positions[i]);
|
|
|
|
point.show = false;
|
|
|
|
point.wz = i + 1;
|
|
|
|
this.pointArr.push(point);
|
|
|
|
}
|
|
|
|
this.arrowEntity = this.showArrowOnMap(this.positions);
|
|
|
|
this.arrowEntity.objId = this.objId;
|
|
|
|
},
|
|
|
|
startModify: function () { //修改箭头
|
2019-11-21 15:46:14 +08:00
|
|
|
this.state = 2;
|
|
|
|
var $this = this;
|
2020-06-29 11:14:44 +08:00
|
|
|
for (var i = 0; i < $this.pointArr.length; i++) {
|
|
|
|
$this.pointArr[i].show = true;
|
|
|
|
}
|
2019-11-21 15:46:14 +08:00
|
|
|
if (!this.modifyHandler) this.modifyHandler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
|
2020-06-29 11:14:44 +08:00
|
|
|
this.modifyHandler.setInputAction(function (evt) { //单机开始绘制
|
2019-11-21 15:46:14 +08:00
|
|
|
var pick = $this.viewer.scene.pick(evt.position);
|
|
|
|
if (Cesium.defined(pick) && pick.id) {
|
|
|
|
$this.clickStep++;
|
2020-06-29 11:14:44 +08:00
|
|
|
if (!pick.id.objId)
|
2019-11-21 15:46:14 +08:00
|
|
|
$this.selectPoint = pick.id;
|
2020-06-29 11:14:44 +08:00
|
|
|
} else {
|
|
|
|
for (var i = 0; i < $this.pointArr.length; i++) {
|
|
|
|
$this.pointArr[i].show = false;
|
|
|
|
}
|
2019-11-21 15:46:14 +08:00
|
|
|
$this.state = -1;
|
2020-06-29 11:14:44 +08:00
|
|
|
$this.modifyHandler.destroy(); //激活移动点之后 单机面之外 移除这个事件
|
|
|
|
$this.modifyHandler = null;
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
if ($this.clickStep == 2) {
|
2019-11-21 15:46:14 +08:00
|
|
|
$this.clickStep = 0;
|
2020-06-29 11:14:44 +08:00
|
|
|
// var ray = $this.viewer.camera.getPickRay(evt.position);
|
|
|
|
// if (!ray) return;
|
|
|
|
// var cartesian = $this.viewer.scene.globe.pick(ray, $this.viewer.scene);
|
|
|
|
var cartesian;
|
|
|
|
cartesian = getCatesian3FromPX(evt.position, $this.viewer);
|
|
|
|
if (!cartesian) return;
|
|
|
|
if ($this.selectPoint) {
|
2019-11-21 15:46:14 +08:00
|
|
|
$this.selectPoint.position.setValue(cartesian);
|
|
|
|
$this.selectPoint = null;
|
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
|
2019-11-21 15:46:14 +08:00
|
|
|
};
|
|
|
|
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
2020-06-29 11:14:44 +08:00
|
|
|
this.modifyHandler.setInputAction(function (evt) { //单机开始绘制
|
|
|
|
// var ray = $this.viewer.camera.getPickRay(evt.endPosition);
|
|
|
|
// if (!ray) return;
|
|
|
|
// var cartesian = $this.viewer.scene.globe.pick(ray, $this.viewer.scene);
|
|
|
|
var cartesian;
|
|
|
|
cartesian = getCatesian3FromPX(evt.endPosition, $this.viewer);
|
|
|
|
if (!cartesian) return;
|
2019-11-21 15:46:14 +08:00
|
|
|
if ($this.selectPoint) {
|
|
|
|
$this.selectPoint.position.setValue(cartesian);
|
2020-06-29 11:14:44 +08:00
|
|
|
$this.positions[$this.selectPoint.wz - 1] = cartesian; //上方的wz用于此处辨识修改positions数组里的哪个元素
|
2019-11-21 15:46:14 +08:00
|
|
|
} else {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
clear: function () { //清除绘制箭头
|
2019-11-21 15:46:14 +08:00
|
|
|
this.state = 0;
|
2020-06-29 11:14:44 +08:00
|
|
|
for (var i = 0; i < this.pointArr.length; i++) {
|
|
|
|
if (this.pointArr[i]) this.viewer.entities.remove(this.pointArr[i]);
|
|
|
|
}
|
2019-11-21 15:46:14 +08:00
|
|
|
if (this.floatPoint) this.viewer.entities.remove(this.floatPoint);
|
|
|
|
if (this.arrowEntity) this.viewer.entities.remove(this.arrowEntity);
|
|
|
|
this.state = -1;
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
getLnglats: function () { //获取直角箭头中的关键点 经纬度
|
2019-11-21 15:46:14 +08:00
|
|
|
var arr = [];
|
|
|
|
for (var i = 0; i < this.positions.length; i++) {
|
|
|
|
var item = this.cartesianToLatlng(this.positions[i]);
|
|
|
|
arr.push(item);
|
|
|
|
}
|
|
|
|
return arr;
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
getPositions: function () { //获取直角箭头中的关键点 世界坐标
|
2019-11-21 15:46:14 +08:00
|
|
|
return this.positions;
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
creatPoint: function (cartesian) {
|
2019-11-21 15:46:14 +08:00
|
|
|
return this.viewer.entities.add({
|
|
|
|
position: cartesian,
|
|
|
|
billboard: {
|
|
|
|
image: this.pointImageUrl,
|
2020-06-29 11:14:44 +08:00
|
|
|
verticalOrigin: Cesium.VerticalOrigin.BOTTOM
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|
|
|
|
});
|
2020-06-29 11:14:44 +08:00
|
|
|
},
|
|
|
|
showArrowOnMap: function (positions) {
|
2019-11-21 15:46:14 +08:00
|
|
|
var $this = this;
|
2020-06-29 11:14:44 +08:00
|
|
|
var update = function () {
|
|
|
|
//计算面
|
|
|
|
if (positions.length < 3) {
|
2019-11-21 15:46:14 +08:00
|
|
|
return null;
|
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
var lnglatArr = [];
|
|
|
|
for (var i = 0; i < positions.length; i++) {
|
|
|
|
var lnglat = $this.cartesianToLatlng(positions[i]);
|
|
|
|
lnglatArr.push(lnglat)
|
|
|
|
}
|
|
|
|
var res = xp.algorithm.doubleArrow(lnglatArr);
|
|
|
|
var returnData = [];
|
|
|
|
var index = JSON.stringify(res.polygonalPoint).indexOf("null");
|
|
|
|
if (index == -1) returnData = res.polygonalPoint;
|
|
|
|
return new Cesium.PolygonHierarchy(returnData);
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|
2020-06-29 11:14:44 +08:00
|
|
|
return this.viewer.entities.add({
|
2019-11-21 15:46:14 +08:00
|
|
|
polygon: new Cesium.PolygonGraphics({
|
|
|
|
hierarchy: new Cesium.CallbackProperty(update, false),
|
|
|
|
show: true,
|
|
|
|
fill: true,
|
|
|
|
material: $this.fillMaterial
|
|
|
|
})
|
2020-06-29 11:14:44 +08:00
|
|
|
});
|
|
|
|
},
|
|
|
|
cartesianToLatlng: function (cartesian) {
|
2019-11-21 15:46:14 +08:00
|
|
|
var latlng = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
|
|
|
|
var lat = Cesium.Math.toDegrees(latlng.latitude);
|
|
|
|
var lng = Cesium.Math.toDegrees(latlng.longitude);
|
|
|
|
return [lng, lat];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-29 11:14:44 +08:00
|
|
|
function getCatesian3FromPX(px, viewer) {
|
|
|
|
var picks = viewer.scene.drillPick(px);
|
|
|
|
viewer.render();
|
|
|
|
var cartesian;
|
|
|
|
var isOn3dtiles = false;
|
|
|
|
for (var i = 0; i < picks.length; i++) {
|
|
|
|
if (picks[i] instanceof Cesium.Cesium3DTileFeature) { //模型上拾取
|
|
|
|
isOn3dtiles = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (isOn3dtiles) {
|
|
|
|
cartesian = viewer.scene.pickPosition(px);
|
|
|
|
} else {
|
|
|
|
var ray = viewer.camera.getPickRay(px);
|
|
|
|
if (!ray) return null;
|
|
|
|
cartesian = viewer.scene.globe.pick(ray, viewer.scene);
|
|
|
|
}
|
|
|
|
return cartesian;
|
2019-11-21 15:46:14 +08:00
|
|
|
}
|