简介这份1950-2018年中国沿海台风历史数据集以Shapefile矢量格式封装包含点、线两个图层面向气象科研人员、GIS分析者及灾害风险管理从业者用于系统回溯台风活动轨迹与空间分布规律。压缩包共10个文件由shp几何数据、dbf属性表、shx空间索引、prj投影参数及xml元数据构成组成一套结构完整的Shapefile数据集整体仅1005KB体量轻便可在ArcGIS、QGIS等主流GIS平台直接加载。点图层对应台风登陆位置线图层还原移动路径研究者可据此开展台风频率统计、强度等级评估、登陆热点识别、季节与地理时空关联分析还可为风暴潮模拟、防灾规划及风险区划提供历史参照。无论用于科研论文中的气候统计与趋势分析还是GIS教学中的矢量数据实践这套数据都能快速上手。目前已有1782人学习下载是一份兼具科研价值与工具属性的轻量级历史台风资料。1. 从一份打包好的 shp 说起中国台风数据到底能做什么做台风灾害复盘时最耗时间的往往不是建模本身而是找一份能直接用的路径数据。这份 1950-2018 中国台风 shp 数据把近七十年来的台风路径整理成了标准矢量图层解压后拖进 GIS 软件就能看到每个台风的移动轨迹、时间戳和强度属性。它适合三类人做气候趋势分析的研究者、需要在图上圈定受灾范围的防灾从业者以及拿路径数据做可视化 demo 的数据开发者。数据本身不包含分析结论真正的价值在属性表和时间字段被用起来之后能支撑路径聚类、登陆频率统计、缓冲区圈定这些更高阶的活儿。我的建议是先花十分钟检查坐标系和编码后面的坑会少一大半。2. 拆开这份 shp路径图层、附属文件与属性字段2.1 数据集构成为什么说 shp 是一堆文件而不是一个文件很多人第一次打开压缩包时会懵里面不是单个文件而是一组同名不同后缀的文件。Shapefile 格式从诞生起就是多文件结构核心文件缺一个都会出问题。这份中国台风数据包里常见组成如下表文件名后缀作用缺失后果.shp存储几何要素点坐标图层完全无法打开.shx几何索引加速读取打开极慢或报错.dbf属性表存放字段信息只能看到点看不到台风编号和属性.prj坐标系描述文件坐标被当成未知坐标系出现偏移.cpg字符编码声明中文属性字段出现乱码.sbn / .sbx空间索引可选影响查询速度不影响使用拿到数据后我一般会先看一遍压缩包里有没有 .prj 和 .cpg。缺 .prj 意味着软件不知道这批坐标是经纬度还是投影坐标叠加底图时路径会飘到奇怪的位置缺 .cpg 则意味着 dbf 里的中文台风名字段可能变成乱码。这两个文件是踩坑重灾区后面第 5 章详细讲。正常状况下这份数据的点代表每次观测记录同一次台风的观测记录在编号字段上是相同的值靠这个字段可以把散点串成路径线。2.2 属性字段从编号到风速一条记录里藏着什么这类台风数据的属性表通常包含几个核心字段虽然不同版本的字段命名稍有差异但结构上大差不差。我打开 dbf 后先看这些字段台风编号用年份加序号编码例如某年生成的第一个台风编号为 195001这个字段是串联路径的主键。观测时间记录该点的日期和时间通常是字符串格式例如“19500101 12”“1950-01-01 12:00”这类。需要注意它是字符串还是日期类型直接影响筛选效率。经度 / 纬度观测点的坐标单位是十进制度。这份数据用经纬度存储适合直接做全国的路径图。中心气压百帕台风强度的核心指标气压越低强度越强做强度分级就靠它。最大风速米/秒和中心气压配合判断台风等级也可以作为颜色映射的输入。字段名如果自带中文说明最好但有些历史数据是用缩写存储的比如“PRES”“WIND”“TIME”。遇到这种情况我建议先打开属性表看几行数据确认每个字段的实际含义再动手分析别盲目信字段名。对这份 1950-2018 数据来说年份字段是现成的或者可以从编号字段里截取前四位两种方式都能做年代筛选。2.3 在 QGIS 里快速核验十分钟之内确认数据是否可用拿到 shp 后第一步不是急着分析而是做一次快速核验。我一般在 QGIS 里这么操作拖入 shp 文件先对着在线底图看一遍路径分布范围确认坐标没有跑偏到大陆中部或海洋边缘。打开属性表按台风编号字段做一次排序确认同一个编号的观测点数量合理、时间上是递增的。右键图层打开属性在“源”选项卡里查看坐标系描述确认是 WGS 84EPSG:4326。用表达式筛选一段年份数据验证时间字段的类型和内容。例如在 QGIS 表达式里写年份 2000 AND 年份 2018表达式返回“查询成功”且地图上只显示对应年份的路径就说明字段值和类型都能直接用。如果这一条报错按我经验八成是字段名带空格或者引号内字段名与实际名称不一致。回到属性表复制准确字段名再试一次就行别手敲。做完这四步数据的可用性心里就有底了可以进入下一步的分析工作。3. 坐标系转换与空间分析把点轨迹变成可深挖的成果3.1 坐标系选型经纬度与投影坐标什么时候用哪个这份数据大概率以 WGS 84 经纬度EPSG:4326存储适合做全图展示和路径叠加。但一旦涉及距离计算、缓冲区生成、面积统计经纬度坐标就会出问题——它的单位是度不是米直接算距离会得到毫无意义的结果。这时候必须转投影坐标系。坐标系EPSG 编号单位适合场景不适合场景WGS 84 地理坐标4326度路径展示、Web 底图叠加、跨区域概览距离/面积精确计算Web 墨卡托投影3857米在线地图服务、与切片底图对齐高纬度地区面积统计UTM 投影分带326xx / 327xx米局部区域缓冲区、面积测量跨带拼接、大范围路径展示我做全国尺度的台风路径分析时通常保留 4326 做展示在需要算距离和缓冲区时转到 3857 或者对应区域的 UTM 分带。一个容易混淆的点是3857 虽然单位是米但它的变形在高纬度非常大算面积时不推荐做缓冲区如果影响半径在几百公里内误差可以接受。3.2 用 GeoPandas 读取与坐标转换一条代码切换坐标系Python 里处理 shp 最顺手的方案是 GeoPandas底层依赖 Fiona 读取矢量文件。先读进来看看原始坐标系import geopandas as gpd # 读取台风路径点数据 gdf gpd.read_file(e:/data/typhoon_1950_2018.shp) # 查看当前坐标系和字段列表 print(gdf.crs) print(gdf.columns.tolist()) print(gdf.head(3))读取时如果不报错说明 .shp、.shx、.dbf 这三个核心文件齐全。打印的 crs 如果显示EPSG:4326就直接进入转换环节如果显示None说明 .prj 文件缺失需要先手动指定坐标系# 当 crs 为 None 时先按经纬度手动指定 gdf gdf.set_crs(epsg4326)指定完之后再做真正的坐标转换# 转换为 Web 墨卡托坐标 gdf_merc gdf.to_crs(epsg3857) # 输出转换后的文件供叠加在线底图使用 gdf_merc.to_file(e:/data/typhoon_merc.shp)参数说明set_crs只是给数据贴上坐标系标签不改变坐标数值适用于原本就是经纬度但缺失 .prj 的场景to_crs才是真正的数值重投影把经纬度换算成目标投影的米制坐标。如果数据本身不是经纬度而你错误地用了set_crs(epsg4326)后续所有结果都会变形。判断数据是不是经纬度最直接的方式是看坐标数值范围——经度在 100 到 180 之间、纬度在 0 到 50 之间基本可以确定是 4326。3.3 缓冲区分析圈出台风影响范围防灾场景里经常要回答“哪些区域可能受台风影响”。对每个路径点做缓冲区再把同一场台风的缓冲区合并就能得到一个影响范围多边形。关键前提是缓冲区半径的单位在投影坐标才是米先转投影再做计算。import geopandas as gpd # 读取原始点数据并确保坐标系为经纬度 gdf gpd.read_file(e:/data/typhoon_1950_2018.shp) gdf gdf.set_crs(epsg4326) # 转到 Web 墨卡托用米做缓冲区 gdf_merc gdf.to_crs(epsg3857) # 创建 200 公里半径的缓冲区 buf gdf_merc.buffer(200000) # 还原为 GeoDataFrame并附带原属性表 buf_gdf gpd.GeoDataFrame(gdf_merc[[台风编号, 年份]], geometrybuf, crsEPSG:3857) # 计算缓冲区面积单位换算为平方公里 buf_gdf[area_km2] buf_gdf.geometry.area / 1e6buffer(200000)里的 200000 是 200 公里对应的米数这是投影坐标系下 buffer 的标准用法。如果直接在 4326 坐标下传入 200000软件会把它当成 20 万度来处理结果没有任何参考意义。geometry.area返回的是平方米除以 1e6 转成平方公里方便横向比较不同年份台风的影响范围。计算完成后可以用dissolve按台风编号合并缓冲区得到每场台风的完整影响区域# 按台风编号融合缓冲区 merged buf_gdf.dissolve(by台风编号, aggfuncfirst)合并之后再统计每个多边形的面积或叠加行政区划做裁剪才是完整的台风影响范围分析流程。4. 从静态数据到动态表达生成台风路径时序图4.1 时间字段清洗与排序路径可视化前必做的一步台风路径可视化最常见的需求是把散点连成线。但属性表里的观测点不是天然按时间排好序的直接连接会出现折线乱跳的混乱画面。同一个台风编号下的点必须按观测时间字段排序。这里先解决时间字段的解析问题。import pandas as pd # 读取属性表部分 df gdf[[台风编号, 观测时间, 经度, 纬度]].copy() # 统一转换为 pandas 的 datetime 类型 df[观测时间] pd.to_datetime(df[观测时间], errorscoerce) # 按台风编号和时间排序保证连线顺序正确 df df.sort_values([台风编号, 观测时间]) # 检查是否有解析失败的记录 print(df[观测时间].isna().sum())pd.to_datetime能自动识别大多数时间字符串格式比如“1950010112”或“1950-01-01 12:00”都能解析。errorscoerce参数把无法解析的值变成 NaT不会中断程序但需要打印数量确认。解析失败通常意味着时间字段里有空值或脏数据要回到原始表里人工核对。排序之后每个台风编号下的观测点就是时间递增的这时候再连线就不会画出乱序的线条。4.2 用 Matplotlib 绘制单场路径动画选择某一年或某个编号的台风按时间顺序逐帧画出路径增长过程。我用 Matplotlib 的 FuncAnimation 做这个逻辑是把每一帧设置为“当前已经观测到的全部路径点”。import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation import geopandas as gpd gdf gpd.read_file(e:/data/typhoon_1950_2018.shp) gdf[观测时间] pd.to_datetime(gdf[观测时间], errorscoerce) # 筛选某场台风的数据 one gdf[gdf[台风编号] 195001].sort_values(观测时间) x one.geometry.x y one.geometry.y fig, ax plt.subplots(figsize(8, 6)) line, ax.plot([], [], o-, markersize4, colorred) def update(frame): line.set_data(x[:frame], y[:frame]) return line, ani FuncAnimation(fig, update, frameslen(one), interval100) ani.save(e:/data/typhoon_animation.gif, writerpillow, dpi100)frameslen(one)让动画逐点增长interval100表示每帧间隔 100 毫秒可以根据路径点数调整大小点数多时拉长到 150 毫秒否则动画闪太快看不清。update函数用列表切片x[:frame]来控制已显示的路径段。动画适合复盘单个台风的演进但做多年整体分析时效率太低得换用静态聚类表达。4.3 核密度热力图六十八年路径密度一眼看清把全部点投到同一张图上做二维核密度估计能直观看到哪些海域是台风生成高频区、哪些沿海区域是登陆密集区。我用 seaborn 的 kdeplot 配合经纬度坐标实现。import matplotlib.pyplot as plt import seaborn as sns import pandas as pd # 经纬度列直接参与密度计算 sns.kdeplot( xgdf.geometry.x, ygdf.geometry.y, cmapReds, levels20, fillTrue, alpha0.7, ) plt.xlabel(经度) plt.ylabel(纬度) plt.gca().set_aspect(1.4) plt.savefig(e:/data/typhoon_density.png, dpi150)levels20控制等高线的层数层数越多通廊越精细fillTrue填充色块适合表达密度渐变。set_aspect(1.4)给横纵轴设置长宽比例避免纬度跨度大时图形被压扁。这个图在汇报材料里很常用因为它直接回答“台风常从哪里来、主要在哪里登陆”这类高层级问题不需要观众理解坐标系和字段逻辑。5. 台风 shp 数据使用避坑指南坐标偏移、乱码与消失的路径5.1 路径“飘到大洋里”坐标系缺失或误指定现象加载 shp 后台风路径点分布在一个完全离谱的位置叠加底图时点跑到非洲大陆或大洋中部。原因数据没有 .prj 文件GIS 软件默认按未知坐标系加载叠加到在线底图上时出现错位或者有人直接用set_crs错误地指定了一个投影坐标系的 EPSG 编号。解决先用print(gdf.crs)确认坐标系。如果显示None默认数据是经纬度执行gdf gdf.set_crs(epsg4326)如果显示的是某个投影坐标系但数值范围在经度纬度区间内说明之前被人错误设置过需要重新指定。拿到任何 shp 的第一件事永远是查 crs这个习惯能省掉后面所有坐标相关报错。5.2 属性表中文乱码锟斤拷与字段名“变脸”现象打开属性表台风名字段和部分字段含义显示为乱码比如“锟斤拷”“烫烫烫”或者本应显示中文的字段名变成了问号。原因dbf 文件本身是 GBK 或 GB2312 编码而 QGIS / GeoPandas 默认用 UTF-8 读取导致字节解码错误。数据包里如果缺少 .cpg 文件就等同于没有告诉软件编码类型。解决在 QGIS 中右键图层选择“导出”—“另存为”在“编码”下拉框里选择 “GBK” 或 “System”重新输出一个带正确编码的 shp 文件。Python 侧可以在读取时指定编码# 用 GDAL 的开放选项指定 dbf 读取编码 gdf gpd.read_file( e:/data/typhoon_1950_2018.shp, encodinggbk, )encodinggbk与常见的带 .cpg 声明文件效果一致。如果换成utf-8仍然报解码错误就把 dbf 用表格工具打开确认原始编码再选。血泪经验是不要在读取后再试图转换字段编码那比直接指定编码重读麻烦得多还容易把经纬度列改坏。5.3 时间筛选报错字段类型是字符串不是日期现象在 QGIS 表达式或 Python 里直接写年份 2000或gdf[gdf[年份] 2000]报错提示类型不匹配或者筛选结果为空。原因年份字段或时间字段存在 dbf 里是字符串类型与整数比较时隐式类型转换失败。dbf 的历史格式限制导致很多字段是用文本存储数值的。解决在 pandas 侧先做类型转换再筛选gdf[年份] gdf[年份].astype(int) # 或从台风编号里截取前四位作为年份 gdf[年份] gdf[台风编号].astype(str).str[:4].astype(int)astype(int)强制把字符串转成整数转换失败会抛异常可以先打印gdf[年份].unique()看有没有脏值比如空白字符串或缺失值。先做数据清洗再做筛选而不是在表达式里硬刚类型。5.4 台风登陆后路径“消失”数据覆盖范围的边界现象一条台风路径在接近陆地时突然终止后续观测点没有了看起来像数据缺失。原因这类路径数据集多数来源于洋面观测登陆后风速迅速衰减低于观测门槛的记录会被剔除也有部分数据集只收录了海上路径不包含登陆后的陆上衰减段。数据产出的地理范围决定了它只能覆盖到特定边界。解决做分析前先看数据说明中“覆盖范围”一节的描述判断是否包含陆上路径。如果分析目标是登陆后的影响范围需要自行补充或改用气象站实测数据补全。很多人误以为路径断头是文件损坏其实只要压缩包里核心文件齐全数据本身大概率没问题。遇到疑似断头路径用基础图叠加确认下是不是位于海岸线附近就能判断是不是边界原因了。6. 进阶技巧把六十八年台风数据压成一张值得汇报的图如果只想从这份数据里产出一张“汇报级”成果图我强烈推荐做年代聚合散点图每个点是一次观测点的颜色代表年代点的大小代表风速强度。这样一张图就能同时表达空间分布、时间趋势和强度层级比单纯画路径线信息密度高得多。import geopandas as gpd import matplotlib.pyplot as plt import numpy as np gdf gpd.read_file(e:/data/typhoon_1950_2018.shp) # 从编号字段提取年份 gdf[年份] gdf[台风编号].astype(str).str[:4].astype(int) # 用风速字段作为点大小缺失值置为最小尺寸 if 最大风速 in gdf.columns: size gdf[最大风速].fillna(0) * 1.5 2 else: size 3 # 颜色按年代映射 decade (gdf[年份] // 10) * 10 fig, ax plt.subplots(figsize(12, 8)) sc ax.scatter( gdf.geometry.x, gdf.geometry.y, cdecade, ssize, cmapmagma, alpha0.55, linewidths0, ) # 手动设置 colorbar 的标签为年代 cbar plt.colorbar(sc, axax, label台风发生年代, ticks[1950, 1960, 1970, 1980, 1990, 2000, 2010]) ax.set_xlabel(经度) ax.set_ylabel(纬度) ax.set_aspect(1.4) plt.savefig(e:/data/all_typhoon_1950_2018_map.png, dpi150)(gdf[年份] // 10) * 10把年份归到最近的十年整组比如 1970、1980、1990用于颜色分级比用连续年份更容易读。alpha0.55控制透明度当年份重叠严重时更高的透明度能显示密度叠加感。直接保存 PNG 而不是先显示窗口避免大批点绘制期间窗口卡顿。这张图做出来之后可以从三条维度解读一是看点的密度集中带能直观读出台风路径的主通道二是看颜色沿时间轴的分布能判断路径带在几十年间是否发生整体位移三是看大点的聚集区也就是强台风的高发海域。拿它配合前文的核密度图一份完整的台风气候特征分析就能站住脚。我最初拿到这份数据时没查坐标系就做了缓冲区分析结果算出的影响面积比实际偏大几百公里汇报时当场被指出来。从那以后我每次拿到新的 shp都会先强制自己走一遍“读 crs、查字段类型、验证时间格式”的三步检查再开始任何空间分析。这套检查花不了十分钟但能避免之后所有分析推倒重来。希望帮到你。本文还有配套的精品资源点击获取