beepboop2025/drug-price-observatory
GitHub: beepboop2025/drug-price-observatory
将 UNODC/INCB 等机构的全球毒品交易公开数据转化为交互式可视化的公共利益数据浏览器,适用于教育和研究目的。
Stars: 0 | Forks: 0
# 🌍 全球毒品价格观察站
这是一个具有教育意义且基于公共利益的**数据浏览器**,旨在让全球毒品交易数据变得*易于理解*。UNODC、INCB 和 EUDA 已经发布了街头(零售)价格、前体化学品价格以及走私流向/缉获量数据——但这些数据隐藏在大多数人难以阅读的密集 PDF 和 CSV 文件中。这个应用是一个构建于这些公共数据之上的**转换层**:通过清晰的图表、地图和通俗易懂的解释来呈现数据。
## 展示内容
- **街头价格** —— 各国的零售价格趋势,包含纯度调整视图和*可负担性*视角(价格以当地平均收入的购买天数来表示)。
- **前体流向与价格** —— 走私走廊和前体化学品价格,重点标示了源头枢纽(尤其是中国)。
- **流向地图** —— 采用等地球投影 (Equal-Earth) 的世界地图,展示了随时间动态变化的走廊弧线。
- **缅甸专题** —— 省级(金三角)详细信息:生产区域、跨境走廊城镇以及缉获量。
每个视图都附带自动生成的“简明英语 (In plain English)”说明语句,并包含悬停提示,以通俗易懂的方式解释每个数据。
## 截图
深色、以动态为主导的界面:WebGL 地球仪从前体走廊的源头枢纽(珊瑚色)追踪至中转和目的节点(青色),标题以逐字显现的方式展示,各部分随着你的滚动而弹入。这些沉浸式效果完全受 `prefers-reduced-motion` 控制,并在移动端或无 WebGL 的设备上回退为轻量级的 2D canvas。

**街头价格** —— 价格趋势 + 可负担性视角,包含简明英语摘要:

**流向地图** —— 前体走廊的等地球投影世界地图,按年份动态展示:

**缅甸专题** —— 省级金三角详细信息:

## 伦理规范(请阅读)
本工具报告的是**汇总的、已发布的统计数据** —— 国家级、年度数据,以及(针对重点地区的)省级数据 —— 严格用于**警示、教育和研究**。从设计上讲,它**不**提供销售点、实时、街头以下级别或可导航的位置数据,前体层仅存储**物流信息**(什么物品、数量、地点、管制状态),**不包含任何化学配方、合成路线或产出率**。它不是、也绝不能被用作获取任何物质的指南。
## 数据来源
⚠️ **内置的数据为示意性样本**,其结构仿照了官方数据集,但**不具备权威性**。在将其作为事实依据展示之前,请使用真实导出的数据替换它们:
- UNODC —— 毒品:价格与世界毒品报告 —— https://dataunodc.un.org
- INCB —— 前体年度报告与 PICS —— https://www.incb.org/incb/en/precursors/
- EUDA (EMCDDA) —— 价格与纯度 —— https://www.euda.europa.eu/data
- World Bank —— 人均 GDP —— https://data.worldbank.org
通过页脚的 **“Load official data (CSV)”** 面板加载真实数据;每个文件由 `src/lib/ingest.js` 解析,错误的数据行会被报告,而不会被静默丢弃。
请参阅 `src/lib/ingest-config-reference.md` 了解列映射关系。
## 技术
React 18 · Vite 5 · TypeScript · Recharts · react-simple-maps(本地打包了 world-atlas)。界面层引入了 **Three.js / React Three Fiber**(一个延迟加载并带有 bloom 后期处理的主视觉地球仪——不包含在初始包中),**@react-spring/web**(基于物理效果的字/段显示动画和动态计数器),以及 **Lenis**(全局平滑滚动)—— 所有这些都受 `prefers-reduced-motion` 限制保护。
运行时数据存储 (`src/lib/dataStore.ts`) 在加载时将样本数据替换为真实数据。
## 开发
```
npm install
npm run dev # local dev server
npm run build # type-check (tsc) + production build → dist/
npm run preview # preview the build
npm run typecheck # tsc --noEmit
npm test # run unit tests (Vitest)
```
## 部署 (Vercel)
此仓库已适配 Vercel(`vercel.json` 固定了 Vite 框架)。你可以选择:
- **控制面板:** 在 vercel.com 导入 Git 仓库 —— 零配置,自动检测。
- **CLI:** `npx vercel` (预览) / `npx vercel --prod` (生产环境)。
## 状态 / TODO
- `src/lib/metrics.js` 中的 `purityAdjustedPrice()` 是一个故意留空的占位实现 —— 纯度为 null 时的策略属于编辑选择,交由维护者决定。
- 加载并**验证**真实的 UNODC/INCB 数据(这是剩余的主要步骤)。
标签:WebGL, 公开数据, 数据探索器, 社会研究, 自动化攻击