<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>自定义地图</title>
<link href="../Build/Cesium/Widgets/widgets.css" rel="stylesheet" />
<script src="../Build/Cesium/Cesium.js"></script>
<script src="../js/jquery.min.js"></script>
<script src="../js/baidu.js"></script>
<style>
html, body, #cesiumContainer {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
.cesium-viewer-fullscreenContainer{
display: none !important;
}
</style>
<!--leaflet风格气泡窗口样式模板-->
<style>
.trackPopUp {
display: none;
color: #ffffff;
position: absolute;
top:5px;
width: 330px;
height: 250px;
background-image: url(../img/infoBg.png) !important;
background-size: 100% 100%;
background-repeat: no-repeat;
}
.trackPopUp .popup-top{
width: 100%;
height: 35px;
/*background: linear-gradient(to right bottom,#0e89d0,#3fbbe8);*/
border-top-right-radius: 5px;
border-top-left-radius: 5px;
}
.popup-top .top-title{
line-height: 35px;
margin-left: 5px;
color: #333333;
font-weight: bolder;
}
.popup-top .leaflet-popup-close-button {
position: absolute;
top: 0;
right: 0;
padding: 4px 4px 0 0;
text-align: center;
font: 25px/25px Tahoma, Verdana, sans-serif;
color: #333333;
text-decoration: none;
font-weight: bolder;
background: transparent;
}
.trackPopUp .popup-content{
overflow-y: auto;
height: auto;
width: auto;
min-width: 220px;
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
}
.popup-content .video-content {
width: 100%;
height: auto;
}
.videoBox{
position: relative;
top: 0;
display: flex;
justify-content: center;
align-items: center;
}
</style>
</head>
<body>
<div id="cesiumContainer"></div>
<script>
var viewer, scene;
let params = {
tx: 117.4525, //模型中心X轴坐标(经度,单位:十进制度)
ty: 36.5253, //模型中心Y轴坐标(纬度,单位:十进制度)
tz: 0, //模型中心Z轴坐标(高程,单位:米)
rx: 0, //X轴(经度)方向旋转角度(单位:度)
ry: 0, //Y轴(纬度)方向旋转角度(单位:度)
rz: -1 //Z轴(高程)方向旋转角度(单位:度)
};
let gltfArr = [
{ id : '001',
name : '灯杆001',
position:[117.4590, 36.5283],
heading:-90,
color:Cesium.Color.ROYALBLUE
},{
id : '002',
name : '灯杆002',
position:[117.4540, 36.5285],
heading:160,
color:Cesium.Color.ROYALBLUE
},{
id : '003',
name : '灯杆003',
position:[117.4490, 36.5226],
heading:0,
color:Cesium.Color.ROYALBLUE
},{
id : '004',
name : '灯杆004',
position:[117.4540, 36.5226],
heading:-30,
color:Cesium.Color.ROYALBLUE
},{
id : '005',
name : '灯杆005',
position:[117.4460, 36.5283],
heading:90,
color:Cesium.Color.ROYALBLUE
},{
id : '006',
name : '灯杆006',
position:[117.4580, 36.5230],
heading:-30,
color:Cesium.Color.ROYALBLUE
}
];
let popupArr = [
{
text:'博学楼',
position:[117.452, 36.5245],
height:85
},
{
text:'实验楼',
position:[117.452, 36.5270],
height:85
},
{
text:'声乐楼',
position:[117.456, 36.5275],
height:80
},
{
text:'体育楼',
position:[117.456, 36.5242],
height:105
}
];
//设置初始范围
var cartographic1 = [117.4500, 36.5080];//西南
var cartographic2 = [117.4600, 36.5120];//东北
//创建地图初始范围对象
var initExtent = new Cesium.Rectangle(cartographic1[0], cartographic1[1], cartographic2[0], cartographic2[1]);
var defaultResetView = Cesium.Rectangle.fromDegrees(initExtent.west, initExtent.south, initExtent.east,initExtent.north);
/* 设置地图 */
initMap();
function initMap() {
viewer = new Cesium.Viewer('cesiumContainer', {
imageryProvider: new BaiduImageryProvider({
//街道图
//url: "http://online{s}.map.bdimg.com/onlinelabel/?qt=tile&x={x}&y={y}&z={z}&styles=pl&scaler=1&p=1",
//自定义底图
//可选值:dark,midnight,grayscale,hardedge,light,redalert,googlelite,grassgreen,pink,darkgreen,bluish
url: "http://api{s}.map.bdimg.com/customimage/tile?&x={x}&y={y}&z={z}&scale=1&customid=darkgreen" ,
//地形图
//url: "http://shangetu{s}.map.bdimg.com/it/u=x={x};y={y};z={z};v=009;type=sate&fm=46" ,
//实时路况
//url:'http://its.map.baidu.com:8002/traffic/TrafficTileService?x={x}&y={y}&level={z}&time=20210825&label=web2D&v=017'
}),
homeButton: false, // 是否显示home控件
vrButton: false,
fullscreenButton: true,
animation: true, // 是否显示动画控件
geocoder: false, // 是否显示地名查找控件
timeline: true, // 是否显示时间线控件
sceneModePicker: false, // 是否显示投影方式控件
navigationHelpButton: false, // 是否显示帮助信息控件
infoBox: false, // 是否显示点击要素之后显示的信息
baseLayerPicker: false, // 是否显示图层选择控件
selectionIndicator: true, // Disable selection indicator
shouldAnimate: true
// requestRenderMode: true
});
// 不显示三维信息
viewer._cesiumWidget._creditContainer.style.display = 'none'
viewer.animation.container.style.visibility = 'hidden'; // 不显示动画控件
viewer.timeline.container.style.visibility = 'hidden'; // 不显示时间控件
scene = viewer.scene;
//viewer.scene.screenSpaceCameraController.maximumZoomDistance = 1400;
scene.screenSpaceCameraController.enableRotate = true;
scene.screenSpaceCameraController.enableTranslate = true;
scene.screenSpaceCameraController.enableZoom = true;
scene.screenSpaceCameraController.enableTilt = true;
initWork();
}
/*添加模型*/
function initWork() {
var palaceTileset = new Cesium.Cesium3DTileset({
url: '../modelData/guangda/tileset.json',
maximumScreenSpaceError: 16,//默认16,最大屏幕空间错误
maximumNumberOfLoadedTiles: 1000,
maximumMemoryUsage: 4096//默认512,内存MB的最大数量
});
palaceTileset.readyPromise.then(function (palaceTileset) {
//添加到场景
viewer.scene.primitives.add(palaceTileset);
palaceTileset._root.transform = update3dtilesMaxtrix(params);
//viewer.zoomTo(palaceTileset);
viewer.camera.flyTo({
destination:Cesium.Rectangle.fromDegrees(initExtent.west, initExtent.south, initExtent.east,initExtent.north),
duration:0.1,
orientation: {
heading: Cesium.Math.toRadians(0),//东西朝向
pitch: Cesium.Math.toRadians(-25.5),//角度
roll:0.0//左右朝向
},
easingFunction: Cesium.EasingFunction.LINEAR_NONE
});
dengGan();
popup();
});
}
/*放置灯杆*/
function dengGan() {
var gltfUrl = "../gltf/dengGan/scene.gltf";
for(var dg=0;dg<gltfArr.length;dg++){
var position = Cesium.Cartesian3.fromDegrees(gltfArr[dg].position[0], gltfArr[dg].position[1]);
var heading = Cesium.Math.toRadians(gltfArr[dg].heading);
var hpr = new Cesium.HeadingPitchRoll(heading, 0, 0);
var orientation = Cesium.Transforms.headingPitchRollQuaternion(position, hpr);
var entity = viewer.entities.add({
id : gltfArr[dg].id,
name : gltfArr[dg].name,
position : position,
orientation:orientation,
model : {
uri : gltfUrl,
scale: 0.02,
minimumPixelSize : 120, //最小可视化比例
maximumScale : 500, //最大可视化比例
color:gltfArr[dg].color,
heightReference: Cesium.HeightReference.RELATIVE_TO_GROUND
},
});
}
creatHandler()
}
/*显示气泡*/
function popup() {
var pinBuilder = new Cesium.PinBuilder();
for(var i=0;i<popupArr.length; i++){
viewer.entities.add({
name: "popup",
position: Cesium.Cartesian3.fromDegrees(popupArr[i].position[0],popupArr[i].position[1],popupArr[i].height),
billboard: {
image:pinBuilder.fromText(popupArr[i].text,Cesium.Color.ROYALBLUE, 100).toDataURL(),
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
},
});
}
}
//点击事件
function creatHandler() {
var handler3D = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
var scene = viewer.scene;
var infoDiv = '<div id="trackPopUp" class="trackPopUp">' +
'<div class="popup-top"><div class="top-title">灯杆视频</div><a class="leaflet-popup-close-button" href="#">×</a></div>' +
'<div class="popup-content">' +
'<div id="trackPopUpLink" class="video-content"></div>' +
'</div>' +
'</div>';
$("#cesiumContainer").append(infoDiv);
//绑定鼠标点击
handler3D.setInputAction(function (movement) {
var pick = scene.pick(movement.position); //判断是否拾取到模型
if (scene.pickPositionSupported && Cesium.defined(pick)) {
var cartesian = viewer.scene.pickPosition(movement.position);
var cartographic = Cesium.Cartographic.fromCartesian(cartesian); //根据笛卡尔坐标获取到弧度
var lng = Cesium.Math.toDegrees(cartographic.longitude).toFixed(3); //根据弧度获取到经度
var lat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(4); //根据弧度获取到纬度
console.log(lng,lat)
var height = cartographic.height;//模型高度
for(var dg=0;dg<gltfArr.length;dg++){
console.log(gltfArr[dg].position[0],gltfArr[dg].position[1])
if(lng == gltfArr[dg].position[0] && lat == gltfArr[dg].position[1] || lng+0.001 == gltfArr[dg].position[0] && lat+0.0001 == gltfArr[dg].position[1] || lng-0.001 == gltfArr[dg].position[0] && lat-0.0001 == gltfArr[dg].position[1]){
//$('#trackPopUp').show();
var content = ' <div class="videoBox"><video src="../img/fullView.mp4" width="320" height="200" controls autoplay>\n' +
'</video></div></div>';
var obj = { position: movement.position, content: content };
//videoWindow(obj);
}
}
}
else {
$('#trackPopUp').hide();
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}
//视频弹窗
function videoWindow(obj) {
var picked = scene.pick(obj.position);
if (Cesium.defined(picked)) {
$(".cesium-selection-wrapper").show();
$('#trackPopUpLink').empty();
$('#trackPopUpLink').append(obj.content);
var c = new Cesium.Cartesian2(obj.position.x, obj.position.y);
$('#trackPopUp').show();
positionPopUp(c); // Initial position
$('.leaflet-popup-close-button').click(function () {
$('#trackPopUp').hide();
$('#trackPopUpLink').empty();
$(".cesium-selection-wrapper").hide();
return false;
});
}
}
//弹窗定位
function positionPopUp(c) {
var x = c.x - ($('#trackPopUp').width()) / 2;
var y = c.y - 100;
$('#trackPopUp').css('transform', 'translate3d(' + x + 'px, ' + y + 'px, 0)');
}
//模型缩放
function update3dtilesMaxtrix(params) {
//旋转
let mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(params.rx));
let my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(params.ry));
let mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(params.rz));
let rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
let rotationY = Cesium.Matrix4.fromRotationTranslation(my);
let rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);
//平移
let position = Cesium.Cartesian3.fromDegrees(params.tx, params.ty, params.tz);
let m = Cesium.Transforms.eastNorthUpToFixedFrame(position);
let scale = Cesium.Matrix4.fromUniformScale(4.0);
// //缩放
Cesium.Matrix4.multiply(m, scale, m);
//旋转、平移矩阵相乘
Cesium.Matrix4.multiply(m, rotationX, m);
Cesium.Matrix4.multiply(m, rotationY, m);
Cesium.Matrix4.multiply(m, rotationZ, m);
//赋值给tileset
return m;
}
</script>
</body>
</html>
baudu.js
BaiduImageryProvider = function(options) {
this._errorEvent = new Cesium.Event();
this._tileWidth = 256;
this._tileHeight = 256;
this._maximumLevel = 18;
this._minimumLevel = 1;
let southwestInMeters = new Cesium.Cartesian2(-33554054, -33746824);
let northeastInMeters = new Cesium.Cartesian2(33554054, 33746824);
this._tilingScheme = new Cesium.WebMercatorTilingScheme({
rectangleSouthwestInMeters: southwestInMeters,
rectangleNortheastInMeters: northeastInMeters
});
this._rectangle = this._tilingScheme.rectangle;
this._resource = Cesium.Resource.createIfNeeded(options.url);
this._tileDiscardPolicy = undefined;
this._credit = undefined;
this._readyPromise = undefined;
};
Object.defineProperties(BaiduImageryProvider.prototype, {
url: {
get: function () {
return this._resource.url;
}
},
proxy: {
get: function () {
return this._resource.proxy;
}
},
tileWidth: {
get: function () {
if (!this.ready) {
throw new Cesium.DeveloperError('tileWidth must not be called before the imagery provider is ready.');
}
return this._tileWidth;
}
},
tileHeight: {
get: function () {
if (!this.ready) {
throw new Cesium.DeveloperError('tileHeight must not be called before the imagery provider is ready.');
}
return this._tileHeight;
}
},
maximumLevel: {
get: function () {
if (!this.ready) {
throw new Cesium.DeveloperError('maximumLevel must not be called before the imagery provider is ready.');
}
return this._maximumLevel;
}
},
minimumLevel: {
get: function () {
if (!this.ready) {
throw new Cesium.DeveloperError('minimumLevel must not be called before the imagery provider is ready.');
}
return this._minimumLevel;
}
},
tilingScheme: {
get: function () {
if (!this.ready) {
throw new Cesium.DeveloperError('tilingScheme must not be called before the imagery provider is ready.');
}
return this._tilingScheme;
}
},
tileDiscardPolicy: {
get: function () {
if (!this.ready) {
throw new Cesium.DeveloperError('tileDiscardPolicy must not be called before the imagery provider is ready.');
}
return this._tileDiscardPolicy;
}
},
rectangle: {
get: function () {
if (!this.ready) {
throw new Cesium.DeveloperError('rectangle must not be called before the imagery provider is ready.');
}
return this._rectangle;
}
},
errorEvent: {
get: function () {
return this._errorEvent;
}
},
ready: {
get: function () {
return this._resource;
}
},
readyPromise: {
get: function () {
return this._readyPromise;
}
},
credit: {
get: function () {
if (!this.ready) {
throw new Cesium.DeveloperError('credit must not be called before the imagery provider is ready.');
}
return this._credit;
}
},
});
BaiduImageryProvider.prototype.requestImage = function (x, y, level, request) {
let xTileCount = this._tilingScheme.getNumberOfXTilesAtLevel(level);
let yTileCount = this._tilingScheme.getNumberOfYTilesAtLevel(level);
let url = this.url
.replace("{x}", x - xTileCount / 2)
.replace("{y}", yTileCount / 2 - y - 1)
.replace("{z}", level)
.replace("{s}", Math.floor(10 * Math.random()));
//console.log("zxy:" + level + ", " + x + ", " + y + "; " + url);
return Cesium.ImageryProvider.loadImage(this, url);
};