三维地理信息系统(3D GIS)是数字孪生、智慧城市和自动驾驶仿真等领域的核心基础平台。与传统二维 GIS 相比,三维 GIS 不仅要处理海量空间数据,还需在 Web 端实现流畅的 3D 渲染、动态数据更新和复杂空间分析。本文从架构设计视角出发,围绕 Cesium 与 WebGL 渲染引擎、3D Tiles 数据规范、空间数据库(PostGIS + 3D Tiles 扩展) 以及 空间分析服务(GeoServer + 自定义 API) 四个核心模块,完整呈现一个三维 GIS 平台从底层数据到前端可视化的全链路实现。
现代三维 GIS 平台通常采用 五层架构,实现数据、逻辑和表现的分离:
层级 | 功能 | 核心技术 |
|---|---|---|
数据层 | 存储原始空间数据(矢量、栅格、倾斜摄影、BIM) | PostgreSQL/PostGIS, 3D Tiles, S3 对象存储 |
服务层 | 提供瓦片服务、地形服务和空间分析 API | Cesium Ion, GeoServer, 自研微服务 |
逻辑层 | 空间计算、坐标转换、数据融合 | GDAL, JTS, Turf.js, 自定义算法 |
渲染引擎 | 3D 场景构建、WebGL 渲染、实时光照 | Cesium.js, Three.js, WebGL 2.0 |
应用层 | 业务应用(智慧城市、管线管理、应急指挥) | Vue/React + Cesium 组件封装 |
该架构的核心优势在于数据与可视化解耦——底层数据变化可通过事件机制自动驱动前端更新,无需重新发布。
三维 GIS 数据量可达 TB 级,必须通过 分层分块(LOD)和空间索引提升加载效率。3D Tiles 是当前事实标准,其核心是 tileset.json 文件,描述了瓦片树的层级结构。
我们使用 pg2b3dm 工具将 PostGIS 中存储的建筑矢量数据转换为 3D Tiles 格式,并生成空间索引:
sql
-- PostgreSQL 中创建三维几何列(含高度)
CREATE TABLE buildings (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
geom GEOMETRY(POLYGON, 4326), -- 底面 footprint
height FLOAT, -- 建筑高度(米)
roof_type VARCHAR(20)
);
-- 创建空间索引加速查询
CREATE INDEX idx_buildings_geom ON buildings USING GIST(geom);
-- 生成 3D Tiles 属性信息(将几何和高度组合为三维体)
WITH tile_data AS (
SELECT
id,
name,
ST_AsMVTGeom(
ST_Extrude(ST_Force3D(geom), 0, 0, height), -- 挤出为三维体
ST_MakeEnvelope(116.3, 39.8, 116.5, 40.0, 4326)
) AS geom,
height
FROM buildings
)
SELECT ST_AsMVT(tile_data, 'buildings') FROM tile_data;前端通过 Cesium3DTileset 加载 tileset.json,Cesium 根据相机距离动态调度不同 LOD 级别的瓦片,实现 “一亿级三角面片流畅加载”。
Cesium 是当前最成熟的开源三维地球引擎。我们对默认配置进行定制,适配业务场景:
// 初始化 Cesium Viewer(带自定义配置)
const viewer = new Cesium.Viewer('cesiumContainer', {
terrainProvider: Cesium.createWorldTerrain({
requestWaterMask: false,
requestVertexNormals: false
}),
imageryProvider: new Cesium.ArcGisMapServerImageryProvider({
url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer'
}),
baseLayerPicker: false,
animation: false, // 关闭动画控件
timeline: false, // 关闭时间轴
infoBox: false, // 关闭默认信息框
sceneModePicker: false,
selectionIndicator: false,
// 性能相关
targetFrameRate: 60,
resolutionScale: window.devicePixelRatio > 1 ? 0.8 : 1.0
});
// 自定义相机视角(俯仰角、范围)
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(116.391, 39.913, 5000),
orientation: {
pitch: Cesium.Math.toRadians(-35),
roll: 0.0
},
duration: 2.0,
complete: () => console.log('Camera reached target')
});
// 加载 3D Tiles 建筑数据
const tileset = new Cesium.Cesium3DTileset({
url: 'https://cdn.my-gis.com/tilesets/buildings/tileset.json',
maximumScreenSpaceError: 4, // 控制 LOD 切换敏感度
maximumNumberOfLoadedTiles: 500,
dynamicScreenSpaceError: true,
dynamicScreenSpaceErrorDensity: 0.5
});
viewer.scene.primitives.add(tileset);性能优化要点:
maximumScreenSpaceError 降低 LOD 切换频率,减少 GPU 负载。dynamicScreenSpaceError 使远处瓦片自动降低分辨率。三维 GIS 的核心价值在于空间分析,如 视域分析、通视分析、缓冲区分析。我们编写 Node.js 微服务,调用 Turf.js 进行几何计算,并通过 WebSocket 将结果实时推送前端。
服务端(Node.js + Turf):
const express = require('express');
const turf = require('@turf/turf');
const app = express();
// 缓冲区分析 API
app.post('/api/buffer', (req, res) => {
const { lng, lat, radius } = req.body;
const point = turf.point([lng, lat]);
const buffered = turf.buffer(point, radius, { units: 'meters' });
res.json(buffered);
});
// 视域分析(模拟)
app.post('/api/viewshed', (req, res) => {
const { observer, targets } = req.body; // observer: {lng, lat, height}
const result = targets.map(target => {
// 模拟视线遮挡(实际需结合 DEM 数据)
const distance = turf.distance(
turf.point([observer.lng, observer.lat]),
turf.point([target.lng, target.lat])
);
return { target, visible: distance < 2000 };
});
res.json(result);
});前端联动:
// 用户点击地图,触发缓冲区分析
viewer.screenSpaceEventHandler.setInputAction((click) => {
const cartesian = viewer.camera.pickEllipsoid(click.position);
if (cartesian) {
const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
const lng = Cesium.Math.toDegrees(cartographic.longitude);
const lat = Cesium.Math.toDegrees(cartographic.latitude);
// 调用分析 API
fetch('/api/buffer', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ lng, lat, radius: 500 })
})
.then(res => res.json())
.then(geojson => {
// 将 GeoJSON 渲染为 Cesium 多边形
const entity = viewer.entities.add({
polygon: {
hierarchy: geojson.geometry.coordinates[0].map(coord =>
Cesium.Cartesian3.fromDegrees(coord[0], coord[1])
),
material: Cesium.Color.RED.withAlpha(0.3),
outline: true,
outlineColor: Cesium.Color.RED
}
});
});
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);真实场景需融合多种数据源。对于倾斜摄影(OSGB 格式),使用 osg2cesium 工具转换为 3D Tiles;BIM 模型(IFC 格式)则通过 CesiumIon 上传或使用 ifc-to-3dtiles 转换。在 Cesium 中,可同时加载多个 tileset,并设置 show 属性实现图层切换。
三维 GIS 平台的建设是跨学科、跨技术栈的系统工程。本文从实际架构出发,完整覆盖了从 PostGIS 数据存储、3D Tiles 瓦片生成、Cesium 渲染引擎定制,到空间分析微服务与前端交互的全链路实现。该架构已在多个智慧城市项目中验证,支持数十 GB 级数据流畅运行。
未来的三维 GIS 将更紧密地结合 实时 IoT 数据流(如无人机轨迹、传感器监测)和 AI 空间推理(如自动识别建筑变化)。建议在此基础上探索 WebSocket 实时数据推送和 GPU 加速的空间分析,进一步提升平台的智能化和响应能力。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。