JUPYTER / PYTHON / DATA-DRIVEN DESIGN

地震:数据转译

2025–26 / Bartlett School 设计项目 · 数据驱动设计

地震:数据转译

Earthquake: Data into Space

Jupyter × Python × Blender × Processing 协同设计

以地震为主题,将图像中的视觉特征、文本中的叙事信号与地球物理记录转化为可计算的设计变量。在 Jupyter 中完成采集、清洗、分析与融合,再用 Python 将这些变量映射为 Blender 的建筑碎片、地表裂隙与动态场景,最终在 Processing 中转化为粒子、波纹与实时反馈。

我的职责
Python 数据处理、参数映射与空间可视化
完成阶段
多源分析、程序建模与实时可视化
01

从数据到设计的工作流

如何让地震数据成为空间形态与动态行为的生成规则?

地震通常通过统计、照片或新闻被理解,每种媒介都呈现不同的信息。本项目把这些信息转化为可处理的特征,再建立清晰的参数接口,让数据分析、程序建模和实时可视化在不同工具之间衔接。

240清洗后的图像
232新闻标题与摘要
240融合设计样本
20空间场景实例
  1. 01 / Jupyter · Python

    采集与清洗

    处理图像、文本与地震记录,去重、清洗并建立结构化表格。

  2. 02 / Python

    分析与融合

    提取特征,完成标准化、聚类与降维,输出统一设计参数。

  3. 03 / Blender · Python

    规则与空间

    将参数转化为建筑碎片、地表位移、裂隙、波纹与烟尘。

  4. 04 / Processing

    行为与反馈

    逐条读取记录,驱动粒子释放、波纹传播与数据面板。

最终空间场:同一组规则生成可比较的不同实例。
02

图像采集与视觉特征

通过 icrawler 获取建筑坍塌、城市废墟与救援相关图像,再清除无效文件并使用图像哈希去重。保留的 240 张图像由 OpenCV 与 PIL 处理,提取平均亮度、灰度对比度和 Canny 边缘密度。

图像样本拼贴:从视觉参考转向可计算特征。
亮度分布
边缘密度分布
视觉破碎程度的近似参数

把边缘密度、对比度和暗度组合为 damage_proxy,作为形态破碎程度的设计线索。这个指标是视觉特征的近似组合;它不等于实际建筑损伤等级。特征标准化后使用 K-means 分为四组,再通过 PCA 查看样本的分布。

四组样本数量:71 / 54 / 78 / 37。
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,为后续碎片密度和空间复杂度提供补充信号。

人物检测数量
物体检测数量
03

文本语义与叙事信号

获取地震相关新闻的标题与摘要,经过合并、去重与文本清洗,形成 232 条记录。提取 damage、death、rescue、collapse 等关键词;使用 TextBlob 的极性分数区分正向、中性与负向表达,将叙事内容转换为可以参与设计的变量。

新闻关键词频率
文本极性是语言表达的特征,并非受灾者真实情绪测量。

比较 Count Vectorizer 与 TF-IDF 的文本表示,使用 TF-IDF 特征进行四组 K-means 聚类,并以 PCA 展示二维分布。关键词为失稳和坍塌提供叙事线索,聚类与极性为形态差异和动态强度提供参数。

文本分组
语义特征的二维投影
04

地震记录与多源融合

引入 Significant Earthquakes, 1965–2016 数据集中的日期、震级、震源深度与经纬度。用 Pandas 清理无效记录,将不同量纲的变量归一化,建立可以跨工具读取的数值接口。

抽样记录的震级分布
震源深度与震级:用于观察变量范围与分布。

融合 Notebook 进一步引入灾害文本样本与卫星图块特征,比较 TF-IDF、Sentence-BERT 和图像特征的表示方式。降维后的特征与数值、情绪强度共同标准化,再进行五组 K-means 聚类。最终输出 240 条设计样本。

多源特征融合后的五组样本
经度、纬度与震级的三维预览
规则或模型生成的语义标签
灾害文本样本的关键词分布

数据组合的边界

图像与新闻分析是独立的数据分支。最终融合文件按样本组合地震记录、灾害文本与图像特征,并未建立同一事件的时间、地点匹配。情绪与破碎程度用于探索设计参数,这是一套数据驱动的生成实验。

05

Python 数据转译规则

数据转译的关键是把抽象的特征明确地交给设计工具。每个参数都有输入、映射方式与空间作用,CSV 成为 Jupyter、Blender 和 Processing 之间的接口。下方可以直接选择原始样本,查看震级、深度如何改变输出参数。

DATA → PARAMETERS

选择一条记录,查看它如何转化为设计参数

240 条设计样本
01002003004005006007005.566.577.588.59震源深度 / km震级 1965-04-27 / M 6.1 / 60 km1965-06-11 / M 5.6 / 35 km1965-07-29 / M 5.7 / 15 km1965-08-11 / M 7.6 / 30 km1965-09-01 / M 5.8 / 100 km1965-09-16 / M 6 / 160 km1965-10-07 / M 5.9 / 20 km1966-06-27 / M 5.6 / 115 km1966-08-17 / M 5.6 / 41.9 km1966-08-28 / M 5.7 / 170 km1967-03-19 / M 6.2 / 97.7 km1967-06-23 / M 5.8 / 90 km1968-07-05 / M 6.3 / 47 km1968-09-14 / M 6.2 / 25 km1968-12-14 / M 5.9 / 25 km1969-11-20 / M 5.7 / 15 km1970-02-07 / M 6 / 15 km1970-05-27 / M 5.9 / 10 km1970-05-29 / M 6 / 10 km1971-05-21 / M 5.6 / 27.5 km1972-01-22 / M 5.8 / 72.8 km1972-06-06 / M 5.5 / 47.5 km1972-08-20 / M 5.6 / 15 km1972-10-14 / M 5.9 / 35 km1972-12-18 / M 5.9 / 31.5 km1973-03-14 / M 5.8 / 64 km1973-06-17 / M 5.6 / 32 km1974-01-15 / M 5.6 / 114 km1974-02-03 / M 5.9 / 30 km1974-10-20 / M 5.7 / 43 km1974-11-02 / M 6.7 / 0 km1974-11-12 / M 5.8 / 54 km1974-11-19 / M 5.7 / 44 km1975-04-02 / M 5.6 / 33 km1975-07-08 / M 6.5 / 33 km1975-10-02 / M 5.8 / 75 km1976-03-28 / M 5.5 / 179 km1976-05-19 / M 5.8 / 72 km1976-05-22 / M 5.8 / 31 km1976-05-24 / M 5.7 / 33 km1976-06-08 / M 5.6 / 13 km1976-08-29 / M 5.6 / 33 km1976-09-25 / M 5.5 / 33 km1977-03-24 / M 5.5 / 35 km1977-04-20 / M 7.5 / 33 km1977-05-28 / M 5.9 / 54 km1977-08-29 / M 6.2 / 12 km1977-10-12 / M 5.6 / 33 km1977-11-21 / M 5.6 / 33 km1978-01-20 / M 5.8 / 51 km1978-06-27 / M 5.7 / 35 km1978-08-10 / M 6 / 10 km1979-01-11 / M 6.2 / 32 km1979-06-10 / M 6 / 10 km1979-06-24 / M 5.6 / 33 km1979-07-09 / M 5.5 / 11 km1979-11-04 / M 5.5 / 27 km1979-11-09 / M 5.5 / 564 km1979-11-13 / M 6.3 / 47 km1979-12-01 / M 5.5 / 10 km1980-04-16 / M 5.7 / 80 km1980-07-09 / M 5.9 / 37 km1981-08-17 / M 5.6 / 34.7 km1981-09-28 / M 5.7 / 33 km1981-10-17 / M 5.9 / 26 km1981-10-18 / M 6 / 0 km1981-10-18 / M 5.7 / 33 km1981-12-19 / M 7.2 / 10 km1982-02-21 / M 5.5 / 27 km1982-03-27 / M 5.5 / 73 km1982-07-04 / M 5.5 / 53.5 km1982-07-10 / M 5.5 / 10 km1982-07-20 / M 5.6 / 145.8 km1982-09-25 / M 5.5 / 42 km1982-12-28 / M 5.6 / 33 km1983-01-05 / M 5.6 / 33 km1983-01-18 / M 6.5 / 56 km1983-04-08 / M 6.7 / 10 km1983-04-12 / M 7 / 104.2 km1983-04-13 / M 5.9 / 33 km1983-06-24 / M 6.7 / 44.1 km1983-07-22 / M 5.6 / 41.3 km1984-03-01 / M 6 / 10 km1984-07-09 / M 5.5 / 10 km1984-09-01 / M 5.7 / 478.3 km1984-10-10 / M 5.6 / 10 km1984-11-15 / M 6.3 / 348.1 km1984-11-21 / M 6.4 / 23.4 km1985-03-18 / M 5.5 / 33 km1985-04-08 / M 5.9 / 47.7 km1985-06-01 / M 5.6 / 23.1 km1985-06-02 / M 5.8 / 370.2 km1985-06-03 / M 6.3 / 65.5 km1985-08-15 / M 5.6 / 10 km1986-07-20 / M 5.84 / 4.01 km1986-10-21 / M 5.7 / 33 km1986-11-06 / M 5.7 / 588.5 km1987-02-17 / M 5.7 / 33 km1987-04-25 / M 6.9 / 107 km1987-06-24 / M 5.8 / 33 km1987-10-06 / M 7.3 / 16 km1987-10-16 / M 7.4 / 47.8 km1987-11-24 / M 6.6 / 11.181 km1988-10-31 / M 5.6 / 12 km1988-11-23 / M 5.5 / 41.1 km1989-05-29 / M 5.6 / 32 km1989-08-14 / M 5.5 / 33 km1989-09-06 / M 5.6 / 10 km1989-11-04 / M 5.5 / 10 km1989-11-29 / M 6.3 / 70.8 km1989-12-01 / M 5.6 / 43.1 km1990-06-01 / M 6.3 / 67 km1990-11-23 / M 5.7 / 61.8 km1991-01-10 / M 5.7 / 22.6 km1991-12-26 / M 5.6 / 10 km1992-04-18 / M 5.5 / 32.1 km1992-04-24 / M 5.5 / 22.5 km1992-06-21 / M 6.2 / 10 km1992-07-17 / M 5.6 / 18.9 km1992-07-18 / M 5.5 / 30.8 km1992-08-12 / M 5.8 / 33 km1992-11-21 / M 5.9 / 65 km1992-11-24 / M 5.7 / 10 km1993-03-06 / M 6.6 / 18.2 km1993-04-19 / M 6.8 / 23.6 km1993-04-25 / M 6 / 33 km1993-05-25 / M 6.2 / 36.8 km1993-08-28 / M 5.9 / 132.8 km1993-09-15 / M 5.6 / 27.9 km1993-09-16 / M 5.5 / 33 km1993-09-21 / M 6 / 11 km1993-12-12 / M 5.6 / 21.9 km1994-02-12 / M 6.7 / 15 km1994-04-12 / M 5.5 / 30.9 km1994-05-25 / M 5.9 / 24.6 km1994-11-20 / M 6.3 / 16 km1995-03-22 / M 5.5 / 39 km1995-04-28 / M 5.5 / 9.2 km1995-07-13 / M 5.9 / 13.6 km1995-09-23 / M 6 / 27.1 km1995-11-30 / M 6.3 / 23.4 km1995-12-02 / M 6.6 / 18.1 km1995-12-03 / M 5.5 / 33 km1995-12-25 / M 6.1 / 14.8 km1996-01-30 / M 6.1 / 14.2 km1996-07-29 / M 5.5 / 74.3 km1997-02-04 / M 5.5 / 10 km1997-02-21 / M 6.1 / 33 km1997-08-08 / M 6.6 / 10 km1997-10-18 / M 5.5 / 35.6 km1997-11-10 / M 5.6 / 10 km1998-08-14 / M 5.8 / 57.6 km1998-09-09 / M 5.6 / 10 km1998-10-03 / M 6.2 / 226.6 km1999-08-18 / M 5.7 / 155 km1999-09-07 / M 5.5 / 10 km1999-11-01 / M 6.3 / 33 km2000-01-05 / M 5.5 / 33 km2000-02-25 / M 7.1 / 33 km2000-04-01 / M 5.6 / 608.1 km2000-06-14 / M 5.7 / 63 km2000-06-14 / M 5.9 / 196.5 km2000-09-14 / M 6.2 / 33 km2000-09-23 / M 5.5 / 125 km2000-10-20 / M 5.5 / 10 km2000-10-21 / M 5.9 / 10 km2000-11-16 / M 5.5 / 33 km2000-12-20 / M 5.5 / 33 km2001-02-24 / M 7.1 / 35 km2001-06-10 / M 5.6 / 33 km2001-06-14 / M 5.9 / 33 km2001-09-29 / M 6.4 / 33 km2001-10-08 / M 6.5 / 48.5 km2002-04-24 / M 6.2 / 10 km2002-05-08 / M 5.9 / 39 km2002-11-11 / M 5.7 / 539.9 km2003-01-07 / M 5.7 / 33 km2003-03-17 / M 5.8 / 10 km2003-07-25 / M 5.5 / 10 km2003-08-21 / M 5.9 / 20.2 km2004-06-10 / M 5.9 / 10 km2004-06-14 / M 5.9 / 10 km2004-07-10 / M 5.7 / 10 km2004-11-20 / M 6.4 / 16 km2004-11-23 / M 5.5 / 15.4 km2004-12-27 / M 5.6 / 19 km2004-12-29 / M 5.7 / 47.7 km2005-01-15 / M 5.5 / 25.7 km2005-03-19 / M 6.3 / 598.7 km2005-04-19 / M 5.5 / 18.7 km2005-07-11 / M 6 / 10 km2005-12-10 / M 5.6 / 506.5 km2006-06-09 / M 6.1 / 564.4 km2006-06-24 / M 6.3 / 26 km2006-06-27 / M 5.8 / 9 km2006-07-17 / M 5.5 / 10 km2006-07-19 / M 6.1 / 45 km2007-04-09 / M 5.8 / 36 km2007-04-21 / M 6.1 / 40.7 km2007-06-05 / M 5.7 / 10 km2007-10-25 / M 5.5 / 29.7 km2008-01-09 / M 6.1 / 10 km2008-02-13 / M 6.2 / 19 km2008-06-25 / M 5.7 / 16 km2008-10-03 / M 5.6 / 10 km2008-11-29 / M 6 / 386 km2008-12-20 / M 6.3 / 19 km2009-03-26 / M 5.9 / 159.5 km2009-09-05 / M 5.8 / 210.2 km2009-10-10 / M 6 / 112 km2009-11-12 / M 5.8 / 570.6 km2009-11-13 / M 5.8 / 608 km2010-01-12 / M 6 / 10 km2010-06-16 / M 7 / 18 km2010-06-29 / M 5.5 / 17 km2010-07-29 / M 6.6 / 618 km2010-10-09 / M 5.8 / 91 km2011-01-26 / M 6.1 / 23 km2011-02-05 / M 5.8 / 28.9 km2011-03-11 / M 5.5 / 4.7 km2011-03-11 / M 6.2 / 9.3 km2011-03-20 / M 5.7 / 321 km2011-05-24 / M 5.8 / 16 km2012-11-02 / M 5.5 / 9.1 km2013-02-07 / M 6.7 / 11 km2013-02-16 / M 6.1 / 105 km2013-03-31 / M 5.6 / 10 km2013-11-03 / M 5.9 / 532 km2013-11-13 / M 5.8 / 20 km2013-11-17 / M 7.7 / 10 km2014-02-03 / M 5.6 / 109 km2014-03-31 / M 5.6 / 114.5 km2014-06-19 / M 6.2 / 36 km2014-08-23 / M 5.6 / 100 km2014-11-29 / M 5.6 / 10 km2014-12-22 / M 5.8 / 14 km2015-09-21 / M 5.5 / 26.95 km2016-01-02 / M 5.8 / 585.47 km2016-01-31 / M 5.7 / 10 km2016-05-31 / M 5.9 / 18.37 km
分组 0分组 1分组 2分组 3分组 4
001 / 240
震级
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_norm1 + magnitude_norm × 4控制几何尺度与震动幅度
depth_normz = −depth_norm转化为垂直位移
longitude_norm / latitude_normx / y建立归一化空间坐标
emotion_intensityfragmentation / noise控制碎片化与扰动强度
emotion_labelrotation_chaos切换旋转与运动状态
cluster_idmaterial_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)
下载数值设计样本 CSV ↗
06

数据驱动的空间生成

在 Blender 中用 Python 导入数据,先从高度挤出与平面分布验证规则,再加入聚类密度、结构断裂、发光裂隙与震中波纹。以下保留报告中的五组完整模型视图,展示从直接映射到综合空间构成的演化。

01

直接挤出

先检验数值与高度之间的关系。

02

空间分布

将独立对象展开为可比较的空间场。

03

聚类与密度

以分组与密度差异形成局部结构。

04

碎片化与失稳

引入方向变化、断裂与不规则构造。

05

整合构成

将高度、密度、裂隙与波纹整合为同一场景。

从单一场景到多实例系统

在规则验证后,将 20 个不同参数组合放入网格中比较。每个实例包含建筑碎片、地表位移、裂隙、波纹、碎石和烟尘;数据共同影响场景的密度、变形与动态强度。

多实例场景:在共同规则下比较不同数据条件。
图像成为表面纹理,数据参数决定尺度与扰动。
查看 Blender Python 编程与场景记录
07

从空间到实时行为

把 Blender 导出的模型与 final_fusion_data.csv 带入 Processing。程序每 25 帧读取一条记录,以震级控制粒子数量、释放力度、颜色和波纹传播速度;震源深度与经纬度同步显示在数据面板中。自动旋转的场景让静态数据转变为可观察的时间过程。

完整动态序列:数据读取 → 能量释放 → 波纹扩张 → 粒子消散。

这个项目呈现的能力

用 Python 将不同来源的数据组织成可分析的表格;以特征提取、标准化、聚类和降维解释数据差异;把数值转化为可复用的空间规则,并通过 CSV 连接分析、建模、动画与实时反馈。

Jupyter / Pandas / NumPy / OpenCV / scikit-learn / Blender Python / Processing