Files
bps-schema/docs/multiscale-hbjson-extension.md

350 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 基于 HBJSON 扩展多尺度数据模型:方案设计
> 日期:2026-05-28
> 来源:HBJSON Schema 分析与多尺度扩展讨论
---
## 一、背景
HBJSON(Honeybee Schema)是 Ladybug Tools 生态中建筑单体性能模拟的标准数据交换格式。它以 Room → Face → Aperture/Door 的层级结构表达建筑三维几何,并通过 `properties` 扩展点挂载 EnergyPlus/Radiance/DOE-2 的模拟参数。
本课题"多尺度绿色性能云端模拟"需要在建筑单体之上,覆盖社区和城市尺度的模拟需求。本文先解读 HBJSON 结构,再分析 Ladybug Tools 现有方案(Dragonfly)的能力与局限,最后提出多尺度扩展方案。
---
## 二、HBJSON Schema 结构解读
### 2.1 整体文件结构
HBJSON 是一个自包含的 JSON 文件,由一个顶层 `Model` 对象统领所有数据。文件不依赖外部引用,所有几何、构造、材料、负荷、时间表均内嵌或通过 identifier 引用。
### 2.2 顶层 Model 对象
`Model` 是文件的根节点,核心字段如下:
| 字段 | 类型 | 说明 |
|---|---|---|
| `type` | string | 固定为 `"Model"` |
| `version` | string | Schema 版本号,格式 `x.y.z` |
| `rooms[]` | Room[] | 建筑房间列表,每个 Room 是一个封闭三维空间 |
| `orphaned_faces[]` | Face[] | 无父 Room 的面(不可用于能耗模拟导出) |
| `orphaned_apertures[]` | Aperture[] | 无父 Face 的窗 |
| `orphaned_doors[]` | Door[] | 无父 Face 的门 |
| `orphaned_shades[]` | Shade[] | 无父对象的独立遮阳 |
| `shade_meshes[]` | ShadeMesh[] | 网格遮阳(周边建筑、地形) |
| `units` | enum | 几何单位:`Meters` / `Millimeters` / `Feet` / `Inches` / `Centimeters` |
| `tolerance` | float | 顶点容差(米制默认 0.01),用于几何容差检查 |
| `angle_tolerance` | float | 角度容差(默认 1.0 度),用于共线/共面检查 |
| `properties` | ModelProperties | 模型级扩展属性(Energy / Radiance / DOE-2) |
### 2.3 几何层级与嵌套关系
几何对象按严格的层级嵌套:
```
Model
├── rooms[]
│ ├── faces[] ← 包围 Room 的面(≥4 个形成封闭体积)
│ │ ├── apertures[] ← 窗(开洞,透光)
│ │ │ ├── indoor_shades[] ← 室内遮阳(窗帘、窗台)
│ │ │ └── outdoor_shades[] ← 室外遮阳(百叶、格栅)
│ │ ├── doors[] ← 门
│ │ ├── indoor_shades[]
│ │ └── outdoor_shades[] ← 室外遮阳(阳台、挑檐)
│ ├── indoor_shades[] ← 室内家具/隔断
│ └── outdoor_shades[] ← 室外树木/景观
└── shade_meshes[] ← 独立网格遮阳
```
各对象核心字段:
- `Room`:`faces[]`(面列表)、`multiplier`(标准层复用系数)、`zone`(热区标识)、`story`(楼层标识)、`exclude_floor_area`(是否排除楼板面积)
- `Face`:`face_type`(`Wall` / `Floor` / `RoofCeiling` / `AirBoundary`)、`boundary_condition`(边界条件)
- `Aperture` / `Door`:`is_operable`(可开启)、`is_glass`(玻璃门)
- `Shade`:`is_detached`(是否脱离主体)
### 2.4 几何原语
所有 3D 几何基于以下原语构建:
**Point3D**:三维坐标点
```json
{ "type": "Point3D", "x": 0.0, "y": 0.0, "z": 0.0 }
```
**Face3D**:平面多边形(Face/Aperture/Door 的几何基础)
```json
{
"type": "Face3D",
"boundary": [[x,y,z], [x,y,z], ...], // 外轮廓顶点,≥3 个
"holes": [[...], ...], // 孔洞轮廓(可选)
"plane": { "n": [0,0,1], "o": [0,0,0] } // 法线 + 原点(可选,自动推导)
}
```
**Mesh3D**:三角/四边形网格(ShadeMesh 的几何基础)
```json
{
"type": "Mesh3D",
"vertices": [[x,y,z], ...], // 顶点池
"faces": [[0,1,2], [1,3,2]], // 面索引(3 或 4 个索引)
"colors": [{ "r":255, "g":0, "b":0, "a":255 }] // 顶点/面着色(可选)
}
```
### 2.5 边界条件(Boundary Conditions)
Face 的 `boundary_condition` 字段定义面与外部环境的关系,共 5 种类型:
| 类型 | 适用场景 | 核心参数 |
|---|---|---|
| `Outdoors` | 外表面暴露于室外 | `sun_exposure`、`wind_exposure`、`view_factor`(对地视角系数) |
| `Surface` | 与另一表面对接 | `boundary_condition_objects`(相邻对象 identifier 列表,Face 为 2 个,SubFace 为 3 个) |
| `Ground` | 接地面 | 无附加参数 |
| `Adiabatic` | 绝热面(相邻空间温湿度相同) | 无附加参数 |
| `OtherSideTemperature` | 给定外侧温度边界 | `heat_transfer_coefficient`(W/m²K)、`temperature`(℃) |
约束:`AirBoundary` 类型的 Face **必须**有 `Surface` 边界条件,校验器会强制检查。
### 2.6 Abridged(简写)模式
HBJSON 的核心设计特征。每个 properties 对象均有两种形态:
| 模式 | 结构 | 用途 |
|---|---|---|
| `XXXProperties` | 内嵌完整对象(含所有 Material、Construction 定义) | 运行时内存对象 |
| `XXXPropertiesAbridged` | 仅存 identifier 字符串引用 | 序列化到 JSON 文件 |
工作机制:
```
Room.properties.energy.construction_set: "Generic2005Construction"
│
▼
Model.properties.energy.construction_sets: [
{ "identifier": "Generic2005Construction",
"wall_construction": "WallCons_Generic", ... }
]
Model.properties.energy.constructions: [
{ "identifier": "WallCons_Generic", "layers": ["mat_1", "mat_2"] }
]
Model.properties.energy.materials: [
{ "identifier": "mat_1", "type": "EnergyMaterial", ... }
]
```
这种"外键引用"模式避免了几何层级的循环嵌套,大幅减小文件体积,是处理大型建筑模型的关键优化。
### 2.7 扩展属性系统(Properties Extension)
每个几何层级都通过 `properties` 字段挂载多引擎数据,采用插件式架构:
```
properties:
├── energy — EnergyPlus(构造、负荷、HVAC、时间表)
├── radiance — Radiance(材质、动态遮阳状态、传感器网格)
└── doe2 — DOE-2(历史兼容)
```
各层级的 Energy 属性举例:
- `Model` 级:`constructions[]`、`materials[]`、`programs[]`(使用模式)、`schedules[]`、`hvacs[]`
- `Room` 级:`construction_set`(引用)、`program_type`(引用)、`hvac`(引用)、`shw`(引用),以及逐条覆盖的 `people`、`lighting`、`equipment`、`infiltration`、`ventilation`、`setpoint`
- `Face` 级:`construction`(引用)、`vent_crack`(AirflowNetwork 裂缝)
- `Aperture` 级:`construction`(引用)、`vent_opening`
- `Shade` 级:`construction`(引用)、`transmittance_schedule`(透射率时间表)、`pv_properties`(光伏)
### 2.8 标识符与元数据
所有对象继承 `IDdBaseModel`,统一标识规范:
| 字段 | 约束 | 说明 |
|---|---|---|
| `identifier` | `^[.A-Za-z0-9_-]+$`,1-100 字符 | 唯一标识,序列化/引用/跨引擎传递均使用此字段 |
| `display_name` | 无限制 | 仅用于 UI 展示,可含中文、空格、特殊字符 |
| `user_data` | 可选字典 | 用户自定义附加数据,键值需为基本类型 |
### 2.9 容差机制
HBJSON 通过两个参数处理 CAD 几何导入时的浮点误差:
- `tolerance`(距离容差):顶点坐标差值小于此值视为重合,用于封闭体积检查、法线校正
- `angle_tolerance`(角度容差):边方向夹角小于此值视为共线,用于冗余顶点清理
EnergyPlus 要求几何单位为米且封闭体积,因此 `units: "Meters"` + 合理的 `tolerance` 是导出成功的必要条件。
---
## 三、Ladybug Tools 现有方案:Dragonfly
Dragonfly 是 Ladybug Tools 生态中面向社区/城市尺度的独立项目,schema 定义在 `dragonfly-schema`。
### 3.1 Dragonfly 层级结构
```
Dragonfly Model
├── buildings[]
│ ├── unique_stories[]
│ │ ├── room_2ds[] ← 2D 楼层板 + 参数化立面
│ │ └── multiplier ← 标准层复用
│ ├── room_3ds[] ← 可选的完整 Honeybee Room(3D)
│ └── roof ← 屋顶几何
├── context_shades[] ← 周边建筑/地形(Face3D / Mesh3D)
├── units / tolerance / angle_tolerance
└── properties ← Energy / Radiance / DOE-2 / Comparison
```
### 3.2 Dragonfly 与 Honeybee 的关系
```
Dragonfly (社区/城市尺度)
│ 几何: 2D 楼层板 + 参数化窗户/遮阳/屋顶
│ ↓ translate_to_honeybee()
▼
Honeybee (建筑单体尺度)
│ 几何: 完整 3D Face3D
│ ↓ to_idf() / to_rad()
▼
EnergyPlus / Radiance
```
关键事实:Dragonfly 不是 HBJSON 的"上层扩展",而是一个**独立的 schema**,通过 `translate_to_honeybee()` 降维生成 HBJSON。
### 3.3 Dragonfly 的能力与局限
| 尺度 | 能力 | 局限 |
|---|---|---|
| 建筑单体 | Room2D(2D 楼板+参数化立面)→ 可转 Honeybee | 非 3D 精确几何 |
| 建筑群 | Building 列表 + ContextShade | 仅遮阳关系,无交互 |
| 社区 | 多 Building + reference_vector 定位 | 无管网/微气候/能源系统 |
### 3.4 缺失层(社区 → 城市之间)
- **区域能源系统**(District Energy)——冷热源站、管网拓扑、换热站
- **场地要素**——道路、绿地、水体、地形
- **微气候**——UHI(城市热岛)、风环境耦合
- **城市尺度**——土地利用分区、交通、人口密度
- **跨建筑交互**——阴影投射、反射辐射、废热排放
---
## 四、扩展方案对比
### 4.1 方案对比
| 方案 | 核心思路 | 优势 | 劣势 |
|---|---|---|---|
| 一:HBJSON 之上增加 Site 层 | 包裹 MultiScaleModel,内嵌 HBJSON | 完全向后兼容,单文件云端模拟 | 文件体积较大 |
| 二:扩展 Dragonfly properties | 在 Dragonfly Model 增加城市扩展 | 与 Ladybug Tools 原生兼容 | Room2D 几何精度不足,HBJSON 反向映射不完美 |
| 三:独立格式 + HBJSON 引用 | CityModel 引用外部 hbjson 文件 | 解耦,可版本控制 | 多文件依赖,不适合云端一键模拟 |
### 4.2 推荐方案:方案一的增强版
在 HBJSON 之上增加 `MultiScaleModel` 容器,保持 HBJSON 结构不变,新增 Site 和 Urban 层级。
设计原则:
1. 完全向后兼容——`sites[].buildings[]` 是标准 HBJSON Model,现有工具无需修改
2. 增量扩展——只增加 Site 和 Urban 两个新层级
3. 可分级模拟——可只取一个 Site 做社区模拟,也可取全部做城市模拟
---
## 五、MultiScaleModel Schema 设计
### 5.1 顶层结构
```json
{
"type": "MultiScaleModel",
"version": "0.1.0",
"units": "Meters",
"tolerance": 0.01,
"sites": [...],
"properties": { "urban": {...} }
}
```
### 5.2 Site 结构(社区/街区尺度)
```
Site
├── identifier ← 场地标识
├── boundary ← 2D 边界 [[x,y], ...]
├── buildings[] ← HBJSON Model(内嵌)
├── context_shades[] ← 周边建筑/地形
│
├── terrain ← 地形
│ ├── type: "Grid" | "TIN"
│ └── data ← 高程网格或三角网
│
├── infrastructure ← 基础设施
│ ├── roads[] ← 道路中心线 + 断面
│ ├── green_spaces[] ← 绿地(Face3D + 植被类型)
│ └── water_bodies[] ← 水体
│
├── district_energy ← 区域能源系统
│ ├── plants[] ← 源站(CHP、地源热泵、锅炉房)
│ │ ├── type, capacity, cop, fuel_type
│ │ └── location [x, y, z]
│ ├── networks[] ← 管网
│ │ ├── type: "CHW" | "HW" | "Steam"
│ │ ├── pipes[] ← 管段(起点、终点、管径、保温)
│ │ └── supply_temp, return_temp
│ └── connections[] ← 建筑-管网接入
│ ├── building_ref, network_ref, flow_rate
│
└── properties
├── energy
└── microclimate ← 微气候
├── uhi_model ← 热岛强度参数
└── wind_model ← 风场参数
```
### 5.3 Urban 结构(城市尺度)
```
properties.urban
├── climate_zones[] ← 气候分区
├── land_use[] ← 用地性质
└── schedule ← 城市级时间表(交通、人口)
```
---
## 六、关键技术决策
| 决策点 | 推荐 | 理由 |
|---|---|---|
| 建筑几何引用 | 内嵌 HBJSON | 保持与 HBJSON 自包含格式的一致性,减少解析复杂度;多文件方案需额外处理文件依赖和版本一致性 |
| 几何精度 | 社区用 Dragonfly Room2D,城市用简模 | 城市尺度不需要 Face 级精度,简化计算 |
| 微气候耦合 | 参数化而非 CFD | CFD 耦合计算量过大,用 UHI 修正系数 |
| 区域能源 | 拓扑网络 + 简化水力模型 | 不需要详细水力计算,关注热平衡 |
| 向后兼容 | 完全保留 HBJSON 结构 | 现有 honeybee 工具链零修改 |
---
## 七、下一步:新增 community/urban 尺度实体
当前 `schema-building.json` 已完全对齐 HBJSON(建筑单体几何尺度)。社区和城市尺度的实体定义需要新建独立的 `schema-community.json` / `schema-urban.json`,不应直接混入 schema-building.json,以保持与 HBJSON 的严格兼容。
除几何外,各模拟领域均已独立建库,且按尺度拆分:
- 建筑尺度:`schema-building.json`(几何)/ `schema-energy.json` / `schema-radiance.json` / `schema-cfd.json`
- 社区尺度:`schema-community.json`(几何)/ `schema-community-energy.json` / `schema-community-cfd.json` / `schema-community-microclimate.json`
- 城市尺度:`schema-urban.json`(几何)/ `schema-urban-energy.json` / `schema-urban-cfd.json`
新增实体规划:
| 层级 | 文件 | 实体 |
|---|---|---|
| Site 几何 | `schema-community.json` | Site / TerrainGrid / TerrainTIN / Road / GreenSpace / WaterBody |
| 区域能源 | `schema-community-energy.json` | DistrictEnergy / Plant / Network / Pipe / BuildingConnection |
| 社区 CFD | `schema-community-cfd.json` | CommunityCFDSettings / WindProfile / CFDDomain / Mesh / Turbulence |
| 微气候 | `schema-community-microclimate.json` | MicroClimate |
| 城市几何 | `schema-urban.json` | ClimateZone / LandUse |
| 城市能源 | `schema-urban-energy.json` | UrbanEnergyDemand / RenewablePotential / UrbanEnergyBalance |
| 城市 CFD | `schema-urban-cfd.json` | UrbanCFDSettings / WindComfortAssessment |
MultiScaleModel 作为顶层容器,通过引用方式关联三个尺度:
- `sites[].buildings[]` → 引用 bps/building 的 HBJSON Model
- `sites[].terrain/infrastructure` → 由 bps/community 定义
- `properties.urban` → 由 bps/urban 定义