You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:47:47