如何用Python筛选进入海岸线100公里范围的台风数据
用Python区分登陆与未登陆台风的实操方案
一、先拆分TXT里的台风数据
你的数据用台风头行分隔不同台风,第一步得把每个台风的记录单独归类:
- 逐行读取文件,碰到头行(比如示例里的
1946 265 01,特征是字段少,一般是年份、编号类信息)就新建列表存储该台风的记录,后续非头行数据都加入当前列表 - 从每条数据行提取关键信息:时间、纬度、经度、气压,方便后续计算
代码示例:
def parse_typhoon_data(file_path): typhoons = [] current_typhoon = [] with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: continue parts = list(filter(None, line.split())) # 根据实际数据调整头行判断逻辑,示例头行是3个字段,数据行是9个 if len(parts) == 3: if current_typhoon: typhoons.append(current_typhoon) current_typhoon = [] current_typhoon.append(parts) # 存储头行的台风编号等信息 else: # 解析时间、经纬度、气压 year, month, day, hour = int(parts[0]), int(parts[1]), int(parts[2]), int(parts[3]) lat, lon = float(parts[5]), float(parts[6]) current_typhoon.append({ 'time': f"{year}-{month:02d}-{day:02d} {hour:02d}:00", 'lat': lat, 'lon': lon, 'pressure': float(parts[7]) }) # 处理最后一个台风的记录 if current_typhoon: typhoons.append(current_typhoon) return typhoons
二、准备海岸线坐标数据
要判断台风是否进入海岸线100公里范围,需要先获取目标区域的海岸线坐标集合:
- 用
geopandas加载公开的海岸线Shapefile(比如中国沿海的公开海岸线数据) - 把海岸线几何对象转换成坐标点集合,方便后续计算距离
代码示例:
import geopandas as gpd # 替换为你的海岸线Shapefile文件路径 coastline = gpd.read_file("coastline.shp") coast_points = [] # 提取所有海岸线的坐标点 for geom in coastline.geometry: if geom.type == 'LineString': coast_points.extend(list(geom.coords)) elif geom.type == 'MultiLineString': for line in geom.geoms: coast_points.extend(list(line.coords)) # 转换为(lat, lon)格式,和台风数据的坐标顺序匹配 coast_points = [(p[1], p[0]) for p in coast_points]
三、计算距离并判断登陆状态
核心逻辑:只要台风的任一记录点到海岸线的最短距离≤100公里,就判定为登陆台风。用geopy的geodesic函数可以直接计算球面距离,单位转成公里:
代码示例:
from geopy.distance import geodesic def check_landfall(typhoon_records, coast_points): # 跳过头行,遍历台风的每个时间点记录 for record in typhoon_records[1:]: typhoon_loc = (record['lat'], record['lon']) # 计算到所有海岸线点的最短距离 min_dist = min(geodesic(typhoon_loc, point).km for point in coast_points) if min_dist <= 100: return True return False # 批量处理所有台风 typhoons = parse_typhoon_data("your_typhoon_data.txt") landfall_list = [] non_landfall_list = [] for typhoon in typhoons: if check_landfall(typhoon, coast_points): landfall_list.append(typhoon) else: non_landfall_list.append(typhoon) # 输出统计结果 print(f"登陆台风数量:{len(landfall_list)}") print(f"未登陆台风数量:{len(non_landfall_list)}")
四、实操注意事项
- 坐标系统一:确保台风数据和海岸线数据都是WGS84经纬度格式,否则距离计算会出现误差
- 头行规则调整:如果你的数据头行格式和示例不同(比如字段数、内容差异),要修改头行的判断条件
- 效率优化:如果数据量极大,可以对海岸线点做聚类简化,减少计算量,避免程序运行过久
内容的提问来源于stack exchange,提问作者shibashiba
相关产品推荐
相关产品推荐

