Basic Concepts
This page introduces the core concepts you need to understand when developing with the DMap3D SDK.
Viewer (Scene Container)
Viewer is the core class of Cesium, responsible for managing the rendering and interaction of the entire 3D scene. Typically, only one Viewer instance is created per page.
const viewer = new Cesium.Viewer('cesiumContainer', {
animation: false, // Animation widget
timeline: false, // Timeline
baseLayerPicker: false, // Basemap picker
})
Common Properties
| Property | Description |
|---|---|
viewer.scene | Scene object, manages rendering and the globe |
viewer.camera | Camera object, controls the viewpoint |
viewer.entities | Entity collection |
viewer.imageryLayers | Imagery layer collection |
viewer.scene.primitives | Primitive collection (3DTiles, etc.) |
Lifecycle
// Create
const viewer = new Cesium.Viewer(container, options)
// Use
viewer.entities.add({ ... })
viewer.camera.flyTo({ ... })
// Destroy (release memory, must be called)
viewer.destroy()
In React, make sure to call viewer.destroy() in the useEffect cleanup function to prevent memory leaks.
Coordinate Systems
Cesium uses multiple coordinate systems, and understanding the relationships between them is important.
Longitude/Latitude (Degrees)
The most intuitive geographic coordinate representation:
// Longitude, latitude, height (meters)
const longitude = 116.4074 // East longitude
const latitude = 39.9042 // North latitude
const height = 100 // Altitude above sea level
Cartesian3 (Cartesian Coordinates)
The 3D Cartesian coordinate system used internally by Cesium, with the Earth's center as the origin:
// Longitude/Latitude -> Cartesian3
const position = Cesium.Cartesian3.fromDegrees(116.4074, 39.9042, 100)
// Radians -> Cartesian3
const position2 = Cesium.Cartesian3.fromRadians(lon, lat, height)
Cartographic (Radian Coordinates)
// Cartesian3 -> Cartographic
const carto = Cesium.Cartographic.fromCartesian(position)
const lon = Cesium.Math.toDegrees(carto.longitude)
const lat = Cesium.Math.toDegrees(carto.latitude)
const alt = carto.height
Coordinate Conversion Quick Reference
Degrees <-> Cartesian3 <-> Cartographic (Radians)
| Conversion | Method |
|---|---|
| Degrees -> Cartesian3 | Cesium.Cartesian3.fromDegrees(lon, lat, height) |
| Cartesian3 -> Degrees | Cesium.Cartographic.fromCartesian(pos) + Math.toDegrees |
| Degrees -> Radians | Cesium.Math.toRadians(degrees) |
| Radians -> Degrees | Cesium.Math.toDegrees(radians) |
Entity
Entity is the simplest way to add visual objects to a scene, supporting points, lines, polygons, labels, and more.
// Add a point
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(116.4074, 39.9042),
point: {
pixelSize: 10,
color: Cesium.Color.RED,
},
})
// Add a line
viewer.entities.add({
polyline: {
positions: Cesium.Cartesian3.fromDegreesArray([
116.39, 39.90,
116.41, 39.92,
]),
width: 3,
material: Cesium.Color.YELLOW,
},
})
// Add a polygon
viewer.entities.add({
polygon: {
hierarchy: Cesium.Cartesian3.fromDegreesArray([
116.39, 39.90,
116.41, 39.90,
116.41, 39.92,
116.39, 39.92,
]),
material: Cesium.Color.BLUE.withAlpha(0.5),
},
})
Camera
The camera controls the viewing angle of the scene.
Instant Positioning
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(116.4074, 39.9042, 10000),
orientation: {
heading: Cesium.Math.toRadians(0), // Heading (0 = North)
pitch: Cesium.Math.toRadians(-45), // Pitch (negative = looking down)
roll: 0,
},
})
Flight Animation
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(116.4074, 39.9042, 10000),
duration: 2.0, // Flight duration (seconds)
})
View Parameters
| Parameter | Description | Range |
|---|---|---|
| heading | Horizontal direction | 0° = North, 90° = East, 180° = South, 270° = West |
| pitch | Pitch angle | -90° = straight down, 0° = horizontal |
| roll | Roll angle | Usually 0 |
Imagery Layers
Imagery layers are 2D map basemaps overlaid on the globe surface.
Tianditu (Recommended for Use in China)
// Satellite imagery
const imgLayer = new Cesium.WebMapTileServiceImageryProvider({
url: 'https://t0.tianditu.gov.cn/img_w/wmts?tk=YOUR_TOKEN',
layer: 'img',
style: 'default',
tileMatrixSetID: 'w',
format: 'tiles',
maximumLevel: 18,
})
// Vector annotations (overlaid on imagery to display place names)
const ciaLayer = new Cesium.WebMapTileServiceImageryProvider({
url: 'https://t0.tianditu.gov.cn/cia_w/wmts?tk=YOUR_TOKEN',
layer: 'cia',
style: 'default',
tileMatrixSetID: 'w',
format: 'tiles',
maximumLevel: 18,
})
// Add annotation layer
viewer.imageryLayers.addImageryProvider(ciaLayer)
Layer Management
// Add a layer
const layer = viewer.imageryLayers.addImageryProvider(provider)
// Set opacity
layer.alpha = 0.5
// Remove a layer
viewer.imageryLayers.remove(layer)
Terrain
Terrain gives the earth's surface realistic elevation relief.
// Use Cesium Ion global terrain
const viewer = new Cesium.Viewer(container, {
terrain: Cesium.Terrain.fromWorldTerrain(),
})
// No terrain (flat ellipsoid)
const viewer = new Cesium.Viewer(container, {
terrainProvider: new Cesium.EllipsoidTerrainProvider({}),
})
- Use
fromWorldTerrain()when terrain analysis (slope, profile, etc.) is needed - Use
EllipsoidTerrainProviderfor flat display only, which loads faster
3DTiles (3D Models)
3DTiles is a standard format for streaming large-scale 3D data (buildings, oblique photography, etc.).
// Load 3DTiles
const tileset = await Cesium.Cesium3DTileset.fromUrl(
'/3DTiles/model/tileset.json'
)
viewer.scene.primitives.add(tileset)
// Fly to the model location
viewer.zoomTo(tileset)
DMap3D Namespace
The DMap3D SDK organizes all functional modules through namespaces:
DMap3D
├── measurement // Measurement tools
│ ├── spaceDistance // Spatial distance
│ ├── horizontalDistance // Horizontal distance
│ ├── surfaceDistance // Surface distance
│ ├── area // Area
│ ├── height // Height
│ ├── angle // Angle
│ ├── slope // Slope
│ └── azimuth // Azimuth
├── analysis // Analysis tools
│ ├── viewshed // Viewshed
│ ├── viewshedArea // Area viewshed
│ ├── contour // Contour lines
│ ├── profile // Profile
│ ├── skyline // Skyline
│ ├── bufferAnalysis // Buffer
│ ├── elevationExtremum // Elevation extremum
│ ├── aspectAnalyse // Aspect
│ ├── slopAnalyse // Slope analysis
│ ├── cutFill // Cut and fill
│ └── flattenAnalysis // Flatten
├── drawing // Drawing tools
│ ├── point // Point
│ ├── polyline // Polyline
│ ├── polygon // Polygon
│ └── circle // Circle
└── military // Military plotting
├── FineArrow // Fine arrow
├── StraightArrow // Straight arrow
└── ... // More plotting tools
Usage Pattern
All tools follow a unified lifecycle:
// 1. Create tool (pass in viewer)
const tool = new DMap3D.measurement.spaceDistance(viewer, options)
// 2. Activate tool
tool.activate()
// 3. User interaction (left-click to operate, right-click to finish)
// 4. Clear results
tool.clear()
// 5. Destroy tool
tool.destroy()
Resource Cleanup
In Cesium and DMap3D, properly cleaning up resources is very important:
useEffect(() => {
const viewer = new Cesium.Viewer(container)
const tool = new DMap3D.measurement.area(viewer)
return () => {
// Destroy tool first
tool.destroy()
// Then destroy Viewer
viewer.destroy()
}
}, [])
If destroy() is not called, Cesium's WebGL context and event listeners will not be released, causing severe memory leaks.
Next Steps
After mastering the basic concepts, you can dive deeper into:
- API Documentation - View detailed parameters for all tools
- Examples - Complete code examples for each feature
- Measurement Tools - Start with distance measurement
- Drawing Tools - Learn interactive drawing