效果图
实现代码
目前经测试仅支持1.58、1.63.1版本
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>天地图插件调用示例</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
<meta name="renderer" content="webkit" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<script src="cesium/Cesium.js"></script>
<link rel="stylesheet" type="text/css" href="cesium/Widgets/widgets.css" />
<!--天地图插件-->
<script src="https://api.tianditu.gov.cn/cdn/plugins/cesium/cesiumTdt.js"></script>
<style>
html,
body {
100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
#cesiumContainer {
100%;
height: 100%;
}
#cesiumContainer .cesium-viewer-bottom {
display: none;
}
</style>
</head>
<body>
<div id="cesiumContainer"></div>
<script>
var token = '在天地图官网申请的token'
// 服务域名
var tdtUrl = 'https://t{s}.tianditu.gov.cn/'
// 服务负载子域
var subdomains = ['0', '1', '2', '3', '4', '5', '6', '7']
var imgMap = new Cesium.UrlTemplateImageryProvider({
url: tdtUrl + 'DataServer?T=img_w&x={x}&y={y}&l={z}&tk=' + token,
subdomains: subdomains,
tilingScheme: new Cesium.WebMercatorTilingScheme(),
maximumLevel: 18,
})
// cesium 初始化
var viewer = new Cesium.Viewer('cesiumContainer', {
shouldAnimate: true,
selectionIndicator: true,
infoBox: false,
imageryProvider: imgMap,
})
// 抗锯齿
viewer.scene.postProcessStages.fxaa.enabled = false
// 水雾特效
viewer.scene.globe.showGroundAtmosphere = true
// 设置最大俯仰角,[-90,0]区间内,默认为-30,单位弧度
viewer.scene.screenSpaceCameraController.constrainedPitch = Cesium.Math.toRadians(
-20
)
// 取消默认的双击事件
viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(
Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK
)
// 叠加影像服务
//viewer.imageryLayers.addImageryProvider(imgMap)
// 叠加国界服务
var iboMap = new Cesium.UrlTemplateImageryProvider({
url: tdtUrl + 'DataServer?T=ibo_w&x={x}&y={y}&l={z}&tk=' + token,
subdomains: subdomains,
tilingScheme: new Cesium.WebMercatorTilingScheme(),
maximumLevel: 10,
})
viewer.imageryLayers.addImageryProvider(iboMap)
// 叠加地形服务
var terrainUrls = new Array()
for (var i = 0; i < subdomains.length; i++) {
var url =
tdtUrl.replace('{s}', subdomains[i]) +
'DataServer?T=elv_c&tk=' +
token
terrainUrls.push(url)
}
var provider = new Cesium.GeoTerrainProvider({
urls: terrainUrls,
})
viewer.terrainProvider = provider
// 将三维球定位到中国
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(103.84, 31.15, 17850000),
orientation: {
heading: Cesium.Math.toRadians(348.4202942851978),
pitch: Cesium.Math.toRadians(-89.74026687972041),
roll: Cesium.Math.toRadians(0),
},
complete: function callback() {
// 定位完成之后的回调函数
},
})
// 叠加三维地名服务
var wtfs = new Cesium.GeoWTFS({
viewer,
//三维地名服务,使用wtfs服务
subdomains: subdomains,
metadata: {
boundBox: {
minX: -180,
minY: -90,
maxX: 180,
maxY: 90,
},
minLevel: 1,
maxLevel: 20,
},
aotuCollide: true, //是否开启避让
collisionPadding: [5, 10, 8, 5], //开启避让时,标注碰撞增加内边距,上、右、下、左
serverFirstStyle: true, //服务端样式优先
labelGraphics: {
font: '28px sans-serif',
fontSize: 28,
fillColor: Cesium.Color.WHITE,
scale: 0.5,
outlineColor: Cesium.Color.BLACK,
outlineWidth: 5,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
showBackground: false,
backgroundColor: Cesium.Color.RED,
backgroundPadding: new Cesium.Cartesian2(10, 10),
horizontalOrigin: Cesium.HorizontalOrigin.MIDDLE,
verticalOrigin: Cesium.VerticalOrigin.TOP,
eyeOffset: Cesium.Cartesian3.ZERO,
pixelOffset: new Cesium.Cartesian2(0, 8),
},
billboardGraphics: {
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
verticalOrigin: Cesium.VerticalOrigin.CENTER,
eyeOffset: Cesium.Cartesian3.ZERO,
pixelOffset: Cesium.Cartesian2.ZERO,
alignedAxis: Cesium.Cartesian3.ZERO,
color: Cesium.Color.WHITE,
rotation: 0,
scale: 1,
18,
height: 18,
},
})
//三维地名服务,使用wtfs服务
wtfs.getTileUrl = function () {
return tdtUrl + 'mapservice/GetTiles?lxys={z},{x},{y}&tk=' + token
}
wtfs.getIcoUrl = function () {
return tdtUrl + 'mapservice/GetIcon?id={id}&tk=' + token
}
wtfs.initTDT([
{
x: 6,
y: 1,
level: 2,
boundBox: { minX: 90, minY: 0, maxX: 135, maxY: 45 },
},
{
x: 7,
y: 1,
level: 2,
boundBox: { minX: 135, minY: 0, maxX: 180, maxY: 45 },
},
{
x: 6,
y: 0,
level: 2,
boundBox: { minX: 90, minY: 45, maxX: 135, maxY: 90 },
},
{
x: 7,
y: 0,
level: 2,
boundBox: { minX: 135, minY: 45, maxX: 180, maxY: 90 },
},
{
x: 5,
y: 1,
level: 2,
boundBox: { minX: 45, minY: 0, maxX: 90, maxY: 45 },
},
{
x: 4,
y: 1,
level: 2,
boundBox: { minX: 0, minY: 0, maxX: 45, maxY: 45 },
},
{
x: 5,
y: 0,
level: 2,
boundBox: { minX: 45, minY: 45, maxX: 90, maxY: 90 },
},
{
x: 4,
y: 0,
level: 2,
boundBox: { minX: 0, minY: 45, maxX: 45, maxY: 90 },
},
{
x: 6,
y: 2,
level: 2,
boundBox: { minX: 90, minY: -45, maxX: 135, maxY: 0 },
},
{
x: 6,
y: 3,
level: 2,
boundBox: { minX: 90, minY: -90, maxX: 135, maxY: -45 },
},
{
x: 7,
y: 2,
level: 2,
boundBox: { minX: 135, minY: -45, maxX: 180, maxY: 0 },
},
{
x: 5,
y: 2,
level: 2,
boundBox: { minX: 45, minY: -45, maxX: 90, maxY: 0 },
},
{
x: 4,
y: 2,
level: 2,
boundBox: { minX: 0, minY: -45, maxX: 45, maxY: 0 },
},
{
x: 3,
y: 1,
level: 2,
boundBox: { minX: -45, minY: 0, maxX: 0, maxY: 45 },
},
{
x: 3,
y: 0,
level: 2,
boundBox: { minX: -45, minY: 45, maxX: 0, maxY: 90 },
},
{
x: 2,
y: 0,
level: 2,
boundBox: { minX: -90, minY: 45, maxX: -45, maxY: 90 },
},
{
x: 0,
y: 1,
level: 2,
boundBox: { minX: -180, minY: 0, maxX: -135, maxY: 45 },
},
{
x: 1,
y: 0,
level: 2,
boundBox: { minX: -135, minY: 45, maxX: -90, maxY: 90 },
},
{
x: 0,
y: 0,
level: 2,
boundBox: { minX: -180, minY: 45, maxX: -135, maxY: 90 },
},
])
</script>
</body>
</html>
