胶州空管前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

875 lines
32 KiB

var CLOUD = CLOUD || {};
function BDImageryProvider(options) {
// this._url = "http://online1.map.bdimg.com/onlinelabel/?qt=tile";
this._url = "https://api.map.baidu.com/customimage/tile?udt=20181205&scale=1&ak=1XjLLEhZhQNUzd93EjU5nOGQ&customid=white";
this._tileWidth = 256;
this._tileHeight = 256;
this._maximumLevel = 18;
this._height = 33746824;
this._width = 33554054;
var rectangleSouthwestInMeters = new Cesium.Cartesian2(-this._width, -this._height);
var rectangleNortheastInMeters = new Cesium.Cartesian2(this._width, this._height);
this._tilingScheme = new Cesium.WebMercatorTilingScheme({ rectangleSouthwestInMeters: rectangleSouthwestInMeters, rectangleNortheastInMeters: rectangleNortheastInMeters });
// this._tilingScheme = new Cesium.WebMercatorTilingScheme();
this._credit = undefined;
this._rectangle = this._tilingScheme.rectangle;
this._ready = true;
}
function buildImageUrl(imageryProvider, x, y, level) {
var url = imageryProvider._url + "&x={x}&y={y}&z={z}";
var tileW = imageryProvider._tilingScheme.getNumberOfXTilesAtLevel(level);
var tileH = imageryProvider._tilingScheme.getNumberOfYTilesAtLevel(level);
url = url
.replace('{x}', x - tileW / 2)
.replace('{y}', tileH / 2 - y - 1)
.replace('{z}', level);
return url;
}
Cesium.defineProperties(BDImageryProvider.prototype, {
url: {
get: function () {
return this._url;
}
},
token: {
get: function () {
return this._token;
}
},
proxy: {
get: function () {
return this._proxy;
}
},
tileWidth: {
get: function () {
//>>includeStart('debug', pragmas.debug);
if (!this._ready) {
throw new DeveloperError('tileWidth must not be called before the imagery provider is ready.');
}
//>>includeEnd('debug');
return this._tileWidth;
}
},
tileHeight: {
get: function () {
//>>includeStart('debug', pragmas.debug);
if (!this._ready) {
throw new DeveloperError('tileHeight must not be called before the imagery provider is ready.');
}
//>>includeEnd('debug');
return this._tileHeight;
}
},
maximumLevel: {
get: function () {
//>>includeStart('debug', pragmas.debug);
if (!this._ready) {
throw new DeveloperError('maximumLevel must not be called before the imagery provider is ready.');
}
//>>includeEnd('debug');
return this._maximumLevel;
}
},
minimumLevel: {
get: function () {
//>>includeStart('debug', pragmas.debug);
if (!this._ready) {
throw new DeveloperError('minimumLevel must not be called before the imagery provider is ready.');
}
//>>includeEnd('debug');
return 0;
}
},
tilingScheme: {
get: function () {
//>>includeStart('debug', pragmas.debug);
if (!this._ready) {
throw new DeveloperError('tilingScheme must not be called before the imagery provider is ready.');
}
//>>includeEnd('debug');
return this._tilingScheme;
}
},
rectangle: {
get: function () {
//>>includeStart('debug', pragmas.debug);
if (!this._ready) {
throw new DeveloperError('rectangle must not be called before the imagery provider is ready.');
}
//>>includeEnd('debug');
return this._rectangle;
}
},
tileDiscardPolicy: {
get: function () {
//>>includeStart('debug', pragmas.debug);
if (!this._ready) {
throw new DeveloperError('tileDiscardPolicy must not be called before the imagery provider is ready.');
}
//>>includeEnd('debug');
return this._tileDiscardPolicy;
}
},
errorEvent: {
get: function () {
return this._errorEvent;
}
},
ready: {
get: function () {
return this._ready;
}
},
readyPromise: {
get: function () {
return this._readyPromise.promise;
}
},
credit: {
get: function () {
return this._credit;
}
},
usingPrecachedTiles: {
get: function () {
return this._useTiles;
}
},
hasAlphaChannel: {
get: function () {
return true;
}
},
layers: {
get: function () {
return this._layers;
}
}
});
BDImageryProvider.prototype.getTileCredits = function (x, y, level) {
return undefined;
};
BDImageryProvider.prototype.requestImage = function (x, y, level) {
if (!this._ready) {
throw new DeveloperError('requestImage must not be called before the imagery provider is ready.');
}
var url = buildImageUrl(this, x, y, level);
return Cesium.ImageryProvider.loadImage(this, url);
};
function createAMapByUrl(Cesium,options) {
options = Cesium.defaultValue(options, {});
var templateUrl = Cesium.defaultValue(options.url, '//webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}');
var trailingSlashRegex = /\/$/;
var defaultCredit = new Cesium.Credit('AMap');
var tilingScheme = new Cesium.WebMercatorTilingScheme({ ellipsoid : options.ellipsoid });
var tileWidth = 256;
var tileHeight = 256;
var minimumLevel = Cesium.defaultValue(options.minimumLevel, 0);
var maximumLevel = Cesium.defaultValue(options.minimumLevel, 18);
var rectangle = Cesium.defaultValue(options.rectangle, tilingScheme.rectangle);
// Check the number of tiles at the minimum level. If it's more than four,
// throw an exception, because starting at the higher minimum
// level will cause too many tiles to be downloaded and rendered.
var swTile = tilingScheme.positionToTileXY(Cesium.Rectangle.southwest(rectangle), minimumLevel);
var neTile = tilingScheme.positionToTileXY(Cesium.Rectangle.northeast(rectangle), minimumLevel);
var tileCount = (Math.abs(neTile.x - swTile.x) + 1) * (Math.abs(neTile.y - swTile.y) + 1);
//>>includeStart('debug', pragmas.debug);
if (tileCount > 4) {
throw new Cesium.DeveloperError('The rectangle and minimumLevel indicate that there are ' + tileCount + ' tiles at the minimum level. Imagery providers with more than four tiles at the minimum level are not supported.');
}
//>>includeEnd('debug');
var credit = Cesium.defaultValue(options.credit, defaultCredit);
if (typeof credit === 'string') {
credit = new Cesium.Credit(credit);
}
return new Cesium.UrlTemplateImageryProvider({
url: templateUrl,
proxy: options.proxy,
credit: credit,
tilingScheme: tilingScheme,
tileWidth: tileWidth,
tileHeight: tileHeight,
minimumLevel: minimumLevel,
maximumLevel: maximumLevel,
rectangle: rectangle
});
}
var fixGltf = function (gltf) {
if (!gltf.extensionsUsed) {
return;
}
var v = gltf.extensionsUsed.indexOf('KHR_technique_webgl');
if (v !== -1) {
gltf.extensionsRequired.splice(t, 1, 'KHR_techniques_webgl');
gltf.extensionsUsed.splice(v, 1, 'KHR_techniques_webgl');
gltf.extensions = gltf.extensions || {};
gltf.extensions['KHR_techniques_webgl'] = {};
gltf.extensions['KHR_techniques_webgl'].programs = gltf.programs;
gltf.extensions['KHR_techniques_webgl'].shaders = gltf.shaders;
gltf.extensions['KHR_techniques_webgl'].techniques = gltf.techniques;
var techniques = gltf.extensions['KHR_techniques_webgl'].techniques;
gltf.materials.forEach(function (mat, index) {
gltf.materials[index].extensions || (gltf.materials[index].extensions = { KHR_technique_webgl: {} }); // vtxf 181025
gltf.materials[index].extensions['KHR_technique_webgl'].values = gltf.materials[index].values;
gltf.materials[index].extensions['KHR_techniques_webgl'] = gltf.materials[index].extensions['KHR_technique_webgl'];
var vtxfMaterialExtension = gltf.materials[index].extensions['KHR_techniques_webgl'];
vtxfMaterialExtension.technique || (vtxfMaterialExtension.technique = gltf.materials[index].technique); // vtxf 181025
for (var value in vtxfMaterialExtension.values) {
var us = techniques[vtxfMaterialExtension.technique].uniforms;
for (var key in us) {
if (us[key] === value) {
vtxfMaterialExtension.values[key] = vtxfMaterialExtension.values[value];
delete vtxfMaterialExtension.values[value];
break;
}
}
};
});
if (Cesium.defined(gltf.extensionsRequired)) {
var t = gltf.extensionsRequired.indexOf('KHR_technique_webgl');
techniques.forEach(function (t) {
for (var attribute in t.attributes) {
var name = t.attributes[attribute];
t.attributes[attribute] = t.parameters[name];
};
for (var uniform in t.uniforms) {
var name = t.uniforms[uniform];
t.uniforms[uniform] = t.parameters[name];
};
});
}
}
}
Object.defineProperties(Cesium.Model.prototype, {
_cachedGltf: {
set: function (value) {
this._vtxf_cachedGltf = value;
if (this._vtxf_cachedGltf && this._vtxf_cachedGltf._gltf) {
fixGltf(this._vtxf_cachedGltf._gltf);
}
},
get: function () {
return this._vtxf_cachedGltf;
}
}
});
class CesiumLoader {
/**
*Creates an instance of CesiumLoader.
* @param {Container} container
* @param {Object} params
* @param {Number} params.longitude 模型初始经度
* @param {Number} params.latitude 模型初始纬度
* @param {bool} params.useTerrain 是否使用地形
* @param {Number} params.clipHeight 模型的剖切高度 单位为 m,不需要高度迫切取undefined 或者 0
* @param {Number} params.duration cesium 相机跳转时间,单位为s 默认为5
* @memberof CesiumLoader
*/
constructor(params) {
this.container = params.container;
this.worldCoordinates = [0, 0];
this.worldCoordinates[0] = params.longitude == undefined ? 121.32403 : params.longitude;
this.worldCoordinates[1] = params.latitude == undefined ? 31.198192 : params.latitude;
this.useTerrain = params.useTerrain == undefined ? false : params.useTerrain;
this.imageryLayer = params.imageryLayer == undefined ? CLOUD.EnumCesiumImageryLayerType.AUTO : params.imageryLayer;
this.clipHeight = params.clipHeight == undefined ? 0 : params.clipHeight;
this.duration = params.duration == undefined ? 5 : params.duration;
this.accessToken = params.accessToken;
this.globalPlane = undefined;
this.viewer = undefined;
this.terrainProvider = undefined;
this.terrainHeight = {};
this.globeMatrix = undefined;
this.cameraScale = 0.001;
this.viewport = undefined;
this.originBimCameraTar = undefined;
this.closeToModel = 0.0;
this.gdRoadNoLabel = undefined;
}
/**
* init cesium
*
* @param {function} callback cesium初始化完成回调函数
* @param {Object} para 需要传递的对象
* @memberof CesiumLoader
*/
init(callback, para) {
let self = this;
if (this.accessToken) {
Cesium.Ion.defaultAccessToken = this.accessToken;
}
if (this.useTerrain && !this.accessToken) {
console.warn('when useTerrain,the accessToken can not be null');
}
// Query the terrain height of two Cartographic positions
this.terrainProvider = Cesium.createWorldTerrain();
var positions = [
Cesium.Cartographic.fromDegrees(this.worldCoordinates[0], this.worldCoordinates[1])
];
var promise = Cesium.sampleTerrainMostDetailed(this.terrainProvider, positions);
//TODO:支持多种地图类型 + 离线地图数据
var imageryLayer = undefined;
switch (self.imageryLayer) {
case CLOUD.EnumCesiumImageryLayerType.AUTO:
imageryLayer = self.accessToken == undefined ? new Cesium.TileMapServiceImageryProvider({
url: Cesium.buildModuleUrl('Assets/Textures/NaturalEarthII')
}) : false;
break;
case CLOUD.EnumCesiumImageryLayerType.BAIDU:
imageryLayer = new BDImageryProvider();
break;
case CLOUD.EnumCesiumImageryLayerType.GAODE:
var amapVector = createAMapByUrl(Cesium, { url: "//webst01.is.autonavi.com/appmaptile?style=7&x={x}&y={y}&z={z}" });
var amapRoad = createAMapByUrl(Cesium, { url: "//wprd04.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=8&ltype=11", });
var amapLabel = createAMapByUrl(Cesium, { url: "//wprd04.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=8&ltype=12", });
imageryLayer = amapVector;
break;
case CLOUD.EnumCesiumImageryLayerType.MAPBOX:
imageryLayer = new Cesium.MapboxImageryProvider({
mapId: 'mapbox.streets-satellite'
});
break;
case CLOUD.EnumCesiumImageryLayerType.GOOGLE:
imageryLayer = imageryLayer = new Cesium.UrlTemplateImageryProvider({
url: "//www.google.cn/maps/vt?lyrs=s&gl=CN&x={x}&y={y}&z={z}",
tilingScheme: new Cesium.WebMercatorTilingScheme(),
minimumLevel: 1,
maximumLevel: 20
});
break;
case CLOUD.EnumCesiumImageryLayerType.ARCGIS:
imageryLayer = new Cesium.ArcGisMapServerImageryProvider({
url: '//nationalmap.gov.au/proxy/http://services.ga.gov.au/site_3/rest/services/Electricity_Infrastructure/MapServer'
});
break;
default:
imageryLayer = self.createGoogleMapsByUrl(Cesium, { url: "//mt1.google.cn/vt/lyrs=s&hl=zh-CN&x={x}&y={y}&z={z}" });
break;
}
if (self.useTerrain === true) {
Cesium.when(promise, function (updatedPositions) {
self.terrainHeight = updatedPositions[0].height;
self.viewer.terrainProvider = Cesium.createWorldTerrain();
self.initView(imageryLayer, callback, para);
});
} else {
self.terrainHeight = 0;
self.initView(imageryLayer, callback, para);
}
}
initView(imageryLayer, callback, para) {
let self = this;
// Init view
self.viewer = new Cesium.Viewer(self.container, {
useDefaultRenderLoop: true,
//shouldAnimate : true,
selectionIndicator: false,
homeButton: false,
sceneModePicker: false,
navigationHelpButton: false,
infoBox: false,
navigationHelpButton: false,
navigationInstructionsInitiallyVisible: false,
animation: false,
timeline: false,
fullscreenButton: false,
allowTextureFilterAnisotropic: false,
contextOptions: {
webgl: {
alpha: true,
antialias: true,
preserveDrawingBuffer: true,
failIfMajorPerformanceCaveat: false,
depth: true,
stencil: false,
anialias: true
},
},
targetFrameRate: 60,
resolutionScale: 0.1,
orderIndependentTranslucency: true,
imageryProvider: imageryLayer,
baseLayerPicker: false,
geocoder: false,
automaticallyTrackDataSourceClocks: false,
dataSources: null,
clock: null,
terrainShadows: Cesium.ShadowMode.DISABLED,
});
self.viewer._cesiumWidget._creditContainer.style.display = "none"; //去除版权信息
self.viewer.scene.skyBox.show = false;
self.viewer.scene.backgroundColor = new Cesium.Color(0.0, 0.0, 0.0, 0.0);
// skyAtmosphere setting
// self.viewer.scene.skyAtmosphere = new Cesium.SkyAtmosphere();
// self.viewer.scene.skyAtmosphere.brightnessShift = 0.75;
// self.viewer.scene.skyAtmosphere.saturationShift = 0.58;
// self.viewer.scene.skyAtmosphere.hueShift = -0.09;
//self.loadGltf(self.worldCoordinates[0]+0.00095, self.worldCoordinates[1]+0.0003,self.terrainHeight+100, '../../../ThirdParty/Cesium/Specs/Data/Models/MaterialsCommon/Cesium_Man.gltf')
//self.viewer.camera.switchToPerspectiveFrustum();
//var scene = this.viewer.scene;
//scene.screenSpaceCameraController.minimumZoomDistance = 200;
// 画坐标系
// var hprRollZero = new Cesium.HeadingPitchRoll();
// var position = new Cesium.Cartesian3.fromDegrees(self.worldCoordinates[0],self.worldCoordinates[1],self.terrainHeight);
// var converter =Cesium.Transforms.localFrameToFixedFrameGenerator('north', 'west');
// var modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(position, hprRollZero, Cesium.Ellipsoid.WGS84, converter);
// self.viewer.scene.primitives.add(new Cesium.DebugModelMatrixPrimitive({
// modelMatrix: modelMatrix,
// length: 400.0,
// width: 10.0
// }));
self.updateCesiumOriginPos();
//增加imageLayer
var gdRoadNoLabel = new Cesium.UrlTemplateImageryProvider({
url:
"//webst02.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&style=8&scale=1",
minimumLevel: 3,
maximumLevel: 18
});
self.gdRoad = self.viewer.imageryLayers.addImageryProvider(gdRoadNoLabel);
// 透明度
self.gdRoad.alpha = 0.5;
self.gdRoad.show = false;
// var pickHandler = new Cesium.ScreenSpaceEventHandler(self.viewer.scene.canvas);
// pickHandler.setInputAction(function (movement) {
// console.log(movement.position);
// }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
//url = "../cesium/ThirdParty/Cesium/Apps/SampleData/models/CesiumMan/Cesium_Man.gltf"
//loadGltf(worldCoordinates[0], worldCoordinates[1], terrainHeight,url)
//loadSkyBox();
//url = '../cesium/data/ZheJiangGeo.json'
//loadGeoJson(url);
//滚轮事件监听
// var handler = new Cesium.ScreenSpaceEventHandler(self.viewer.canvas);
// handler.setInputAction(function (wheelment) {}, Cesium.ScreenSpaceEventType.WHEEL);
//点击事件监听
let handler = new Cesium.ScreenSpaceEventHandler(self.viewer.scene.canvas);
handler.setInputAction(function (movement) {
let position = self.viewer.scene.pickPosition(movement.position);
console.log(position);
//let dist = Math.sqrt(Math.pow(position.x - self.viewer.camera.position.x,2.0) + Math.pow(position.y - self.viewer.camera.position.y,2.0) + Math.pow(position.z - self.viewer.camera.position.z,2.0));
//console.log(dist);
position = self.kadierTollh(position);
console.log(position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
self.viewer.camera.flyTo({
destination: para.cesiumDestination != undefined ? para.cesiumDestination : self.cesiumOriginPos,
orientation: para.cesiumOrientation != undefined ? para.cesiumOrientation : {
//direction : new Cesium.Cartesian3( 0.9054182767831188, -0.3771947217141325, 0.19478677054175442) ,
//up : new Cesium.Cartesian3(0.0966575350162154, 0.6299571927734148, 0.7705914976157133)
heading: Cesium.Math.toRadians(175.0),
pitch: Cesium.Math.toRadians(-35.0),
roll: 0.0
},
duration: self.duration,
complete: function () {
// 到达位置后执行的回调函数
// self.viewer.scene.screenSpaceCameraController.enableZoom = false;
// self.viewer.scene.screenSpaceCameraController.enableTilt = false;
// self.viewer.scene.screenSpaceCameraController.enableRotate = false;
// self.viewer.scene.screenSpaceCameraController.enableTranslate = false;
// self.viewer.scene.screenSpaceCameraController.enableLook = false;
callback && callback(para);
//renderThreeContext();
//renderWebglContext();
//initThree3();
},
});
this.viewer.scene.globe.depthTestAgainstTerrain = true;
}
/**
* Create GoogleMaps By Url
* @param {Object} Cesium Cesium
* @param {Object} options 地图参数设置
*
* @memberof CesiumLoader
*/
createGoogleMapsByUrl(Cesium, options) {
options = Cesium.defaultValue(options, {});
var templateUrl = Cesium.defaultValue(options.url, 'https://mt1.google.cn/vt/lyrs=s&hl=zh-CN&x={x}&y={y}&z={z}');
var trailingSlashRegex = /\/$/;
var defaultCredit = new Cesium.Credit('Google Maps');
var tilingScheme = new Cesium.WebMercatorTilingScheme({ ellipsoid: options.ellipsoid });
var tileWidth = 256;
var tileHeight = 256;
var minimumLevel = Cesium.defaultValue(options.minimumLevel, 0);
var maximumLevel = Cesium.defaultValue(options.minimumLevel, 17);
var rectangle = Cesium.defaultValue(options.rectangle, tilingScheme.rectangle);
// Check the number of tiles at the minimum level. If it's more than four,
// throw an exception, because starting at the higher minimum
// level will cause too many tiles to be downloaded and rendered.
var swTile = tilingScheme.positionToTileXY(Cesium.Rectangle.southwest(rectangle), minimumLevel);
var neTile = tilingScheme.positionToTileXY(Cesium.Rectangle.northeast(rectangle), minimumLevel);
var tileCount = (Math.abs(neTile.x - swTile.x) + 1) * (Math.abs(neTile.y - swTile.y) + 1);
//>>includeStart('debug', pragmas.debug);
if (tileCount > 4) {
throw new Cesium.DeveloperError('The rectangle and minimumLevel indicate that there are ' + tileCount + ' tiles at the minimum level. Imagery providers with more than four tiles at the minimum level are not supported.');
}
//>>includeEnd('debug');
var credit = Cesium.defaultValue(options.credit, defaultCredit);
if (typeof credit === 'string') {
credit = new Cesium.Credit(credit);
}
return new Cesium.UrlTemplateImageryProvider({
url: templateUrl,
proxy: options.proxy,
credit: credit,
tilingScheme: tilingScheme,
tileWidth: tileWidth,
tileHeight: tileHeight,
minimumLevel: minimumLevel,
maximumLevel: maximumLevel,
rectangle: rectangle
});
}
/**
* update Cesium Origin Position
*
* @memberof CesiumLoader
*/
updateCesiumOriginPos() {
this.cesiumOriginPos = Cesium.Cartesian3.fromDegrees(
this.worldCoordinates[0], this.worldCoordinates[1],
this.terrainHeight + 100
);
}
/**
* 三维坐标转换为经纬度坐标
*
* @param {Cartesian3} Cartesian3
* @returns
* @memberof CesiumLoader
*/
kadierTollh(Cartesian3) {
if (Cesium.defined(Cartesian3)) {
var cartographic = Cesium.Cartographic.fromCartesian(Cartesian3);
var lon_f = Cesium.Math.toDegrees(cartographic.longitude);
var lat_f = Cesium.Math.toDegrees(cartographic.latitude);
var po_hig = cartographic.height;
return {
'lon': lon_f,
'lat': lat_f,
'alt': po_hig
};
}
}
/**
* 经纬度坐标转换为三维坐标
*
* @param {Number} lng 经度
* @param {Number} lat 纬度
* @param {Number} alt 高度
* @returns {Cesium.Cartesian3}
* @memberof CesiumLoader
*/
llhToKadier(lng, lat, alt) {
return Cesium.Cartesian3.fromDegrees(lng, lat, alt)
}
/**
* 加载gltf文件
* @param {Number} lng 经度
* @param {Number} lat 纬度
* @param {Number} alt 高度
* @param {Number} heading 偏航角
* @param {Number} pitch 俯仰角
* @param {Number} roll 滚转角
* @param {Function} callback 回调函数
* @returns {Cesium.Cartesian3}
* @memberof CesiumLoader
*/
loadGltf(url, long, lat, offset, heading, pitch, roll, callback) {
var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(
Cesium.Cartesian3.fromDegrees(long, lat, offset));
var position = Cesium.Cartesian3.fromDegrees(long, lat, offset);
var h = Cesium.Math.toRadians(heading);
var p = Cesium.Math.toRadians(pitch);
var r = Cesium.Math.toRadians(roll);
var hpr = new Cesium.HeadingPitchRoll(h, p, r);
var orientation = Cesium.Transforms.headingPitchRollQuaternion(position, hpr);
// var model = this.viewer.scene.primitives.add(
// Cesium.Model.fromGltf({
// url: url,
// modelMatrix: modelMatrix,
// scale: 200.0
// })
// );
// model.readyPromise.then(function (model) {
// callback && callback(model);
// }).otherwise(function (error) {
// console.log(error);
// });
var entity = this.viewer.entities.add({
name: url,
position: position,
orientation: orientation,
model: {
uri: url,
minimumPixelSize: 128,
maximumScale: 20000
}
});
callback && callback(entity);
}
/**
* 加载 3dtiles 数据
*
* @param {Number} offset 偏移高度
* @param {String} url 3dtile json 文件请求路径
* @param {Number} maximumScreenSpaceError
* @param {Function} callback 加载完成回调函数
*/
load3dTiles(url, offset,maximumScreenSpaceError,callback) {
var self = this;
var tileSet = new Cesium.Cesium3DTileset({
url: url,
maximumScreenSpaceError:maximumScreenSpaceError,
});
tileSet.readyPromise.then(function (tileSet) {
self.viewer.scene.primitives.add(tileSet);
var boundingSphere = tileSet.boundingSphere;
var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);//获取到倾斜数据中心点的经纬度坐标(弧度)
var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);//倾斜数据中心点的笛卡尔坐标
var positions = [Cesium.Cartographic.fromDegrees(cartographic.longitude, cartographic.latitude)];
var terrainHeight = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, offset);//带高程的新笛卡尔坐标
var translation = Cesium.Cartesian3.subtract(terrainHeight, surface, new Cesium.Cartesian3());//做差得到变换矩阵
tileSet.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
// self.viewer.zoomTo(tileSet, new Cesium.HeadingPitchRange(0.5, -0.2, tileSet.boundingSphere
// .radius *
// 1.0));
callback && callback(tileSet);
}).otherwise(function (error) {
window.alert(error);
});
}
/**
* 根据具体参数加载 3dtiles 数据
*
* @param {Number} offset 偏移高度
* @param {String} url 3dtile json 文件请求路径
* @param {Number} long 经度
* @param {Number} lat 纬度
* @param {Number} offset 偏移高度
* @param {Number} maximumScreenSpaceError
* @param {Function} callback 加载完成回调函数
*/
load3dTilesByPosition(url, long, lat, offset, maximumScreenSpaceError,callback) {
var self = this;
var tileSet = self.viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
url: url,
maximumScreenSpaceError:maximumScreenSpaceError,
scale: 1.0
}));
tileSet.readyPromise.then(function (argument) {
// 1、旋转
let hpr = new Cesium.Matrix3();
// new Cesium.HeadingPitchRoll(heading, pitch, roll)
// heading围绕负z轴的旋转。pitch是围绕负y轴的旋转。Roll是围绕正x轴的旋转
let hprObj = new Cesium.HeadingPitchRoll(Math.PI, Math.PI, Math.PI);
// Cesium.Matrix3.fromHeadingPitchRoll (headingPitchRoll,result)
hpr = Cesium.Matrix3.fromHeadingPitchRoll(hprObj, hpr);
// 2、平移
// 2.3储存平移的结果
let modelMatrix = Cesium.Matrix4.multiplyByTranslation(
// 2.1从以度为单位的经度和纬度值返回Cartesian3位置
// 2.2计算4x4变换矩阵
Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(long,
lat, offset)), new Cesium.Cartesian3(), new Cesium.Matrix4()
);
/// 3、应用旋转
// Cesium.Matrix4.multiplyByMatrix3 (矩阵,旋转,结果)
Cesium.Matrix4.multiplyByMatrix3(modelMatrix, hpr, modelMatrix);
tileSet._root.transform = modelMatrix;
callback && callback(tileSet);
});
//self.viewer.zoomTo(tileSet);
}
loadSkyBox() {
this.viewer.scene.skyBox = new Cesium.SkyBox({
sources: {
positiveX: '../cesium/ThirdParty/Cesium/Apps/SampleData/px.jpg',
negativeX: '../cesium/ThirdParty/Cesium/Apps/SampleData/nx.jpg',
positiveY: '../cesium/ThirdParty/Cesium/Apps/SampleData/py.jpg',
negativeY: '../cesium/ThirdParty/Cesium/Apps/SampleData/ny.jpg',
positiveZ: '../cesium/ThirdParty/Cesium/Apps/SampleData/pz.jpg',
negativeZ: '../cesium/ThirdParty/Cesium/Apps/SampleData/nz.jpg',
}
});
}
loadGeoJson(url) {
var promise = Cesium.GeoJsonDataSource.load(url);
promise.then(function (dataSource) {
self.viewer.dataSources.add(dataSource);
//Get the array of entities
var entities = dataSource.entities.values;
// var colorHash = {};
// for (var i = 0; i < entities.length; i++) {
// //For each entity, create a random color based on the state name.
// //Some states have multiple entities, so we store the color in a
// //hash so that we use the same color for the entire state.
// var entity = entities[i];
// var name = entity.name;
// var color = colorHash[name];
// if (!color) {
// color = Cesium.Color.fromRandom({
// alpha: 1.0
// });
// colorHash[name] = color;
// }
// //Set the polygon material to our random color.
// entity.polygon.material = color;
// //Remove the outlines.
// entity.polygon.outline = false;
// //Extrude the polygon based on the state's population. Each entity
// //stores the properties for the GeoJSON feature it was created from
// //Since the population is a huge number, we divide by 50.
// entity.polygon.extrudedHeight = entity.properties.Population / 50.0;
// }
}).otherwise(function (error) {
//Display any errrors encountered while loading.
window.alert(error);
});
}
//控制路图透明度以及是否显示
setUpGDRoad(enable, alpha) {
this.gdRoad.alpha = alpha;
this.gdRoad.show = enable;
}
}
CLOUD.CesiumLoader = CesiumLoader;