【数字孪生系列】数字孪生引擎中的地标建筑管理系统
针对数字孪生引擎中的地标建筑管理需求,我设计了一个模块化、可扩展的解决方案,方便后续二次开发和集成。该方案提供了地标建筑的数据模型、存储管理、生成机制和扩展接口。
解决方案概述
- 数据模型:定义地标建筑的核心属性和特征
- 存储管理:使用SQLite进行元数据管理,文件系统存储3D模型
- 生成机制:支持随机生成、模板创建和外部导入
- API接口:提供完整的CRUD操作和查询功能
- 扩展机制:支持新建筑类型和自定义属性
实现代码
下面是完整的实现代码,包含了核心数据模型、管理类和示例用法:
import sqlite3
import os
import json
import uuid
from datetime import datetime
from typing import List, Dict, Optional, Type
import random# 确保必要的目录存在
os.makedirs("landmark_models", exist_ok=True)
os.makedirs("landmark_data", exist_ok=True)class BaseLandmark:"""地标建筑基类,定义通用属性和方法"""def __init__(self, name: str, latitude: float, longitude: float, height: float, architecture_style: str, year_built: int):self.id = str(uuid.uuid4()) # 唯一标识符self.name = nameself.latitude = latitude # 纬度self.longitude = longitude # 经度self.height = height # 高度(米)self.architecture_style = architecture_style # 建筑风格self.year_built = year_built # 建成年份self.created_at = datetime.now().isoformat()self.updated_at = datetime.now().isoformat()self.model_path = None # 3D模型路径self.metadata = {} # 额外元数据def to_dict(self) -> Dict:"""转换为字典表示,用于存储和传输"""return {"id": self.id,"type": self.__class__.__name__,"name": self.name,"latitude": self.latitude,"longitude": self.longitude,"height": self.height,"architecture_style": self.architecture_style,"year_built": self.year_built,"created_at": self.created_at,"updated_at": self.updated_at,"model_path": self.model_path,"metadata": self.metadata}def update_metadata(self, new_metadata: Dict):"""更新元数据"""self.metadata.update(new_metadata)self.updated_at = datetime.now().isoformat()def set_model_path(self, path: str):"""设置3D模型路径"""self.model_path = pathself.updated_at = datetime.now().isoformat()class Skyscraper(BaseLandmark):"""摩天大楼类,继承自地标基类"""def __init__(self, name: str, latitude: float, longitude: float, height: float, architecture_style: str, year_built: int,floors: int, has_observation_deck: bool = False):super().__init__(name, latitude, longitude, height, architecture_style, year_built)self.floors = floors # 楼层数self.has_observation_deck = has_observation_deck # 是否有观景台def to_dict(self) -> Dict:"""扩展基类的to_dict方法"""base_dict = super().to_dict()base_dict.update({"floors": self.floors,"has_observation_deck": self.has_observation_deck})return base_dictclass Monument(BaseLandmark):"""纪念碑类,继承自地标基类"""def __init__(self, name: str, latitude: float, longitude: float, height: float, architecture_style: str, year_built: int,material: str, dedicated_to: str):super().__init__(name, latitude, longitude, height, architecture_style, year_built)self.material = material # 建筑材料self.dedicated_to = dedicated_to # 纪念对象def to_dict(self) -> Dict:"""扩展基类的to_dict方法"""base_dict = super().to_dict()base_dict.update({"material": self.material,"dedicated_to": self.dedicated_to})return base_dictclass Bridge(BaseLandmark):"""桥梁类,继承自地标基类"""def __init__(self, name: