DAHITI水位数据产品批量下载(python)

发布时间:2026/6/10 19:47:48

DAHITI水位数据产品批量下载(python) 如何批量下载特定站点的DAHITI水位数据产品具体流程1从 DAHITI API 拿到全部站点dahiti_id lon lat2读取所需 CSV 站点lon/lat3用距离匹配Haversine把所需点和 DAHITI 站点关联4输出匹配表所需点 ID → dahiti_id → 距离 → 经纬度5批量下载匹配到的 DAHITI 水位数据代码#!/usr/bin/python3# -*- coding: utf-8 -*-importosimportsysimportjsonimportrequestsimportpandas as pd from haversineimporthaversine# 配置设置 API_KEYyour API_KEYINPUT_CSV_PATHrD:\VS_List.csvVS_FID_COLUMNVS_FIDLON_COLUMNlonLAT_COLUMNlatMAX_ALLOWED_DISTANCE_KM5OUTPUT_FORMATcsvOUTPUT_DIRrD:\dahiti_river_data# os.makedirs(OUTPUT_DIR,exist_okTrue)# ------------------- 1. 获取DAHITI全部站点 -------------------print(正在获取DAHITI全站元数据...)url_listhttps://dahiti.dgfi.tum.de/api/v2/list-targets/payload_list{api_key:API_KEY}responserequests.post(url_list,datapayload_list)ifresponse.status_code!200: print(站点列表请求失败)sys.exit(1)targetsjson.loads(response.text)[data]print(fDAHITI总站点数{len(targets)})dahiti_stations[]fortargetintargets: dahiti_stations.append({dahiti_id:int(target[dahiti_id]),lon:float(target[longitude]),lat:float(target[latitude])})dahiti_dfpd.DataFrame(dahiti_stations)# ------------------- 2. 读取输入站点含 VS_FID -------------------input_dfpd.read_csv(INPUT_CSV_PATH)input_dfinput_df.rename(columns{LON_COLUMN:lon, LAT_COLUMN:lat, VS_FID_COLUMN:vs_fid})# 【关键】强制转换为正确类型杜绝浮点型input_df[vs_fid]input_df[vs_fid].astype(int)input_df[lon]input_df[lon].astype(float)input_df[lat]input_df[lat].astype(float)input_dfinput_df[[vs_fid,lon,lat]].dropna()# ------------------- 3. 空间匹配最近站点5km筛选 -------------------print(正在进行空间匹配与距离筛选...)match_records[]for_, input_rowininput_df.iterrows(): vs_fidint(input_row[vs_fid])input_loninput_row[lon]input_latinput_row[lat]min_distance99999.0best_dahiti_idNonefor_, dahiti_rowindahiti_df.iterrows(): dahiti_londahiti_row[lon]dahiti_latdahiti_row[lat]distancehaversine((input_lat,input_lon),(dahiti_lat,dahiti_lon))ifdistancemin_distance: min_distancedistance best_dahiti_idint(dahiti_row[dahiti_id])ifmin_distanceMAX_ALLOWED_DISTANCE_KM: match_records.append({vs_fid:vs_fid,input_lon:input_lon,input_lat:input_lat,dahiti_id:best_dahiti_id,distance_km:round(min_distance,3)})match_dfpd.DataFrame(match_records)match_df.to_csv(dahiti_matched_result.csv,indexFalse,encodingutf-8)print(f匹配完成结果已保存)print(f符合{MAX_ALLOWED_DISTANCE_KM}km条件的站点数{len(match_df)})# ------------------- 4. 批量下载水位数据按 VS_FID 命名 -------------------download_urlhttps://dahiti.dgfi.tum.de/api/v2/download-water-level/for_, rowinmatch_df.iterrows(): vs_fidint(row[vs_fid])dahiti_idint(row[dahiti_id])file_pathos.path.join(OUTPUT_DIR, f{vs_fid}.csv)print(f正在下载 VS_FID{vs_fid} | DAHITI_ID{dahiti_id})download_payload{api_key:API_KEY,dahiti_id:dahiti_id,format:csv}responserequests.post(download_url,jsondownload_payload)ifresponse.status_code200:# 修复分号分隔问题Excel正常打开csv_contentresponse.text.replace(;,,)with open(file_path,w,encodingutf-8)as f: f.write(csv_content)print(f下载成功VS_FID{vs_fid})else: print(f下载失败VS_FID{vs_fid} 状态码{response.status_code})print(\n 全部任务完成 )效果显示成功下载所需数据打开数据查看水位时间序列如果想要获取自己的虚拟站点与dahiti中站点位置信息以及距离可以用下面的代码来实现#!/usr/bin/python3# -*- coding: utf-8 -*-importosimportjsonimportrequestsimportpandas as pd from haversineimporthaversine# 配置设置 API_KEYAPIINPUT_CSV_PATHrD:\VS_List.csvVS_FID_COLUMNVS_FIDLON_COLUMNlonLAT_COLUMNlatMAX_ALLOWED_DISTANCE_KM5# # ------------------- 1. 获取 DAHITI 全站信息 -------------------print(正在获取 DAHITI 全站元数据...)url_listhttps://dahiti.dgfi.tum.de/api/v2/list-targets/payload_list{api_key:API_KEY}responserequests.post(url_list,datapayload_list)ifresponse.status_code!200: print(获取站点列表失败)exit(1)targetsjson.loads(response.text)[data]print(fDAHITI 总站点数{len(targets)})dahiti_stations[]fortargetintargets: dahiti_stations.append({dahiti_id:int(target[dahiti_id]),dahiti_lon:float(target[longitude]),dahiti_lat:float(target[latitude])})dahiti_dfpd.DataFrame(dahiti_stations)# ------------------- 2. 读取你的 VS_FID 经纬度 -------------------input_dfpd.read_csv(INPUT_CSV_PATH)input_dfinput_df.rename(columns{LON_COLUMN:input_lon, LAT_COLUMN:input_lat, VS_FID_COLUMN:vs_fid})# 强制类型安全input_df[vs_fid]input_df[vs_fid].astype(int)input_df[input_lon]input_df[input_lon].astype(float)input_df[input_lat]input_df[input_lat].astype(float)input_dfinput_df[[vs_fid,input_lon,input_lat]].dropna()# ------------------- 3. 空间匹配输出 DAHITI 真实经纬度 -------------------print(正在匹配最近站点...)match_result[]for_, input_rowininput_df.iterrows(): vs_fidint(input_row[vs_fid])input_loninput_row[input_lon]input_latinput_row[input_lat]min_dist99999.0best_idNone best_lonNone best_latNonefor_, dahiti_rowindahiti_df.iterrows(): d_iddahiti_row[dahiti_id]d_londahiti_row[dahiti_lon]d_latdahiti_row[dahiti_lat]disthaversine((input_lat,input_lon),(d_lat,d_lon))ifdistmin_dist: min_distdist best_idd_id best_lond_lon best_latd_latifmin_distMAX_ALLOWED_DISTANCE_KM: match_result.append([vs_fid, input_lon, input_lat, best_id, best_lon, best_lat, round(min_dist,3)])# 这里修复了缺失的括号# ------------------- 4. 输出完整匹配表 -------------------output_dfpd.DataFrame(match_result,columns[VS_FID,input_lon,input_lat,dahiti_id,dahiti_lon,dahiti_lat,distance_km])output_df.to_csv(dahiti_matched_result.csv,indexFalse,encodingutf-8)print(*60)print(匹配完成文件已保存为dahiti_matched_result.csv)print(f有效匹配数量{len(output_df)} 个)print(文件包含字段VS_FID, input_lon, input_lat, dahiti_id, dahiti_lon, dahiti_lat, distance_km)print(*60)效果展示最后数据对应站点的坐标信息以及计算的距离。注意该距离是地表最短球面直线距离利用Haversine 公式 计算得到的是地球表面两点间的大圆距离。

相关新闻