0.注意事项
##
1.严禁使用:viewer.entities.removeAll()
2.严禁使用:viewer.scene.primitives.removeAll()
##
1.裁剪
let provider = new Cesium.UrlTemplateImageryProvider({
url: url,
tilingScheme: new Cesium.GeographicTilingScheme({
numberOfLevelZeroTilesX: 2,
numberOfLevelZeroTilesY: 1
}),
minimumLevel: 1,
customTags: {
c: function(imageryProvider, x, y, level) {
return level + 1;
}
}
});
let layerIndex = Layer.calcLayerIndexByGroup(viewer2,LayerGroup.partimg)
let { west, south, east, north } = this.Rxt.rectRight;
let layer = new Cesium.ImageryLayer(provider, {
rectangle: Cesium.Rectangle.fromDegrees(west, south, east, north)
});
viewer2.imageryLayers.add(layer,layerIndex);
2.绘制点线面
3.添加实体(点、线、面)
//画点
const drawPoint = (point, viewer) => {
let entity = viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(point.lon, point.lat),
label: {
text: '',
font: '22px Helvetica'
},
point: {
pixelSize: 10,
color: Cesium.Color.CHARTREUSE
}
});
entity.catalog = 'measure'
};
/**
* 画线
*/
const drawLine = (point1, point2, showDistance, viewer) => {
let entity = viewer.entities.add({
polyline: {
positions: [Cesium.Cartesian3.fromDegrees(point1.lon, point1.lat), Cesium.Cartesian3.fromDegrees(point2.lon, point2.lat)],
width: 10.0,
material: new Cesium.PolylineGlowMaterialProperty({
color: Cesium.Color.CHARTREUSE.withAlpha(.5)
})
}
});
entity.catalog = 'measure'
if (showDistance) {
let w = Math.abs(point1.lon - point2.lon);
let h = Math.abs(point1.lat - point2.lat);
let offsetV = w >= h ? 0.0005 : 0;
let offsetH = w < h ? 0.001 : 0;
let distance = EarthTool.measureLength(point1.lat, point1.lon, point2.lat, point2.lon);
entity = viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(((point1.lon + point2.lon) / 2) + offsetH, ((point1.lat + point2.lat) / 2) + offsetV),
label: {
text: distance.toFixed(1) + 'm',
font: '22px Helvetica',
fillColor: Cesium.Color.WHITE
}
});
entity.catalog = 'measure'
}
};
/**
* 画多边形
*/
const drawPoly = (points, viewer) => {
let pArray = [];
for (let i = 0; i < points.length; i++) {
pArray.push(points[i].lon);
pArray.push(points[i].lat);
}
let entity = viewer.entities.add({
polygon: {
hierarchy: new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArray(pArray)),
material: Cesium.Color.CHARTREUSE.withAlpha(.5)
}
});
entity.catalog = 'measure'
};
4.绘制WKT/Geojson
5.接天地图
6.图片生成与合并
//生成图片
makeImg(blob) {
let canvas = document.createElement('canvas');
canvas.width = 256;
canvas.height = 256;
let context = canvas.getContext('2d');
context.rect(0, 0, canvas.width, canvas.height);
context.fillStyle = '#fff';
context.fill();
let myImage = new Image();
myImage.src = window.URL.createObjectURL(blob); //背景图片 你自己本地的图片或者在线图片
myImage.crossOrigin = 'Anonymous';
myImage.onload = function() {
context.drawImage(myImage, 0, 0, 256, 256);
let base64 = canvas.toDataURL('image/png'); //"image/png" 这里注意一下
return base64
};
},
/**
* 图片合并
*/
mergeImg(blob1, blob2) {
let canvas = document.createElement('canvas');
canvas.width = 256;
canvas.height = 256;
let context = canvas.getContext('2d');
context.rect(0, 0, canvas.width, canvas.height);
context.fillStyle = '#fff';
context.fill();
let myImage = new Image();
myImage.src = window.URL.createObjectURL(blob1); //背景图片 你自己本地的图片或者在线图片
myImage.crossOrigin = 'Anonymous';
myImage.onload = function() {
context.drawImage(myImage, 0, 0, 256, 256);
let myImage2 = new Image();
myImage2.src = window.URL.createObjectURL(blob2); //你自己本地的图片或者在线图片
myImage2.crossOrigin = 'Anonymous';
myImage2.onload = function() {
context.drawImage(myImage2, 0, 0, 256, 256);
let base64 = canvas.toDataURL('image/png'); //"image/png" 这里注意一下
return base64
};
};
},
7.判断图片是否全透明
/**
* 判断图片是否全透明
* @return true:全透明 false:有内容图片
*/
checkTranspanent(blob) {
let myImage = new Image();
myImage.src = window.URL.createObjectURL(blob);
myImage.crossOrigin = 'Anonymous';
let canvas = document.createElement('canvas');
canvas.width = 256;
canvas.height = 256;
myImage.onload = () => {
let context = canvas.getContext('2d');
context.drawImage(myImage, 0, 0, 256, 256);
let imageData = context.getImageData(0, 0, 256, 256);
let arr = imageData.data;
let has = arr.find(o => o !== 0);
return has
};
},
8.模式切换
//模式切换
this.$bus.$on(EventType.Map.swmodal, (val) => {
Earth.swMapModal(viewer, val);
});
/**
* 2/3维度切换
* @param modal
*/
const swMapModal = (viewer, modal, duration = 0) => {
let scene = viewer.scene;
if (modal == MapMode.CESIUM2D) {
scene.morphTo2D(duration)
} else if (modal == MapMode.CESIUM3D) {
scene.morphTo3D(duration);
} else if (modal == MapMode.CESIUM25D) {
scene.morphToColumbusView(duration);
}
};
//调用
this.$bus.$emit(EventType.Map.swmodal, MapMode.CESIUM2D);
this.$bus.$emit(EventType.Map.swmodal, MapMode.CESIUM3D);
9.定位
9.1.矩形框定位
let rectangle = viewer.camera.computeViewRectangle();
let west =rectangle.west / Math.PI * 180;
let north = rectangle.north / Math.PI * 180;
let east = rectangle.east / Math.PI * 180;
let south = rectangle.south / Math.PI * 180;
viewer.camera.setView({
destination : Cesium.Rectangle.fromDegrees(west, south, east, north)
});
9.2.点坐标定位
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(lon,lat,height),
orientation: {
heading: heading,
pitch: pitch,
roll: roll
}
})
10.添加网格
//添加网格
let imageryLayers = viewer.imageryLayers;
let debugGrid = imageryLayers.addImageryProvider(new Cesium.TileCoordinatesImageryProvider({
tilingScheme: new Cesium.WebMercatorTilingScheme({
numberOfLevelZeroTilesX: 1,
numberOfLevelZeroTilesY: 1
}),
tileWidth: 512,
tileHeight: 512
}));
//网格点击事件
debugGrid.imageryProvider.clickEvent.addEventListener((e) => {
console.log(e);
let { x, y, z, rectangle } = e;
//网格编号
let wgbh = `L${z}X${x}Y${y}`;
});
11.生成与叠加blob
//url是地图瓦片的url,在浏览器访问可以直接看到瓦片,通过get、post请求,并设置{ responseType: 'arraybuffer' },便可以得到结果,再通过new Blob得到blob对象。
get(url, {}, { responseType: 'arraybuffer' }).then(re => {
let blob = new Blob([re], { type: 'png' });
let imageUrl = window.URL.createObjectURL(blob);
let lyr = viewer.imageryLayers.addImageryProvider(new Cesium.SingleTileImageryProvider({
url: imageUrl,
rectangle: rectangle
}));
}
12.场景初始化配置
let viewer = new Cesium.Viewer(containerId, {
shouldAnimate: true,
animation: false,
infoBox: false,
selectionIndicator: false,
geocoder: false,
fullscreenButton: false,
timeline: true,
sceneModePicker: false,
navigationHelpButton: false,
baseLayerPicker: false,
homeButton: false,
sceneMode: sceneMode,
// mapProjection: new Cesium.WebMercatorProjection(),
// skyBox: skyBox,
imageryProvider: defaultImgProvider(),
terrainProvider: defaultTerrainProvider(),
orderIndependentTranslucency: false,
contextOptions: {
webgl: {
alpha: true,
preserveDrawingBuffer:true
}
}
});
/**
* 默认的底图服务
*/
const defaultImgProvider = () => {
let url = './assets/images/world.jpg';
let provider = new Cesium.SingleTileImageryProvider({
url: url,
});
return provider;
};
/**
* 默认的地形服务
* @returns {null}
*/
const defaultTerrainProvider = () => {
// return new Cesium.ArcGISTiledElevationTerrainProvider({
// url:"https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer",
// });
if (window.CONFIG.MapTerrainUrl && window.CONFIG.MapTerrainUrl != "") {
return new Cesium.CesiumTerrainProvider({
url: window.CONFIG.MapTerrainUrl
});
} else {
// let foo = new Cesium.GeowayTiledElevationTerrainProvider({
// connections: [{
// priority: 0,
// url: '/terrain/6e75eeb0932f11eaa492979005873f41/layer.json',
// rectangle: new Cesium.Rectangle.fromDegrees(-180, -90, 180, 90),
// minLevel: 4,
// maxLevel: 15,
// tileMatrixLabels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19'],
// }]
// })
// return foo;
}
return undefined;
};
13.场景默认设置项
/**
* 默认设置
* @param viewer
*/
const defaultSetting = (viewer) => {
//隐藏版权 fullscreenButton: false,//是否显示全屏按钮
let scene = viewer.scene;
let globe = scene.globe;
//背景透明
viewer._cesiumWidget._creditContainer.style.display = "none";
// scene.skyBox.show = false;
// scene.backgroundColor = new Cesium.Color(0.0, 0.0, 0.0, 0.0);
scene.fog.enabled = false;
globe.showGroundAtmosphere = false; //大气层
globe.enableLighting = false; //昼夜
viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK); //移除实体追踪
viewer.scene.screenSpaceCameraController.maximumZoomDistance = 1000000000; //控制最大高度
// viewer.scene.screenSpaceCameraController.minimumZoomDistance = 250000;//相机的高度的最小值
// viewer.scene.screenSpaceCameraController._minimumZoomRate = 30000; // 设置相机缩小时的速率
// viewer.scene.screenSpaceCameraController._maximumZoomRate=5906376272000 //设置相机放大时的速率
// viewer.scene.fxaa = true;
// viewer.scene.postProcessStages.fxaa.enabled = true;
}
14.获取当前中心点坐标
//获取中心点坐标(笛卡尔)
let polyCenter = Cesium.BoundingSphere.fromPoints(cartesian).center;
// polyCenter = Cesium.Ellipsoid.WGS84.scaleToGeodeticSurface(polyCenter);
15.事件
1.缩放事件
//缩放开始
viewer.camera.moveStart.addEventListener((e) => {});
//缩放结束
viewer.camera.moveEnd.addEventListener((e) => {});
//鼠标左键单击
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (movement) {
let ray=viewer.camera.getPickRay(movement.position);
let cartesian = viewer.scene.globe.pick(ray, viewer.scene);
positions.push(cartesian);
viewer.entities.add({
position: cartesian,
point: {
color: Cesium.Color.RED,
pixelSize: 5,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
}
});
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
//鼠标右键单击
handler.setInputAction(function (movement) {
handler.destroy();
callback(positions);
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
16.坐标转换
//经纬度转笛卡尔
笛卡尔 = viewer.scene.pickPosition({ x: 经度, y: 纬度 })
//笛卡尔转经纬度
经纬度 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, 笛卡尔)
//弧度转角度
west = Cesium.Math.toDegrees(west);
south = Cesium.Math.toDegrees(south);
east = Cesium.Math.toDegrees(east);
north = Cesium.Math.toDegrees(north);
//获取矩形中心点笛卡尔坐标
let result =null;
result = Cesium.Rectangle.center (rectangle, result);//弧度
let cartesian = ellipsoid.cartographicToCartesian(result);//得到笛卡尔坐标
//获取Cesium事件的点击所在位置的坐标
//Cesium.ScreenSpaceEventType.MOUSE_MOVE 对应的是 movement.endPosition
//Cesium.ScreenSpaceEventType.LEFT_CLICK 对应的是 movement.position
getPointFromWindowPoint(point){
if(this.viewer.scene.terrainProvider.constructor.name=="EllipsoidTerrainProvider") {
return this.viewer.camera.pickEllipsoid(point,this.viewer.scene.globe.ellipsoid);
} else {
let ray=this.viewer.scene.camera.getPickRay(point);
return this.viewer.scene.globe.pick(ray,this.viewer.scene);
}
},
//屏幕像素转笛卡尔
let _cartographic = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(375,137), viewer.scene.globe.ellipsoid);
//笛卡尔坐标系转WGS84坐标系
Cartesian3_to_WGS84: function (point) {
let cartesian33 = new Cesium.Cartesian3(point.x, point.y, point.z);
let cartographic = Cesium.Cartographic.fromCartesian(cartesian33);
let lat = Cesium.Math.toDegrees(cartographic.latitude);
let lng = Cesium.Math.toDegrees(cartographic.longitude);
let alt = cartographic.height;
return {lat: lat, lng: lng, alt: alt};
},
let wgs84_point = this.Cartesian3_to_WGS84({
x: x,
y: y,
z: z
});
//WGS84坐标系转笛卡尔坐标系
WGS84_to_Cartesian3: function (point) {
let car33 = Cesium.Cartesian3.fromDegrees(point.lng, point.lat, point.alt);
let x = car33.x;
let y = car33.y;
let z = car33.z;
return {x: x, y: y, z: z};
},
//cesium鼠标点击获取点坐标的几种方式
handler.setInputAction(function (event) {
//1.椭球面坐标:获取当前点击视线与椭球面相交处的坐标,在加载地形的场景上获取的坐标有误差
//var earthPosition = viewer.camera.pickEllipsoid(event.position,viewer.scene.globe.ellipsoid);
//2.场景坐标:获取场景中任意点击处的对应的世界坐标,需要开启“地形深度检测”(在未开启“地形深度检测”的情况下只能在3DTile上准确获取空间坐标,开启“地形深度检测”后,viewer.scene.pickPosition 也能在非3DTile上准确获取坐标)
viewer.scene.globe.depthTestAgainstTerrain = true;
var earthPosition = viewer.scene.pickPosition(event.position);
//3.地标坐标:获取点击处地球表面的世界坐标,不包括模型、倾斜摄影表面
// var ray = viewer.camera.getPickRay(event.position);
// var earthPosition = viewer.scene.globe.pick(ray, viewer.scene);
if (Cesium.defined(earthPosition)) {
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
17.计算距离
//计算两点间距离
getFlatternDistance(lat1, lng1, lat2, lng2) {
let EARTH_RADIUS = 6378137.0; //单位M
let PI = Math.PI;
function getRad(d) {
return d * PI / 180.0;
}
let f = getRad((lat1 + lat2) / 2);
let g = getRad((lat1 - lat2) / 2);
let l = getRad((lng1 - lng2) / 2);
let sg = Math.sin(g);
let sl = Math.sin(l);
let sf = Math.sin(f);
let s, c, w, r, d, h1, h2;
let a = EARTH_RADIUS;
let fl = 1 / 298.257;
sg = sg * sg;
sl = sl * sl;
sf = sf * sf;
s = sg * (1 - sl) + (1 - sf) * sl;
c = (1 - sg) * (1 - sl) + sf * sl;
w = Math.atan(Math.sqrt(s / c));
r = Math.sqrt(s * c) / w;
d = 2 * w * a;
h1 = (3 * r - 1) / 2 / c;
h2 = (3 * r + 1) / 2 / s;
return d * (1 + fl * (h1 * sf * (1 - sg) - h2 * (1 - sf) * sg));
},
18.叠加服务
18.1.天地图
1)全球矢量地图服务
var viewer = new Cesium.Viewer("cesiumContainer", {
animation: false, //是否显示动画控件
baseLayerPicker: false, //是否显示图层选择控件
geocoder: true, //是否显示地名查找控件
timeline: false, //是否显示时间线控件
sceneModePicker: true, //是否显示投影方式控件
navigationHelpButton: false, //是否显示帮助信息控件
infoBox: true, //是否显示点击要素之后显示的信息
});
viewer.imageryLayers.addImageryProvider(new Cesium.WebMapTileServiceImageryProvider({
url: "http://t0.tianditu.com/vec_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=vec&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles",
layer: "tdtVecBasicLayer",
style: "default",
format: "image/jpeg",
tileMatrixSetID: "GoogleMapsCompatible",
show: false
}))
2)全球影像地图服务
var viewer = new Cesium.Viewer("cesiumContainer", {
animation: false, //是否显示动画控件
baseLayerPicker: false, //是否显示图层选择控件
geocoder: true, //是否显示地名查找控件
timeline: false, //是否显示时间线控件
sceneModePicker: true, //是否显示投影方式控件
navigationHelpButton: false, //是否显示帮助信息控件
infoBox: true, //是否显示点击要素之后显示的信息
});
viewer.imageryLayers.addImageryProvider(new Cesium.WebMapTileServiceImageryProvider({
url: "http://t0.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles",
layer: "tdtBasicLayer",
style: "default",
format: "image/jpeg",
tileMatrixSetID: "GoogleMapsCompatible",
show: false
}))
3)全球影像中文注记服务
19.通用大头针
var pinBuilder = new Cesium.PinBuilder();
//颜色图标
var bluePin = viewer.entities.add({
name: "Blank blue pin",
position: Cesium.Cartesian3.fromDegrees(-75.170726, 39.9208667),
billboard: {
image: pinBuilder.fromColor(Cesium.Color.ROYALBLUE, 48).toDataURL(),
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
},
});
//数字图标
var questionPin = viewer.entities.add({
name: "Question mark",
position: Cesium.Cartesian3.fromDegrees(-75.1698529, 39.9220071),
billboard: {
image: pinBuilder.fromText("16", Cesium.Color.BLACK, 48).toDataURL(),
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
},
});
//图片图标
var url = Cesium.buildModuleUrl("Assets/Textures/maki/grocery.png");
var groceryPin = Cesium.when(
pinBuilder.fromUrl(url, Cesium.Color.GREEN, 48),
function (canvas) {
return viewer.entities.add({
name: "Grocery store",
position: Cesium.Cartesian3.fromDegrees(-75.1705217, 39.921786),
billboard: {
image: canvas.toDataURL(),
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
},
});
}
);
//医院图标
var hospitalPin = Cesium.when(
pinBuilder.fromMakiIconId("hospital", Cesium.Color.RED, 48),
function (canvas) {
return viewer.entities.add({
name: "Hospital",
position: Cesium.Cartesian3.fromDegrees(-75.1698606, 39.9211275),
billboard: {
image: canvas.toDataURL(),
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
},
});
}
);
//等待所有实体添加完毕
Cesium.when.all(
[bluePin, questionPin, groceryPin, hospitalPin],
function (pins) {
viewer.zoomTo(pins);
}
);
20.椭球体(ellipsoid)
var viewer = new Cesium.Viewer("cesiumContainer");
var saturnPosition = Cesium.Cartesian3.fromDegrees(
-95.0,
45.0,
300000.0
);
viewer.entities.add({
name: "土星",
position: saturnPosition,
ellipsoid: {
radii: new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
material: new Cesium.Color(0.95, 0.82, 0.49),
},
});
viewer.entities.add({
name: "土星内环",
position: saturnPosition,
orientation: Cesium.Transforms.headingPitchRollQuaternion(
saturnPosition,
new Cesium.HeadingPitchRoll(
Cesium.Math.toRadians(30.0),
Cesium.Math.toRadians(30.0),
0.0
)
),
ellipsoid: {
radii: new Cesium.Cartesian3(400000.0, 400000.0, 400000.0),
innerRadii: new Cesium.Cartesian3(300000.0, 300000.0, 300000.0),
minimumCone: Cesium.Math.toRadians(89.8),
maximumCone: Cesium.Math.toRadians(90.2),
material: new Cesium.Color(0.95, 0.82, 0.49, 0.5),
},
});
viewer.entities.add({
name: "土星的外环",
position: saturnPosition,
orientation: Cesium.Transforms.headingPitchRollQuaternion(
saturnPosition,
new Cesium.HeadingPitchRoll(
Cesium.Math.toRadians(30.0),
Cesium.Math.toRadians(30.0),
0.0
)
),
ellipsoid: {
radii: new Cesium.Cartesian3(460000.0, 460000.0, 460000.0),
innerRadii: new Cesium.Cartesian3(415000.0, 415000.0, 415000.0),
minimumCone: Cesium.Math.toRadians(89.8),
maximumCone: Cesium.Math.toRadians(90.2),
material: new Cesium.Color(0.95, 0.82, 0.49, 0.5),
},
});
viewer.entities.add({
name: "穹顶",
position: Cesium.Cartesian3.fromDegrees(-120.0, 40.0),
ellipsoid: {
radii: new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
maximumCone: Cesium.Math.PI_OVER_TWO,
material: Cesium.Color.BLUE.withAlpha(0.3),
outline: true,
},
});
viewer.entities.add({
name: "内半径圆顶",
position: Cesium.Cartesian3.fromDegrees(-114.0, 40.0),
ellipsoid: {
radii: new Cesium.Cartesian3(250000.0, 200000.0, 150000.0),
innerRadii: new Cesium.Cartesian3(100000.0, 80000.0, 60000.0),
maximumCone: Cesium.Math.PI_OVER_TWO,
material: Cesium.Color.RED.withAlpha(0.3),
outline: true,
},
});
viewer.entities.add({
name: "顶部开孔圆顶",
position: Cesium.Cartesian3.fromDegrees(-108.0, 40.0),
ellipsoid: {
radii: new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
innerRadii: new Cesium.Cartesian3(100000.0, 100000.0, 100000.0),
minimumCone: Cesium.Math.toRadians(20.0),
maximumCone: Cesium.Math.PI_OVER_TWO,
material: Cesium.Color.YELLOW.withAlpha(0.3),
outline: true,
},
});
viewer.entities.add({
name: "顶部和底部切口",
position: Cesium.Cartesian3.fromDegrees(-102.0, 40.0, 140000.0),
ellipsoid: {
radii: new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
innerRadii: new Cesium.Cartesian3(100000.0, 100000.0, 100000.0),
minimumCone: Cesium.Math.toRadians(60.0),
maximumCone: Cesium.Math.toRadians(140.0),
material: Cesium.Color.DARKCYAN.withAlpha(0.3),
outline: true,
},
});
viewer.entities.add({
name: "碗",
position: Cesium.Cartesian3.fromDegrees(-96.0, 39.5, 200000.0),
ellipsoid: {
radii: new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
innerRadii: new Cesium.Cartesian3(180000.0, 180000.0, 180000.0),
minimumCone: Cesium.Math.toRadians(110.0),
material: Cesium.Color.GREEN.withAlpha(0.3),
outline: true,
},
});
viewer.entities.add({
name: "时钟断流器",
position: Cesium.Cartesian3.fromDegrees(-90.0, 39.0),
ellipsoid: {
radii: new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
innerRadii: new Cesium.Cartesian3(150000.0, 150000.0, 150000.0),
minimumClock: Cesium.Math.toRadians(-90.0),
maximumClock: Cesium.Math.toRadians(180.0),
minimumCone: Cesium.Math.toRadians(20.0),
maximumCone: Cesium.Math.toRadians(70.0),
material: Cesium.Color.BLUE.withAlpha(0.3),
outline: true,
},
});
viewer.entities.add({
name: "部分穹顶",
position: Cesium.Cartesian3.fromDegrees(-84.0, 38.5),
ellipsoid: {
radii: new Cesium.Cartesian3(200000.0, 200000.0, 200000.0),
minimumClock: Cesium.Math.toRadians(-90.0),
maximumClock: Cesium.Math.toRadians(180.0),
maximumCone: Cesium.Math.toRadians(90.0),
material: Cesium.Color.RED.withAlpha(0.3),
outline: true,
},
});
viewer.entities.add({
name: "三角体",
position: Cesium.Cartesian3.fromDegrees(-102.0, 35.0, 20000.0),
orientation: Cesium.Transforms.headingPitchRollQuaternion(
Cesium.Cartesian3.fromDegrees(-102.0, 35.0, 20000.0),
new Cesium.HeadingPitchRoll(Cesium.Math.PI / 1.5, 0, 0.0)
),
ellipsoid: {
radii: new Cesium.Cartesian3(500000.0, 500000.0, 500000.0),
innerRadii: new Cesium.Cartesian3(10000.0, 10000.0, 10000.0),
minimumClock: Cesium.Math.toRadians(-15.0),
maximumClock: Cesium.Math.toRadians(15.0),
minimumCone: Cesium.Math.toRadians(75.0),
maximumCone: Cesium.Math.toRadians(105.0),
material: Cesium.Color.DARKCYAN.withAlpha(0.3),
outline: true,
},
});
viewer.entities.add({
name: "偏椭球",
position: Cesium.Cartesian3.fromDegrees(-95.0, 34.0),
ellipsoid: {
radii: new Cesium.Cartesian3(300000.0, 300000.0, 300000.0),
innerRadii: new Cesium.Cartesian3(70000.0, 70000.0, 70000.0),
minimumClock: Cesium.Math.toRadians(180.0),
maximumClock: Cesium.Math.toRadians(400.0),
maximumCone: Cesium.Math.toRadians(90.0),
material: Cesium.Color.DARKCYAN.withAlpha(0.3),
outline: true,
},
});
viewer.zoomTo(viewer.entities);
21.识别实体(pick entity)
var entity = viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
billboard: {
image: "../images/Cesium_Logo_overlay.png",
},
});
// 鼠标移入改变billboard的scale和color
handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
handler.setInputAction(function (movement) {
let pickedObject = viewer.scene.pick(movement.endPosition);
if (Cesium.defined(pickedObject) && pickedObject.id === entity) {
entity.billboard.scale = 2.0;
entity.billboard.color = Cesium.Color.YELLOW;
} else {
entity.billboard.scale = 1.0;
entity.billboard.color = Cesium.Color.WHITE;
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
22.钻取实体(drill-down entity)
var pickedEntities = new Cesium.EntityCollection();
var pickColor = Cesium.Color.YELLOW.withAlpha(0.5);
function makeProperty(entity, color) {
var colorProperty = new Cesium.CallbackProperty(function (
time,
result
) {
if (pickedEntities.contains(entity)) {
return pickColor.clone(result);
}
return color.clone(result);
},
false);
entity.polygon.material = new Cesium.ColorMaterialProperty(
colorProperty
);
}
//红色实体
var red = viewer.entities.add({
polygon: {
hierarchy: Cesium.Cartesian3.fromDegreesArray([
-70.0,
30.0,
-60.0,
30.0,
-60.0,
40.0,
-70.0,
40.0,
]),
height: 0,
},
});
makeProperty(red, Cesium.Color.RED.withAlpha(0.5));
//蓝色实体
var blue = viewer.entities.add({
polygon: {
hierarchy: Cesium.Cartesian3.fromDegreesArray([
-75.0,
34.0,
-63.0,
34.0,
-63.0,
40.0,
-75.0,
40.0,
]),
height: 0,
},
});
makeProperty(blue, Cesium.Color.BLUE.withAlpha(0.5));
//绿色实体
var green = viewer.entities.add({
polygon: {
hierarchy: Cesium.Cartesian3.fromDegreesArray([
-67.0,
36.0,
-55.0,
36.0,
-55.0,
30.0,
-67.0,
30.0,
]),
height: 0,
},
});
makeProperty(green, Cesium.Color.GREEN.withAlpha(0.5));
// Move the primitive that the mouse is over to the top.
handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
handler.setInputAction(function (movement) {
// get an array of all primitives at the mouse position
var pickedObjects = scene.drillPick(movement.endPosition);
if (Cesium.defined(pickedObjects)) {
//Update the collection of picked entities.
pickedEntities.removeAll();
for (var i = 0; i < pickedObjects.length; ++i) {
var entity = pickedObjects[i].id;
pickedEntities.add(entity);
}
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);