前言地下水水位数据是水文分析与管理决策的“底盘”补给—径流—排泄判别、含水层动态评价、超采预警与生态修复成效核验都离不开连续、可比的水位序列。但现实中高质量水位往往分散在年鉴、报告或扫描 PDF 里既难批量获取也难直接用于统计建模。把 PDF 中的水位表可靠地结构化为 Excel/数据库等于把“可读资料”变成“可算数据”才能开展跨年对比、区域空间分析、异常识别与成果复核并显著降低重复整理的时间成本。数据介绍《全国地质环境监测地下水位年鉴》汇集了度国家地下水监测工程水位监测成果覆盖10000多个国家级监测点。年鉴按行政区划顺序编排监测点基本信息包括统一编号、监测点位置、地面高程、监测深度水层组顶/底板埋深、地下水资源分区、含水介质与埋藏条件等为开展区域地下水动态评价与对比分析提供了权威底表。监测点统一编号为12位数字前6位对应GB/T 2260—2007行政区划代码省、市、县第7位标识监测大类2为地下水第8位为站点级别1国家级等第9—12位为省内监测井序号。水位以“水位标高米”表示监测数据来源于自动化设备小时级采集传输受篇幅限制出版时采用“每5日1条”的展示方式并给出月平均、最大、最小及水位变幅等统计指标2月28日数据并入30日并以“*”标注。地面高程采用1985年黄海高程系少数测流站监测深度为空。需要注意的是早期2005—2017年鉴多为约千个站点规模统计指标以“埋深”为主自2018年起站点数量跃升至万点量级且统一编号编码体系与记录口径发生调整2018—2021年主要以“水位标高”呈现更利于跨区对比与与地形/高程体系衔接。年鉴强调数据整编的长期性与复杂性并提示四舍五入保留两位小数可能导致变幅出现0.01 m级差异。数据获取点击链接直达数据说明【属性信息】统一编号:地下水动态监测站点统一编码位置监测站点地址地下水水力类型又称为含水介质及埋藏条件监测深度:监测水位位置埋深水文地质单元:有的年份pdf名称为地下水资源分区日期日尺度2005-2017年日期格式不固定有的是每一天都有有的是每5日记录一次另外原始数据部分表格部分天可能存在不全2018-2021年则是每5天记录一次地下水埋深2005-2017以地下水埋深记录2018-2021年以地下水水位记录月平均埋深:该月该站点地下水平均埋深月最大埋深该月该站点地下水最大埋深月最小埋深该月该站点地下水最小埋深水位变幅该月水位变动幅度【数据信息】数据时间2005-2021年站点数量2005-2017年每年站点个数在900-1000之间2018-2021在1万个左右数据格式excel表格站点坐标通过高德反查及位置纠偏获得每个站点的经纬度坐标坐标系WGS84数据单位m(米数据提示本人全部将数据进行反查并对数据进行修复所有数据均尊重原始书本记录有时发现书本可能记录错误也已经在备注中说明均可自行查看是否合理。处理说明1、年鉴很难“直接用”年鉴里的水位附表看上去是表格但对程序而言通常是两种情况扫描图只能 OCR看似可复制的文本表格复制出来也会列错位、换行断裂、小数点/负号混乱更关键的是OCR 的输出不是表格是一堆文字框每个框有坐标文字。你要做的是把这些框重新拼成“行-列-单元格”。2、页面不是一种版式而是一堆“变体”坑 A有的页倾斜、有的页反转180°年鉴扫描质量不完全一致个别页轻微倾斜甚至出现整页倒置。我做了一个“关键词命中”判断如果识别出的文本里关键字命中很少就再把页面旋转 180° 重新 OCR谁命中高用谁。坑 B同一页可能有多张表多个监测点水位数据页经常“一个页面包含多个监测点表格”。所以不能只找一次表头要在同一页里找多个 1–12 月表头按表头分块提取。3、“识别过了”与“识别少了”坑 C表头容易“识别过了”把别的格子内容当成月份或列内容表头附近往往有其他数字页眉、统计字样、表格右侧说明OCR 可能把这些数字混进来导致列中心错位后面整表都串列。我的策略是两步表头只认 1–12 的数字用已识别的月份做线性拟合1–12 的 x 坐标应近似等距把缺的月份中心补出来得到“12 列的列中心线”。这样哪怕 OCR 只识别出 1、2、3、6、8也能推断出其余月份列的位置避免整表漂移。坑 D月份容易识别少特别是小字、贴线、扫描糊表头“11、12”最容易少一笔变成“1/2”或者干脆丢失。所以我不强依赖“必须识别到 12 个月”而是用拟合补齐但同时也会做一个判断若有效月份过少则触发兜底方案见后文网格裁剪。4、四位数的噩梦特别对 4 位数的因为单元格之间间距小很容易把别的识别过来”这确实是地下水位年鉴里最常见的灾难现场之一。典型症状包括1416.98 被识别成 416.98漏千位1416.98 被拆成两段141 6.98碎片化左右格子数字挤在一起OCR 把边界看错“把别的格子识别过来”串格我的做法是“先归位、再拼接、再纠错”先按列中心最近邻把每个文字框分到某个月份列同一个月份列里按 x 从左到右拼接碎片得到候选字符串对候选字符串做数值恢复修小数点、修千位、修/10 等5、负号经常漏不处理会把埋深/水位方向搞反对细小的负号特别不稳定尤其是负号很短、负号贴着表格线、字体细、扫描糊我做了两层处理清洗阶段统一负号字符把 — − 等都归一到 -序列层面的异常检测同一监测点的时间序列如果出现“孤立的符号反转”且改符号后能显著贴近前后邻值则标记“疑似符号异常”并在非常明确时做自动修复同时写入备注保证可追溯。6、统一编号容易少位数统一编号是两张表的“主键”。但 OCR 对长数字同样不友好少识别一位、两位、前导零丢失、甚至被 Excel 自动转成科学计数法我的处理方式编号字段只提取数字统一规范为固定长度如取末 12 位不足则按规则补齐/保留在水位页解析到的编号如果可疑位数不够/不稳定就用“监测点列表页”里提取出的编号库去做反查匹配最稳的方式是编号位置文本相互校验最终输出 Excel 时我还强制把“统一编号”这一列写成文本格式避免 Excel 自动变形。7、漏掉某一页、某一个表格年鉴这种超长 PDF其中2018-2021年每一本都超过3000页最要命的是你以为跑完了实际漏了几页或漏了页内某个表。我做了三件事降低漏提风险进度文件 progress.json只有当该页数据已成功写入缓存 CSV 后才记录为“已处理”断点续跑不会误跳缓存 CSV 追加写入运行中不频繁写 Excel避免 Excel 被占用导致数据没落盘页内多表头检测同页多张水位表时找多个表头并分块提取避免“只提第一张表”此外遇到“页面倾斜导致表头没识别出来”的情况我倾向于宁可不写进度让后续人工抽查或二次跑能重新捞这页而不是把它标记为完成。8、月统计平均/最大/最小/变幅做一致性校验年鉴水位表通常在日值下方还有 4 行月统计。它的难点是字号更小、更贴线、容易混入“年统计”一行、很容易错位把年统计数字当成月统计行识别优先在最后一个日值行之后找“在 12 个月区域内数字密度很高”的 4 行分别对应平均/最大/最小/变幅。提取后不做“反算改值”只做一致性检查并写备注例如月最大 月最小疑似错位变幅与(最大-最小)明显不一致变幅过大超过经验阈值月平均不在[min,max]附近这样后续使用者能快速定位“需要人工复核”的月份。9、地址到坐标让监测点能“投点”并给坐标可靠性打分年鉴站点信息一般都给“监测点位置”文字地址但经纬度不一定完整、也不一定适合直接 GIS 使用。为了让点位更好用我做了地址地理编码并且把“可靠性”当成一个必须输出的指标。用高德地理编码 反查校验流程大致是用地址调用高德地理编码得到坐标高德返回一般为 GCJ-02“火星坐标”再用该坐标做逆地理编码得到返回的省/市/区县/乡镇/街道等结构化信息用逆地理结果去和原始地址文本做一致性校验并打分地址可靠性打分省/市/县/乡镇逐级给分我做的打分逻辑比较“地质项目化”核心是行政层级越匹配越可信。GCJ-02 → WGS84把坐标纠偏回 GIS 常用坐标系高德坐标是 GCJ-02如果要和常见底图、GPS、以及很多地学数据统一一般需要转 WGS84。我在落库时把高德坐标做了 GCJ-02 转 WGS84 的纠偏保证投点不会整体偏移。仅此记录我做数据的过程数据展示▲全国地下水监测站点点位分布图▲部分监测站点位表格展示▲某一个站点PDF具体展示▲某一个监测站点识别的excel数据完美匹配▲监测站点所有年份统计部分站点年份仅仅1年▲北京市东城区2005-2021年水位变化▲每个省每个市的站点数据汇总数据引用数据引用《中国地质环境监测地下水位年鉴》