GeoMaster 行业应用实战指南:城市规划、灾害管理与基础设施的地理空间工作流
2026/9/11 9:16:34 网站建设 项目流程

GeoMaster 行业应用实战指南:城市规划、灾害管理与基础设施的地理空间工作流

【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills

本指南以 GeoMaster 技能库中的 industry-applications.md 为骨架,围绕真实世界的行业地理空间工作流展开:城市土地利用分类与人口估算、洪水与野火风险评估、电力走廊与管道选线、交通与公交服务区分析。你将掌握 Sentinel-2 光谱特征 + 随机森林分类、基于 DEM 的水文建模、多因子风险叠加、最小成本路径等一整套可直接落地的 Python 实现,并了解如何复用 SKILL.md 中的 CRS 处理、云掩膜与性能优化实践,让代码在真实数据上可运行、可复用。

GeoMaster 是面向 GIS、遥感和地球观测的综合性 Agent 技能库,覆盖 70+ 主题、500+ 代码示例。本文聚焦其中专门讲述行业落地的章节:不同行业(城市规划、灾害管理、公用事业与基础设施、交通运输)如何用同一套矢量/栅格/机器学习栈解决现实问题。所有代码均源自 industry-applications.md,并以仓库内其他参考文档与 SKILL.md 中的最佳实践加以注释和补全。

环境准备与公共技术底座

行业应用代码大量使用geopandasrasterioscikit-learnscipynetworkxosmnx。按照 SKILL.md 的安装建议:

# 核心 Python 栈(推荐 conda) conda install -c conda-forge gdal rasterio fiona shapely pyproj geopandas # 遥感与机器学习 uv pip install rsgislib torchgeo earthengine-api uv pip install scikit-learn xgboost torch-geometric # 网络与可视化 uv pip install osmnx networkx folium keplergl uv pip install cartopy contextily mapclassify # 大数据与云端 uv pip install xarray rioxarray dask-geopandas uv pip install pystac-client planetary-computer

多数行业工作流需要输入栅格(Sentinel-2 影像、DEM)与矢量(行政区、道路、基础设施)。数据获取可参考>import elevation elevation.clip(bounds=(-122.5, 37.7, -122.3, 37.9), output='srtm.tif') elevation.clean('srtm.tif', 'srtm_filled.tif')

两个贯穿所有案例的注意事项(源自 SKILL.md):

  1. CRS 一致性:进行任何空间运算前先检查坐标系,面积/距离计算务必转换到投影坐标系(如gdf.estimate_utm_crs()自动检测 UTM)。
  2. 投影坐标系:缓冲区、面积、长度计算不要使用 Web Mercator(EPSG:3857),应使用 UTM(EPSG:326xx/327xx)。

城市规划:从土地利用分类到人口估算

城市土地利用分类

classify_urban_land_use展示了一条标准的监督分类流水线:加载训练数据 → 提取光谱与纹理特征 → 随机森林训练 → 整图分类 → 后处理 → 统计。类别为 Residential / Commercial / Industrial / Green Space / Water 五类(在注释中约定 0–4 或 1–5 的整数类号)。

def classify_urban_land_use(sentinel2_path, training_data_path): """ Urban land use classification workflow. Classes: Residential, Commercial, Industrial, Green Space, Water """ from sklearn.ensemble import RandomForestClassifier import geopandas as gpd import rasterio # 1. Load training data training = gpd.read_file(training_data_path) # 2. Extract spectral and textural features features = extract_features(sentinel2_path, training) # 3. Train classifier rf = RandomForestClassifier(n_estimators=100, max_depth=20) rf.fit(features['X'], features['y']) # 4. Classify full image classified = classify_image(sentinel2_path, rf) # 5. Post-processing cleaned = remove_small_objects(classified, min_size=100) smoothed = majority_filter(cleaned, size=3) # 6. Calculate statistics stats = calculate_class_statistics(cleaned) return cleaned, stats def extract_features(image_path, training_gdf): """Extract spectral and textural features.""" with rasterio.open(image_path) as src: image = src.read() profile = src.profile # Spectral features features = { 'NDVI': (image[7] - image[3]) / (image[7] + image[3] + 1e-8), 'NDWI': (image[2] - image[7]) / (image[2] + image[7] + 1e-8), 'NDBI': (image[10] - image[7]) / (image[10] + image[7] + 1e-8), 'UI': (image[10] + image[3]) / (image[7] + image[2] + 1e-8) # Urban Index } # Textural features (GLCM) from skimage.feature import graycomatrix, graycoprops textures = {} for band_idx in [3, 7, 10]: # Red, NIR, SWIR band = image[band_idx] band_8bit = ((band - band.min()) / (band.max() - band.min()) * 255).astype(np.uint8) glcm = graycomatrix(band_8bit, distances=[1], angles=[0], levels=256, symmetric=True) contrast = graycoprops(glcm, 'contrast')[0, 0] homogeneity = graycoprops(glcm, 'homogeneity')[0, 0] textures[f'contrast_{band_idx}'] = contrast textures[f'homogeneity_{band_idx}'] = homogeneity # Combine all features # ... (implementation) return features

关于代码细节的说明:特征提取的索引约定与 SKILL.md 中的光谱指数一致——image[2]=B03(绿)、image[3]=B04(红)、image[7]=B08(近红外)、image[10]=B11(SWIR1),NDVI 用(NIR-Red)/(NIR+Red+1e-8)1e-8防止除零。四个指数各有物理含义:

指数公式在土地利用中的作用
NDVI(NIR-Red)/(NIR+Red)识别植被(绿地、农田)
NDWI(Green-NIR)/(Green+NIR)识别水体
NDBI(SWIR-NIR)/(SWIR+NIR)识别建筑/不透水面
UI(城市指数)(SWIR+Red)/(NIR+Green)增强建成区与裸地对比

GLCM 纹理特征对城市异质性(高密度建成区、阴影、混合像元)尤其重要——纯光谱指数难以区分不同材质的屋顶与道路。后处理中的remove_small_objects(min_size=100)majority_filter(size=3)去除孤立像元、平滑斑块边界。

完整的分类流程(含通过rasterio.features.rasterize从训练矢量提取样本、整图预测并写出classified.tif)可参考 SKILL.md 的classify_imagery与 code-examples.md 的第 66 个示例。分类输出可作为下游「人口估算」和「洪水暴露分析」的输入。

面插值人口估算(Dasymetric Population Redistribution)

人口普查数据按行政单元(如街区)汇总,与真实人口分布存在偏差。面插值(dasymetric mapping)用土地利用分类作为辅助数据,把总人口按居住适宜性重新分配到网格:

def dasymetric_population(population_raster, land_use_classified): """ Dasymetric population redistribution. """ # 1. Identify inhabitable areas inhabitable_mask = ( (land_use_classified != 0) & # Water (land_use_classified != 4) & # Industrial (land_use_classified != 5) # Roads ) # 2. Assign weights by land use type weights = np.zeros_like(land_use_classified, dtype=float) weights[land_use_classified == 1] = 1.0 # Residential weights[land_use_classified == 2] = 0.3 # Commercial weights[land_use_classified == 3] = 0.5 # Green Space # 3. Calculate weighting layer weighting_layer = weights * inhabitable_mask total_weight = np.sum(weighting_layer) # 4. Redistribute population total_population = np.sum(population_raster) redistributed = population_raster * (weighting_layer / total_weight) * total_population return redistributed

关键设计:排除水体、工业区、道路等不可居住区域;对居住区权重 1.0、商业区 0.3、绿地 0.5 进行加权;最后按weighting_layer / total_weight归一化,确保重新分配的总人口与原始总量守恒(np.sum(redistributed) ≈ total_population)。这种结果可直接用于公共服务选址、应急资源调度等高精度人口分布场景。

灾害管理:洪水与野火风险

洪水风险评估

flood_risk_assessment是「水文建模 → 淹没范围估算 → 暴露分析 → 脆弱性评估 → 风险计算 → 风险图输出」的完整链路:

def flood_risk_assessment(dem_path, river_path, return_period_years=100): """ Comprehensive flood risk assessment. """ # 1. Hydrological modeling flow_accumulation = calculate_flow_accumulation(dem_path) flow_direction = calculate_flow_direction(dem_path) watershed = delineate_watershed(dem_path, flow_direction) # 2. Flood extent estimation flood_depth = estimate_flood_extent(dem_path, river_path, return_period_years) # 3. Exposure analysis settlements = gpd.read_file('settlements.shp') roads = gpd.read_file('roads.shp') infrastructure = gpd.read_file('infrastructure.shp') exposed_settlements = gpd.clip(settlements, flood_extent_polygon) exposed_roads = gpd.clip(roads, flood_extent_polygon) # 4. Vulnerability assessment vulnerability = assess_vulnerability(exposed_settlements) # 5. Risk calculation risk = flood_depth * vulnerability # Risk = Hazard × Vulnerability # 6. Generate risk maps create_risk_map(risk, settlements, output_path='flood_risk.tif') return { 'flood_extent': flood_extent_polygon, 'exposed_population': calculate_exposed_population(exposed_settlements), 'risk_zones': risk } def estimate_flood_extent(dem_path, river_path, return_period): """ Estimate flood extent using Manning's equation and hydraulic modeling. """ # 1. Get river cross-section # 2. Calculate discharge for return period # 3. Apply Manning's equation for water depth # 4. Create flood raster # Simplified: flat water level with rasterio.open(dem_path) as src: dem = src.read(1) profile = src.profile # Water level based on return period water_levels = {10: 5, 50: 8, 100: 10, 500: 12} water_level = water_levels.get(return_period, 10) # Flood extent flood_extent = dem < water_level return flood_extent

原理与实现深度

  • 水文建模calculate_flow_direction可参考 scientific-domains.md 的 D8 算法——用 2 的幂编码 8 个流向(32/64/128/16/0/1/8/4/2),逐像元选取最大落差方向。flow_accumulationwatershed在其基础上累加汇水面积并划分子流域。
  • 淹没范围简化模型:注释明确指出完整实现应基于曼宁方程(Manning's equation)与水力模型计算断面流量与水深;简化版采用「平水面假设」——根据重现期(10/50/100/500 年)查表得到水位(5/8/10/12 米),dem < water_level得到淹没掩膜。更精细的做法参见 scientific-domains.md 的flood_inundation:加入ndimage.label连通分量过滤(只保留 >100 像元的水体连通块,排除孤立噪声像元),并以像元面积(如 30m×30m)计算淹没总面积;code-examples.md 的第 67 个示例则进一步输出淹没水深栅格depth = np.where(flooded, flood_level - dem, 0)
  • 暴露与风险:用gpd.clip将聚落、道路、基础设施与淹没多边形叠加求交,识别暴露资产;风险按经典的「风险 = 危险性 × 脆弱性」(risk = flood_depth * vulnerability)定义,最终输出flood_risk.tif风险分级图与暴露人口统计。

野火风险建模

wildfire_risk_assessment将多源因子相乘构成综合风险场,是可解释的乘性风险模型:

def wildfire_risk_assessment(vegetation_path, dem_path, weather_data, infrastructure_path): """ Wildfire risk assessment combining multiple factors. """ # 1. Fuel load (from vegetation) with rasterio.open(vegetation_path) as src: vegetation = src.read(1) # Fuel types: 0=No fuel, 1=Low, 2=Medium, 3=High fuel_load = vegetation.map_classes({1: 0.2, 2: 0.5, 3: 0.8, 4: 1.0}) # 2. Slope (fires spread faster uphill) with rasterio.open(dem_path) as src: dem = src.read(1) slope = calculate_slope(dem) slope_factor = 1 + (slope / 90) * 0.5 # Up to 50% increase # 3. Wind influence wind_speed = weather_data['wind_speed'] wind_direction = weather_data['wind_direction'] wind_factor = 1 + (wind_speed / 50) * 0.3 # 4. Vegetation dryness (from NDWI anomaly) dryness = calculate_vegetation_dryness(vegetation_path) dryness_factor = 1 + dryness * 0.4 # 5. Combine factors risk = fuel_load * slope_factor * wind_factor * dryness_factor # 6. Identify assets at risk infrastructure = gpd.read_file(infrastructure_path) risk_at_infrastructure = extract_raster_values_at_points(risk, infrastructure) infrastructure['risk_level'] = risk_at_infrastructure high_risk_assets = infrastructure[infrastructure['risk_level'] > 0.7] return risk, high_risk_assets

四个因子都经过归一化/阈值化处理,使结果落在可比较的区间:燃料载量按植被类型映射(0.2/0.5/0.8/1.0);坡度因子1 + (slope/90)*0.5将陡坡最多放大 50%(火向上坡蔓延更快);风速因子1 + (wind_speed/50)*0.3体现风助火势;干燥度因子基于 NDWI 异常(NDWI 的计算见 SKILL.md)放大风险最多 40%。坡度计算可用 SKILL.md 的terrain_metricsnp.gradient+arctan得到度数坡)。最后用extract_raster_values_at_points(等价于rasterio.sample.sample_gen,见 code-examples.md)把风险值落到基础设施点,筛选出risk_level > 0.7的高风险资产。

公用事业与基础设施:走廊巡检与管线选线

输电走廊植被越界分析

power_line_corridor_analysis将矢量缓冲与栅格掩膜结合,输出维护优先级图与工单点:

def power_line_corridor_analysis(power_lines_path, vegetation_height_path, buffer_distance=50): """ Analyze vegetation encroachment on power line corridors. """ # 1. Load power lines power_lines = gpd.read_file(power_lines_path) # 2. Create corridor buffer corridor = power_lines.buffer(buffer_distance) # 3. Load vegetation height with rasterio.open(vegetation_height_path) as src: veg_height = src.read(1) profile = src.profile # 4. Extract vegetation height within corridor veg_within_corridor = rasterio.mask.mask(veg_height, corridor.geometry, crop=True)[0] # 5. Identify encroachment (vegetation > safe height) safe_height = 10 # meters encroachment = veg_within_corridor > safe_height # 6. Classify risk zones high_risk = encroachment & (veg_within_corridor > safe_height * 1.5) medium_risk = encroachment & ~high_risk # 7. Generate maintenance priority map priority = np.zeros_like(veg_within_corridor) priority[high_risk] = 3 # Urgent priority[medium_risk] = 2 # Monitor priority[~encroachment] = 1 # Clear # 8. Create work order points from scipy import ndimage labeled, num_features = ndimage.label(high_risk) work_orders = [] for i in range(1, num_features + 1): mask = labeled == i centroid = ndimage.center_of_mass(mask) work_orders.append({ 'location': centroid, 'area_ha': np.sum(mask) * 0.0001, # Assuming 1m resolution 'priority': 'Urgent' }) return priority, work_orders

关键点:

  • 缓冲必须在投影坐标系下进行buffer(buffer_distance)的 50 米距离量纲要求 CRS 为米制投影,否则会得到度数缓冲(见 SKILL.md 的 CRS 最佳实践)。
  • 栅格掩膜提取rasterio.mask.mask(veg_height, corridor.geometry, crop=True)把走廊多边形对应的植被高度裁剪出来(code-examples.md 的第 72 个示例展示了同款rasterio.mask.mask用法)。
  • 风险分级与工单生成:安全高度阈值 10 米,超过 1.5 倍(15 米)为 Urgent、其余越界为 Monitor、未越界为 Clear;用scipy.ndimage.label对高风险连通区编号,逐块取质心生成工单(location质心坐标、area_ha面积换算——代码注释假设 1m 分辨率,每像元 1m²,故×0.0001转为公顷)。

管道选线:最小成本路径

optimize_pipeline_route是典型的加权图最短路径应用,其骨架(数据准备 + Dijkstra + 路径重建)可在真实项目中替换为skimage.graph.MCP_GeometricgdaltoolspgRouting等实现:

def optimize_pipeline_route(origin, destination, constraints_path, cost_surface_path): """ Optimize pipeline route using least-cost path analysis. """ # 1. Load cost surface with rasterio.open(cost_surface_path) as src: cost = src.read(1) profile = src.profile # 2. Apply constraints constraints = gpd.read_file(constraints_path) no_go_zones = constraints[constraints['type'] == 'no_go'] # Set very high cost for no-go zones for _, zone in no_go_zones.iterrows(): mask = rasterize_features(zone.geometry, profile['shape']) cost[mask > 0] = 999999 # 3. Least-cost path (Dijkstra) from scipy.sparse import csr_matrix from scipy.sparse.csgraph import shortest_path # Convert to graph (8-connected) graph = create_graph_from_raster(cost) # Origin and destination nodes orig_node = coord_to_node(origin, profile) dest_node = coord_to_node(destination, profile) # Find path _, predecessors = shortest_path(csgraph=graph, directed=True, indices=orig_node, return_predecessors=True) # Reconstruct path path = reconstruct_path(predecessors, dest_node) # 4. Convert path to coordinates route_coords = [node_to_coord(node, profile) for node in path] route = LineString(route_coords) return route def create_graph_from_raster(cost_raster): """Create graph from cost raster for least-cost path.""" # 8-connected neighbor costs # Implementation depends on library choice pass

原理说明

  • 成本面(cost surface)通常由地形坡度、土地类型、穿越成本等多因子叠加而成;禁入区(no-go zones,如保护区、居民区、水体)通过栅格化后赋极大成本(999999)实现「软禁止」。
  • 8 连通邻接图:每个像元与其 8 个邻居相连,边权可取两像元成本的均值(正交邻居)或乘以 √2(对角邻居,反映更长距离)。
  • Dijkstra 求解scipy.sparse.csgraph.shortest_path(..., return_predecessors=True)返回前驱矩阵,从终点回溯重建像元序列,再经node_to_coord转回地理坐标,最终构造成shapely.geometry.LineString
  • 该模式同样适用于道路选线、生态廊道设计、逃生路径规划等「穿越阻力最小」类问题;advanced-gis.md 与 specialized-topics.md 对该主题有更多网络分析论述。

交通运输:流量分析与公交服务区

交通流量与拥堵热点分析

traffic_analysis把道路网抽象为图,用 KNN 空间插值把稀疏的 AADT(年平均日交通量)观测值推广到全路网:

def traffic_analysis(roads_gdf, traffic_counts_path): """ Analyze traffic patterns and congestion. """ # 1. Load traffic count data counts = gpd.read_file(traffic_counts_path) # 2. Interpolate traffic to all roads import networkx as nx # Create road network G = nx.Graph() for _, road in roads_gdf.iterrows(): coords = list(road.geometry.coords) for i in range(len(coords) - 1): G.add_edge(coords[i], coords[i+1], length=road.geometry.length, road_id=road.id) # 3. Spatial interpolation of counts from sklearn.neighbors import KNeighborsRegressor count_coords = np.array([[p.x, p.y] for p in counts.geometry]) count_values = counts['AADT'].values knn = KNeighborsRegressor(n_neighbors=5, weights='distance') knn.fit(count_coords, count_values) # 4. Predict traffic for all road segments all_coords = np.array([[n[0], n[1]] for n in G.nodes()]) predicted_traffic = knn.predict(all_coords) # 5. Identify congested segments for i, (u, v) in enumerate(G.edges()): avg_traffic = (predicted_traffic[list(G.nodes()).index(u)] + predicted_traffic[list(G.nodes()).index(v)]) / 2 capacity = G[u][v]['capacity'] # Need capacity data G[u][v]['v_c_ratio'] = avg_traffic / capacity # 6. Congestion hotspots congested_edges = [(u, v) for u, v, d in G.edges(data=True) if d.get('v_c_ratio', 0) > 0.9] return G, congested_edges

实现要点:

  • 图建模:沿道路几何的每对相邻顶点建立带lengthroad_id的边;更工程化的做法是用 SKILL.md 的osmnx.graph_from_place()直接下载带属性(限速、通行时间)的路网,配合ox.add_edge_speeds()/ox.add_edge_travel_times()计算真实出行时间。
  • 空间插值KNeighborsRegressor(n_neighbors=5, weights='distance')用距离反比加权推断无观测路段的流量;若只有坐标而无路网,也可用 code-examples.md 的sklearn.neighbors.BallTree做最近邻查询。
  • V/C 比:路段流量(V)与通行能力(C)之比是衡量拥堵的国际通行指标,v_c_ratio > 0.9视为拥堵热点(代码注释提示需要额外准备容量字段capacity)。

公交服务区分析

transit_service_area回答「步行 X 分钟内能到达哪些区域」这一公交规划经典问题:

def transit_service_area(stops_gdf, max_walk_distance=800, max_time=30): """ Calculate transit service area considering walk distance and travel time. """ # 1. Walkable area around stops walk_buffer = stops_gdf.buffer(max_walk_distance) # 2. Load road network for walk time roads = gpd.read_file('roads.shp') G = osmnx.graph_from_gdf(roads) # 3. For each stop, calculate accessible area within walk time service_areas = [] for _, stop in stops_gdf.iterrows(): # Find nearest node stop_node = ox.distance.nearest_nodes(G, stop.geometry.x, stop.geometry.y) # Get subgraph within walk time walk_speed = 5 / 3.6 # km/h to m/s max_nodes = int(max_time * 60 * walk_speed / 20) # Assuming ~20m per edge subgraph = nx.ego_graph(G, stop_node, radius=max_nodes) # Create polygon from reachable nodes reachable_nodes = ox.graph_to_gdfs(subgraph, edges=False) service_area = reachable_nodes.geometry.unary_union.convex_hull service_areas.append({ 'stop_id': stop.stop_id, 'service_area': service_area, 'area_km2': service_area.area / 1e6 }) return service_areas

方法要点:

  • 双重可达性:先做 800 米直线缓冲(stops_gdf.buffer(800),需投影 CRS),再做基于路网的实际步行可达计算,两者结合更贴近真实步行路径。
  • 步速换算:默认步行速度 5 km/h(即 1.39 m/s),max_nodes用总步行时间 × 步速 / 每边平均长度(假设 ~20m/边)粗略换算成网络半径,nx.ego_graph取以站点节点为中心的可达子图。
  • 服务区面积:可达节点集合的凸包作为服务区多边形,输出area_km2(面积除以 1e6)。ox.distance.nearest_nodesox.graph_to_gdfs来自 osmnx,与 SKILL.md 的网络分析一脉相承。

行业工作流中的共性最佳实践

以上五个行业场景虽然领域不同,但共享同一套工程规范(源自 SKILL.md):

  1. 任何空间操作前校验 CRSassert gdf1.crs == gdf2.crs,面积/距离/缓冲一律用投影坐标系。
  2. 栅格大文件按块处理for i, window in src.block_windows(1)逐块读取,或dask.array.from_rasterio惰性计算(见 SKILL.md)。
  3. 云掩膜先行:光学影像(如 Sentinel-2)应先做云掩膜再计算 NDVI 等指数;SKILL.md 的 STAC 流程可用 SCL 波段或eo:cloud_cover < 20过滤云量。
  4. 几何校验与缺失处理gdf = gdf[gdf.is_valid]gdf['geometry'].fillna(None)
  5. 效率优先的格式:GeoPackage 优于 Shapefile,大批量数据用 Parquet / Arrow(gdf.to_file(..., use_arrow=True));GDAL 缓存gdal.SetCacheMax(2**30)可显著加速栅格 I/O。
  6. 可复现性:为每个工作流保存数据版本、CRS、参数与随机种子,保留数据血缘。

进一步阅读

  • industry-applications.md(本文的原始骨架,含全部代码与更多行业变体)
  • code-examples.md — 500+ 示例,覆盖分类、淹没制图、地形分析、栅格裁剪/合并/重投影等底层操作
  • scientific-domains.md — D8 流向算法、淹没建模、农业、林业等学科工作流
  • data-sources.md — Sentinel/Landsat/DEM/土地覆盖数据目录与 API 访问
  • SKILL.md — 安装、核心概念(CRS、OGC 标准)、光谱指数、云原生工作流与性能调优
  • advanced-gis.md 与 specialized-topics.md — 网络分析、最优化与专题深化的延伸主题

本文中的每个工作流都可作为独立基线:替换为本地真实数据(Sentinel-2 L2A 产品、SRTM/Copernicus DEM、OSM 路网与 POI)即可复用,在 SKILL.md 的 500+ 示例与性能指南辅助下扩展为生产级地理空间分析管线。

【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询