共计 1855 个字符,预计需要花费 5 分钟才能阅读完成。
三维建筑数据准备
- 常见数据来源
- 开放数据平台:如 OpenStreetMap、各城市地理信息公共服务平台提供的建筑轮廓数据(Geojson/Shapefile 格式)
- BIM 模型:需通过 ArcGIS Pro 转换为 Multipatch 格式
-
无人机倾斜摄影:使用 Drone2Map 生成 LAS 点云后提取建筑高度

-
格式转换技巧
- 使用
arcgis-js-api的esri/geometry/support/jsonUtils转换 Geojson 为 ArcGIS Geometry - 通过
FeatureLayer.applyEdits()将 Shapefile 批量写入 FeatureService - 建筑高度字段建议命名为
height或elevation,确保与 ExtrudeSymbol3D 兼容
SceneView 核心配置
const view = new SceneView({
container: 'viewDiv',
map: new Map({basemap: 'satellite'}),
// 关键参数
environment: {
lighting: {
directShadowsEnabled: true, // 启用阴影
date: new Date('2023-06-21T12:00') // 光照时间
},
atmosphereEnabled: false // 大气效果开关
},
qualityProfile: 'high', // 画质模式
camera: {position: [经度, 纬度, 1500], // 初始视角
tilt: 75 // 倾斜角度
}
});
建筑体块生成代码
// 1. 创建 FeatureLayer
const buildingsLayer = new FeatureLayer({
url: '建筑要素服务 URL',
renderer: new SimpleRenderer({
symbol: new ExtrudeSymbol3D({
symbolLayers: [{
type: 'fill',
material: {color: '#F5F5F5'}, // 基础材质
edges: {
type: 'solid',
color: [100, 100, 100], // 边界线颜色
size: 0.5 // 线宽(px)
}
}],
// 高度映射(使用属性字段或固定值)verticalOffset: {
screenLength: 40,
maxWorldLength: 200
},
castShadows: true // 投射阴影
})
}),
elevationInfo: {
mode: 'relative-to-ground', // 高程模式
offset: 0 // 基准偏移
}
});
// 2. 添加到地图
map.add(buildingsLayer);
LOD 与性能优化
- 分级加载策略
- 设置
FeatureLayer.levelOfDetail控制不同缩放层级的显示细节 -
使用
BuildingSceneLayer替代 FeatureLayer 处理超大规模数据 -
WebGL 优化
- 启用
view.watch('stationary', callback)仅在相机静止时渲染 -
通过
Ground.navigationConstraint限制最低视角避免穿模 -
内存管理
- 对超过 1 万栋建筑的场景启用
FeatureLayer.disablePopup减少 DOM 节点 - 使用
LayerView.whenLayerView延迟加载非可视区域数据
生产环境常见问题
- 坐标系问题
- WGS84 与 Web 墨卡托转换:使用
esri/geometry/support/webMercatorUtils模块 -
国内 GCJ02 坐标偏移:需提前用第三方库纠偏
-
纹理优化
- 将贴图尺寸压缩为 1024×1024 以下
-
使用
MeshTexture.transformUV实现重复贴图 -
性能瓶颈
- 控制同时显示的要素数量(建议单批次≤5000 个)
- 对建筑群使用
FeatureLayer.featureReduction聚合显示
动手实践
- 下载本地行政区建筑轮廓数据(建议从市级地理信息平台获取)
- 使用 ArcGIS Online 内容管理器上传为 Hosted Feature Layer
- 修改本文示例代码中的服务 URL 指向你的图层
- 尝试添加不同颜色区分住宅 / 商业建筑(通过
valueExpression设置)
调试技巧 :按 F12 打开浏览器开发者工具,在 Console 输入
view.performanceInfo可查看实时渲染性能数据。建议将帧率维持在 30fps 以上为合格标准。
通过本文介绍的方法,开发者可以快速构建包含数千栋建筑的三维城市场景。实际项目中还需结合具体业务需求,考虑添加点击交互、属性查询等功能扩展。
正文完
发表至: 地理信息系统
近一天内

