针对数字孪生引擎中的地标建筑管理需求,我设计了一个模块化、可扩展的解决方案,方便后续二次开发和集成。该方案提供了地标建筑的数据模型、存储管理、生成机制和扩展接口。
解决方案概述
- 数据模型:定义地标建筑的核心属性和特征
- 存储管理:使用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 = 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: