【数字孪生系列】数字孪生引擎中的地标建筑管理系统

Source

在这里插入图片描述

针对数字孪生引擎中的地标建筑管理需求,我设计了一个模块化、可扩展的解决方案,方便后续二次开发和集成。该方案提供了地标建筑的数据模型、存储管理、生成机制和扩展接口。

解决方案概述

  1. 数据模型:定义地标建筑的核心属性和特征
  2. 存储管理:使用SQLite进行元数据管理,文件系统存储3D模型
  3. 生成机制:支持随机生成、模板创建和外部导入
  4. API接口:提供完整的CRUD操作和查询功能
  5. 扩展机制:支持新建筑类型和自定义属性

实现代码

下面是完整的实现代码,包含了核心数据模型、管理类和示例用法:

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 = name
        self.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 = path
        self.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_dict


class 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_dict


class Bridge(BaseLandmark):
    """桥梁类,继承自地标基类"""
    
    def __init__(self, name: