/*
|
* visible line from origin to target.
|
* the visible part of line renders green, otherwise renders red.
|
*/
|
|
(function (window) {
|
'use strict';
|
|
function define_CesiumVisibleLine(){
|
//Main object
|
var CesiumVisibleLine = {};
|
var vlhandler;
|
var visibleLineEntityC = [];
|
var hiddenLineEntityC = [];
|
var originEntityC = [];
|
var targetEntityC = [];
|
var breakEntityC = [];
|
var bodyEntityC = [];
|
var visiblepolygonC = [];
|
var isFirst = true;//是否为第一个点
|
var vcisFirst = true;//是否为第一个点
|
|
CesiumVisibleLine.drawLines = function(options) {
|
var isVisible = false;
|
var originPosition;//前一个点的坐标
|
var targetPosition;//当前点坐标
|
var bodyPosition;
|
var isFirst = true;//是否为第一个点
|
|
vlhandler = vlhandler && vlhandler.destroy();
|
//前一个点与鼠标连线的entity
|
/*var dynamicLineEntity = options.viewer.entities.add({
|
id : 'dve'+new Date().getTime(),
|
polyline : {
|
width : 3,
|
material : options.drawColor,
|
show : true
|
}
|
});*/
|
|
vlhandler = new Cesium.ScreenSpaceEventHandler(options.viewer.scene.canvas);
|
vlhandler.setInputAction(function(movement){
|
if(isFirst){
|
originPosition = options.viewer.scene.pickPosition(movement.position);
|
var cartographic = Cesium.Cartographic.fromCartesian(originPosition);
|
var height = cartographic.height;//观察者高度
|
if(Number(height)<0){
|
var ray = options.viewer.camera.getPickRay(movement.position);
|
originPosition = options.viewer.scene.globe.pick(ray,options.viewer.scene);
|
}
|
cartographic = Cesium.Cartographic.fromCartesian(originPosition);
|
height = cartographic.height;
|
var lng = Cesium.Math.toDegrees(cartographic.longitude);
|
var lat = Cesium.Math.toDegrees(cartographic.latitude);
|
bodyPosition = Cesium.Cartesian3.fromDegrees(lng, lat, height+options.bodyHeight);
|
var originEntity = options.viewer.entities.add({
|
id: 'originEntity'+new Date().getTime(),
|
position : bodyPosition,
|
point : {
|
color : options.originColor,
|
pixelSize : 10,
|
}
|
});
|
var bodyEntity = options.viewer.entities.add({
|
id: 'bodyEntity'+new Date().getTime(),
|
polyline : {
|
width : 3,
|
material : options.bodyColor,
|
show : true
|
}
|
});
|
bodyEntity.polyline.positions = [originPosition,bodyPosition];
|
|
isFirst = false;
|
bodyEntityC.push(bodyEntity);
|
originEntityC.push(originEntity);
|
}else{
|
//dynamicLineEntity.show = false;
|
targetPosition = options.viewer.scene.pickPosition(movement.position);
|
var cartographic = Cesium.Cartographic.fromCartesian(targetPosition);
|
var height = cartographic.height;//观察者高度
|
if(Number(height)<0){
|
var ray = options.viewer.camera.getPickRay(movement.position);
|
targetPosition = options.viewer.scene.globe.pick(ray,options.viewer.scene);
|
}
|
var targetEntity = options.viewer.entities.add({
|
id: 'targetEntity'+new Date().getTime(),
|
position : targetPosition,
|
point : {
|
color : options.targetColor,
|
pixelSize : 10,
|
}
|
});
|
targetEntityC.push(targetEntity);
|
|
var breakpoint = computeVisible(bodyPosition,targetPosition,movement.position,options.viewer.scene,options.viewer);
|
|
var visibleLineEntity = options.viewer.entities.add({
|
id : 'visibleLineEntity'+new Date().getTime(),
|
polyline : {
|
width : 3,
|
material : options.visibleColor,
|
show : true
|
}
|
});
|
|
if(breakpoint){
|
var hiddenLineEntity = options.viewer.entities.add({
|
id : 'hiddenLineEntity'+new Date().getTime(),
|
polyline : {
|
width : 3,
|
material : options.hiddenColor,
|
show : true
|
}
|
});
|
visibleLineEntity.polyline.positions = [bodyPosition,breakpoint];
|
hiddenLineEntity.polyline.positions = [breakpoint,targetPosition];
|
visibleLineEntityC.push(visibleLineEntity);
|
hiddenLineEntityC.push(hiddenLineEntity);
|
var breakEntity = options.viewer.entities.add({
|
id: 'breakEntity'+new Date().getTime(),
|
position : breakpoint,
|
point : {
|
color : options.breakColor,
|
pixelSize : 10,
|
}
|
});
|
breakEntityC.push(breakEntity);
|
isVisible = false;
|
}else{
|
visibleLineEntity.polyline.positions = [bodyPosition,targetPosition];
|
visibleLineEntityC.push(visibleLineEntity);
|
isVisible = true;
|
}
|
//dynamicLineEntity.show = true;
|
}
|
},Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
/*vlhandler.setInputAction(function(movement){
|
if(!isFirst){
|
//获取当前点的坐标
|
targetPosition = options.viewer.scene.pickPosition(movement.endPosition);
|
if(targetPosition){
|
dynamicLineEntity.polyline.positions = [originPosition,targetPosition];
|
}
|
}
|
},Cesium.ScreenSpaceEventType.MOUSE_MOVE);*/
|
vlhandler.setInputAction(function(){
|
//move事件监听
|
vlhandler = vlhandler && vlhandler.destroy();
|
isFirst = true;
|
},Cesium.ScreenSpaceEventType.RIGHT_CLICK);
|
|
return isVisible;
|
};
|
|
function computeVisible(origin,target,movementpoi,scene,computeviewer){
|
for (var i = 1; i < 101; i++) {
|
var lon = Cesium.Math.lerp(origin.x, target.x, 0.01*i);
|
var lat = Cesium.Math.lerp(origin.y, target.y, 0.01*i);
|
var height = origin.z-(origin.z-target.z)*0.01*i;
|
var position = new Cesium.Cartesian3(lon, lat, height);
|
var clampPoi = scene.clampToHeight(position);
|
if(clampPoi!=undefined){
|
var cartographic = Cesium.Cartographic.fromCartesian(clampPoi);
|
var heightclamp = cartographic.height;
|
if(heightclamp<0){
|
var ray = computeviewer.camera.getPickRay(movementpoi);
|
clampPoi = computeviewer.scene.globe.pick(ray,scene);
|
}
|
}else{
|
var ray = computeviewer.camera.getPickRay(movementpoi);
|
clampPoi = computeviewer.scene.globe.pick(ray,scene);
|
}
|
if(clampPoi.z>=height){
|
return position;
|
}
|
}
|
}
|
|
CesiumVisibleLine.removeLines = function(viewer){
|
isFirst = true;
|
vcisFirst = true;
|
vlhandler = vlhandler && vlhandler.destroy();
|
for ( var i = 0; i < visibleLineEntityC.length; i++) {
|
viewer.entities.remove(visibleLineEntityC[i]);
|
}
|
for ( var j = 0; j < hiddenLineEntityC.length; j++) {
|
viewer.entities.remove(hiddenLineEntityC[j]);
|
}
|
for ( var m = 0; m < originEntityC.length; m++) {
|
viewer.entities.remove(originEntityC[m]);
|
}
|
for ( var n = 0; n < targetEntityC.length; n++) {
|
viewer.entities.remove(targetEntityC[n]);
|
}
|
for ( var o = 0; o < breakEntityC.length; o++) {
|
viewer.entities.remove(breakEntityC[o]);
|
}
|
for ( var p = 0; p < bodyEntityC.length; p++) {
|
viewer.entities.remove(bodyEntityC[p]);
|
}
|
for ( var q = 0; q < visiblepolygonC.length; q++) {
|
viewer.entities.remove(visiblepolygonC[q]);
|
}
|
};
|
|
CesiumVisibleLine.drawCircles = function(options){
|
var originPosition;//前一个点的坐标
|
var targetPosition;//当前点坐标
|
var bodyPosition;
|
var lng;
|
var lat;
|
var breakpointC=[];
|
var vcisFirst = true;//是否为第一个点
|
|
vlhandler = vlhandler && vlhandler.destroy();
|
vlhandler = new Cesium.ScreenSpaceEventHandler(options.viewer.scene.canvas);
|
vlhandler.setInputAction(function(movement){
|
if(vcisFirst){
|
originPosition = options.viewer.scene.pickPosition(movement.position);
|
var cartographic = Cesium.Cartographic.fromCartesian(originPosition);
|
var height = cartographic.height;//观察者高度
|
if(Number(height)<0){
|
var ray = options.viewer.camera.getPickRay(movement.position);
|
originPosition = options.viewer.scene.globe.pick(ray,options.viewer.scene);
|
}
|
cartographic = Cesium.Cartographic.fromCartesian(originPosition);
|
lng = Cesium.Math.toDegrees(cartographic.longitude);
|
lat = Cesium.Math.toDegrees(cartographic.latitude);
|
height = cartographic.height;//观察者高度
|
bodyPosition = Cesium.Cartesian3.fromDegrees(lng, lat, height+options.bodyHeight);
|
var originEntity = options.viewer.entities.add({
|
id: 'originEntity'+new Date().getTime(),
|
position : bodyPosition,
|
point : {
|
color : options.originColor,
|
pixelSize : 10,
|
}
|
});
|
var bodyEntity = options.viewer.entities.add({
|
id: 'bodyEntity'+new Date().getTime(),
|
polyline : {
|
width : 3,
|
material : options.bodyColor,
|
show : true
|
}
|
});
|
bodyEntity.polyline.positions = [originPosition,bodyPosition];
|
|
vcisFirst = false;
|
bodyEntityC.push(bodyEntity);
|
originEntityC.push(originEntity);
|
}else{
|
//document.getElementById("loading").style.display = "block";
|
targetPosition = options.viewer.scene.pickPosition(movement.position);
|
var origincartographic = Cesium.Cartographic.fromCartesian(originPosition);
|
var targetcartographic = Cesium.Cartographic.fromCartesian(targetPosition);
|
var height = targetcartographic.height;
|
if(Number(height)<0){
|
var ray = options.viewer.camera.getPickRay(movement.position);
|
targetPosition = options.viewer.scene.globe.pick(ray,options.viewer.scene);
|
}
|
targetcartographic = Cesium.Cartographic.fromCartesian(targetPosition);
|
var geodesic = new Cesium.EllipsoidGeodesic();
|
geodesic.setEndPoints(origincartographic, targetcartographic);
|
var radius = geodesic.surfaceDistance;
|
var targetEntity = options.viewer.entities.add({
|
id: 'targetEntity'+new Date().getTime(),
|
position : originPosition,
|
ellipse : {
|
semiMinorAxis : radius,
|
semiMajorAxis : radius,
|
height : targetcartographic.height,
|
fill : false,
|
outline : true,
|
outlineColor : options.targetColor,
|
outlineWidth : 1.5
|
}
|
});
|
targetEntityC.push(targetEntity);
|
|
var ddegree = radius/6378137;
|
var lngr = lng*Math.PI/180;
|
var latr = lat*Math.PI/180;
|
for (var i = 0; i < 360; i=i+10) {
|
/*var x = originPosition.x + radius*Math.sin(i*2*Math.PI/360);
|
var y = originPosition.y + radius*Math.cos(i*2*Math.PI/360);
|
var pointonCircle = Cesium.Cartesian3.fromElements(x,y,targetPosition.z);*/
|
var ir = i*Math.PI/180;
|
var y = Math.asin(Math.sin(latr)*Math.cos(ddegree)+Math.cos(latr)*Math.sin(ddegree)*Math.cos(ir));
|
var x = lngr + Math.atan2(Math.sin(ir)*Math.sin(ddegree)*Math.cos(latr),
|
Math.cos(ddegree)-Math.sin(latr)*Math.sin(y));
|
var lononCircle = x*180/Math.PI;
|
var latonCircle = y*180/Math.PI;
|
var pointonCircle = Cesium.Cartesian3.fromDegrees(lononCircle,latonCircle,targetcartographic.height);
|
var breakpoint = computeVisible(bodyPosition,pointonCircle,movement.position,options.viewer.scene,options.viewer);
|
|
var visibleLineEntity = options.viewer.entities.add({
|
id : 'visibleLineEntity'+new Date().getTime(),
|
polyline : {
|
width : 3,
|
material : options.visibleColor,
|
show : true
|
}
|
});
|
|
if(breakpoint){
|
var hiddenLineEntity = options.viewer.entities.add({
|
id : 'hiddenLineEntity'+new Date().getTime(),
|
polyline : {
|
width : 3,
|
material : options.hiddenColor,
|
show : true
|
}
|
});
|
visibleLineEntity.polyline.positions = [bodyPosition,breakpoint];
|
hiddenLineEntity.polyline.positions = [breakpoint,pointonCircle];
|
visibleLineEntityC.push(visibleLineEntity);
|
hiddenLineEntityC.push(hiddenLineEntity);
|
var breakEntity = options.viewer.entities.add({
|
id: 'breakEntity'+new Date().getTime(),
|
position : breakpoint,
|
point : {
|
color : options.breakColor,
|
pixelSize : 10,
|
}
|
});
|
breakEntityC.push(breakEntity);
|
breakpointC.push(breakpoint);
|
}else{
|
visibleLineEntity.polyline.positions = [bodyPosition,pointonCircle];
|
visibleLineEntityC.push(visibleLineEntity);
|
breakpointC.push(pointonCircle);
|
}
|
}
|
var visiblepolygon = options.viewer.entities.add({
|
id: 'visiblepolygon'+new Date().getTime(),
|
polygon: {
|
hierarchy : breakpointC,
|
material : options.visiblePolygonColor,
|
}
|
});
|
visiblepolygonC.push(visiblepolygon);
|
//document.getElementById("loading").style.display = "none";
|
//取消同一起始点多次分析时使用如下代码:
|
//vlhandler = vlhandler && vlhandler.destroy();
|
//vcisFirst = true;
|
}
|
},Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
vlhandler.setInputAction(function(){
|
//move事件监听
|
vlhandler = vlhandler && vlhandler.destroy();
|
vcisFirst = true;
|
},Cesium.ScreenSpaceEventType.RIGHT_CLICK);
|
};
|
|
return CesiumVisibleLine;
|
}
|
|
if (typeof(CesiumVisibleLine) === 'undefined') {
|
window.CesiumVisibleLine = define_CesiumVisibleLine();
|
} else {
|
console.log("CesiumVisibleLine already defined.");
|
}
|
})(window);
|