地震:数据转译
2025–26 / Bartlett School 设计项目 · 数据驱动设计
地震:数据转译
Earthquake: Data into Space
Jupyter × Python × Blender × Processing 协同设计
以地震为主题,将图像中的视觉特征、文本中的叙事信号与地球物理记录转化为可计算的设计变量。在 Jupyter 中完成采集、清洗、分析与融合,再用 Python 将这些变量映射为 Blender 的建筑碎片、地表裂隙与动态场景,最终在 Processing 中转化为粒子、波纹与实时反馈。
- 我的职责
- Python 数据处理、参数映射与空间可视化
- 完成阶段
- 多源分析、程序建模与实时可视化
从数据到设计的工作流
如何让地震数据成为空间形态与动态行为的生成规则?
地震通常通过统计、照片或新闻被理解,每种媒介都呈现不同的信息。本项目把这些信息转化为可处理的特征,再建立清晰的参数接口,让数据分析、程序建模和实时可视化在不同工具之间衔接。
- 01 / Jupyter · Python
采集与清洗
处理图像、文本与地震记录,去重、清洗并建立结构化表格。
- 02 / Python
分析与融合
提取特征,完成标准化、聚类与降维,输出统一设计参数。
- 03 / Blender · Python
规则与空间
将参数转化为建筑碎片、地表位移、裂隙、波纹与烟尘。
- 04 / Processing
行为与反馈
逐条读取记录,驱动粒子释放、波纹传播与数据面板。
图像采集与视觉特征
通过 icrawler 获取建筑坍塌、城市废墟与救援相关图像,再清除无效文件并使用图像哈希去重。保留的 240 张图像由 OpenCV 与 PIL 处理,提取平均亮度、灰度对比度和 Canny 边缘密度。
把边缘密度、对比度和暗度组合为 damage_proxy,作为形态破碎程度的设计线索。这个指标是视觉特征的近似组合;它不等于实际建筑损伤等级。特征标准化后使用 K-means 分为四组,再通过 PCA 查看样本的分布。
查看原始 Python 特征与聚类逻辑
df_img["darkness"] = 255 - df_img["brightness"]
df_img["damage_proxy"] = (
df_img["edge_density"] * 0.5
+ (df_img["contrast"] / df_img["contrast"].max()) * 0.3
+ (df_img["darkness"] / df_img["darkness"].max()) * 0.2
)
features = df_img[["brightness", "contrast", "edge_density", "damage_proxy"]]
X = StandardScaler().fit_transform(features)
df_img["cluster"] = KMeans(n_clusters=4, random_state=42).fit_predict(X)让人的存在进入数据
使用 YOLOv8 检测人物和物体,记录 person_count 与 total_objects,为后续碎片密度和空间复杂度提供补充信号。
文本语义与叙事信号
获取地震相关新闻的标题与摘要,经过合并、去重与文本清洗,形成 232 条记录。提取 damage、death、rescue、collapse 等关键词;使用 TextBlob 的极性分数区分正向、中性与负向表达,将叙事内容转换为可以参与设计的变量。
比较 Count Vectorizer 与 TF-IDF 的文本表示,使用 TF-IDF 特征进行四组 K-means 聚类,并以 PCA 展示二维分布。关键词为失稳和坍塌提供叙事线索,聚类与极性为形态差异和动态强度提供参数。
地震记录与多源融合
引入 Significant Earthquakes, 1965–2016 数据集中的日期、震级、震源深度与经纬度。用 Pandas 清理无效记录,将不同量纲的变量归一化,建立可以跨工具读取的数值接口。
融合 Notebook 进一步引入灾害文本样本与卫星图块特征,比较 TF-IDF、Sentence-BERT 和图像特征的表示方式。降维后的特征与数值、情绪强度共同标准化,再进行五组 K-means 聚类。最终输出 240 条设计样本。
数据组合的边界
图像与新闻分析是独立的数据分支。最终融合文件按样本组合地震记录、灾害文本与图像特征,并未建立同一事件的时间、地点匹配。情绪与破碎程度用于探索设计参数,这是一套数据驱动的生成实验。
Python 数据转译规则
数据转译的关键是把抽象的特征明确地交给设计工具。每个参数都有输入、映射方式与空间作用,CSV 成为 Jupyter、Blender 和 Processing 之间的接口。下方可以直接选择原始样本,查看震级、深度如何改变输出参数。
选择一条记录,查看它如何转化为设计参数
- 震级
- 6.1
- 震源深度
- 60.0 km
- 几何尺度
- 1.667 ×
- 垂直偏移
- -0.087
- 碎片化参数
- 0.600
- 材质分组
- 3
scale = 1 + magnitude_norm × 4
z = −depth_norm 数值直接读取原始 final_fusion_data.csv。分组包含数值、语义与图像特征;样本之间的组合用于设计实验,不表示同一地震事件的对应关系。
| 数据变量 | 映射规则 | 设计作用 |
|---|---|---|
magnitude_norm | 1 + magnitude_norm × 4 | 控制几何尺度与震动幅度 |
depth_norm | z = −depth_norm | 转化为垂直位移 |
longitude_norm / latitude_norm | x / y | 建立归一化空间坐标 |
emotion_intensity | fragmentation / noise | 控制碎片化与扰动强度 |
emotion_label | rotation_chaos | 切换旋转与运动状态 |
cluster_id | material_index | 选择材质或资产分组 |
查看原始 Python 映射与输出逻辑
fusion_df['x'] = fusion_df['longitude_norm']
fusion_df['y'] = fusion_df['latitude_norm']
fusion_df['z'] = -fusion_df['depth_norm']
fusion_df['scale'] = 1 + fusion_df['magnitude_norm'] * 4
fusion_df['fragmentation'] = fusion_df['emotion_intensity']
fusion_df['rotation_chaos'] = np.where(
fusion_df['emotion_label'].eq('panic'),
fusion_df['emotion_intensity'],
fusion_df['emotion_intensity'] * 0.4
)
fusion_df['material_index'] = fusion_df['cluster_id']
fusion_df.to_csv(OUTPUT_DIR / 'final_fusion_data.csv', index=False)数据驱动的空间生成
在 Blender 中用 Python 导入数据,先从高度挤出与平面分布验证规则,再加入聚类密度、结构断裂、发光裂隙与震中波纹。以下保留报告中的五组完整模型视图,展示从直接映射到综合空间构成的演化。
直接挤出
先检验数值与高度之间的关系。
空间分布
将独立对象展开为可比较的空间场。
聚类与密度
以分组与密度差异形成局部结构。
碎片化与失稳
引入方向变化、断裂与不规则构造。
整合构成
将高度、密度、裂隙与波纹整合为同一场景。
从单一场景到多实例系统
在规则验证后,将 20 个不同参数组合放入网格中比较。每个实例包含建筑碎片、地表位移、裂隙、波纹、碎石和烟尘;数据共同影响场景的密度、变形与动态强度。
查看 Blender Python 编程与场景记录
从空间到实时行为
把 Blender 导出的模型与 final_fusion_data.csv 带入 Processing。程序每 25 帧读取一条记录,以震级控制粒子数量、释放力度、颜色和波纹传播速度;震源深度与经纬度同步显示在数据面板中。自动旋转的场景让静态数据转变为可观察的时间过程。
这个项目呈现的能力
用 Python 将不同来源的数据组织成可分析的表格;以特征提取、标准化、聚类和降维解释数据差异;把数值转化为可复用的空间规则,并通过 CSV 连接分析、建模、动画与实时反馈。
Jupyter / Pandas / NumPy / OpenCV / scikit-learn / Blender Python / Processing

