
简介《云瞰平台基础操作指导书》是一份面向通信网络优化工程师、无线技术人员与数据分析人员的实操性文档系统讲解平台登录、指标查询、多窗口对比、自定义图层绘制与导入、数据导出及栅格级指标分析等核心功能。文档重点演示如何按业务专题、行政区、运营商和LTE/NR制式查询RSRP、SINR、MR质差、重叠覆盖等基础覆盖指标以及VoLTE接通率、掉话率、语音质量等体验类指标并可通过多边形自定义区域完成考场、楼宇等专项场景的精细化洞察和问题规整辅助网络优化决策同时覆盖整体、室内、室外、道路等业务专题及天/周/月时间粒度选择。资源包共1个docx文档约8.44MB读者可按章节索引快速定位查询、图层与导出模块适合结合真实项目逐步练习也可作为日常KPI监控、跨运营商对比及汇报报表制作的方法参考。目前已有415人学习下载内容结构清晰、步骤完整能帮助读者较快上手云瞰平台提升栅格级分析与自定义图层操作的效率。1. 栅格级指标分析为什么是网优的“显微镜”云瞰平台解决什么通信网络优化的日常一半时间在找问题另一半时间在证明问题不是玄学。小区级KPI只能告诉你某个基站“平均还行”但一片区域的差到底差在哪个路口、哪个楼栋平均值根本说不清。云瞰平台的栅格级指标分析就是把海量MR测量报告、扫频数据和路测打点按50米×50米的网格切分再通过自定义图层操作把RSRP、SINR、CQI、上行干扰叠加到真实地图上让弱覆盖区、高干扰区、容量受限区从“看不见的黑匣子”变成“一眼能圈出来的多边形”。这套方法适合三类人每天要处理用户投诉的网优工程师、做路测数据二次开发的优化主管、以及要给运营商交付专题报告的数据分析人员。它解决的核心问题不是“哪里差”而是“差在哪里、差到什么程度、和什么相关”并且让结果能导出、能复现、能进报告。这篇笔记我就按自己做这类平台落地的路径把栅格化、图层操作、指标评估和数据导出设计一条线讲透。2. 栅格化与指标口径把千万元素话单变成一张能决策的网格图栅格级分析的第一步不是画图而是把原始测量数据“切”成网格。这一步做得不扎实后面所有图层和报告都是在给错误数据化妆。本节先说清楚栅格尺寸和聚合算法怎么选再给出云瞰平台上的任务配置方式最后讲三个最容易在指标口径上翻车的点。2.1 栅格尺寸与聚合算法的选型逻辑栅格尺寸的选择是所有参数里最早定、也是最难改的一个。常见做法是城区用50米郊区用100米密集商圈或室内外结合分析时用20米到25米。这里有个容易误解的地方栅格越小不代表越准。MR定位的精度本身受限于TA量化步长与AOA测量误差典型误差在50米到150米之间如果你强行切20米栅格一个采样点只是被随机甩到了周边某一个格子里反而让空间分布看起来更“碎”。所以我的经验是先确认源数据的定位精度再定栅格尺寸栅格边长至少大于定位精度的1/2。聚合算法决定了每个格子里几十条甚至几百条采样点如何变成一个数。最常用的是均值法适合表达整体水平但如果你的目标是找“最差区域”均值会把坏点稀释掉这时候用“最差法”或“占比法”更合适。比如RSRP弱覆盖评估我一般同时算两个值该栅格RSRP均值以及RSRP低于-110dBm的采样点占比。占比比均值更能暴露问题因为一个栅格可能90%的采样都达标但另外10%的点恰好都在某个楼栋背面均值看着没问题投诉却集中在这里。参数推荐取值适用场景备注栅格尺寸50m城区/100m郊区/25m室内外按场景切换需与定位精度匹配聚合算法均值/加权均值/占比/最差均值看整体占比找短板建议双指标输出采样点阈值≥5 点/栅格保证统计稳定性低于阈值标记“无数据”时间粒度1小时/忙时/全天按分析目标切换对比时必须固定采样点阈值是栅格化里最容易被忽略的参数。全城每天几千万条MR分布极不均匀主干道栅格可能有几百个点城中村深处可能就一两点。没有阈值过滤一两个异常采样点就能让整个栅格变成红色这种假弱覆盖在报告里极难解释。我一般把它设为5低于5个采样点的栅格直接算无数据图层上用灰色表示而不是强行给值。2.2 用云瞰平台配置栅格统计任务的完整流程云瞰平台这类GIS网优平台通常把栅格统计配置成“数据源-过滤-聚合-输出”四段式任务。我用一个JSON配置来演示最典型的栅格统计任务这是我在多个同类平台之间迁移后形成的通用写法{ gridTask: { name: 某城区_LTE_忙时栅格统计, source: { type: mr, table: mr_raw_current, timeField: timestamp, timeRange: [2025-06-10 09:00:00, 2025-06-10 21:00:00] }, gridSize: 50, aggregateBy: [RAT, BAND, CELL_ID], aggregates: [ { field: RSRP, func: avg, alias: rsrp_avg }, { field: RSRP, func: pct_lt, threshold: -110, alias: rsrp_lt110_pct }, { field: SINR, func: avg, alias: sinr_avg }, { field: CQI, func: pct_lt, threshold: 7, alias: cqi_lt7_pct } ], filters: { insidePolygon: true, minSamplingCount: 5 }, output: { type: grid_layer, style: { palette: blues_reds, opacity: 0.7 } } } }这份配置做的事情是把6月10日忙时9点到21点的MR原始表按50米栅格切分并以RAT、频段、小区三个维度分组每个栅格输出RSRP均值、RSRP低于-110dBm的采样占比、SINR均值、CQI低于7的采样占比。逻辑上要注意两个关键点。第一aggregateBy里放CELL_ID是为了后续能下钻到小区维度。如果不放同一个栅格内多个小区的采样会全部混在一起后面做“栅格-小区交叉分析”时就少了一条通路。第二minSamplingCount放在filter而不是aggregate里含义是先过滤再聚合这与先聚合再过滤的效果完全不同。先聚合再过滤会保留“基于一两个点算出来的极端值”而先过滤能保证每个栅格的结果都有统计基础这也是我在平台脚本里坚持的写法。2.3 指标口径统一三个最容易算错的维度栅格化配置本身不难难在让两个人在不同时间跑出来的指标能对上。我踩过太多口径不一致的坑这里挑三个最常见的。第一个是RSRP的过滤口径。有些统计会先剔除“服务小区RSRP为0或无效值”的采样有些不剔除还有一些统计对异频测量报告单独处理。同一个栅格用不同过滤规则跑出来可能差5dB以上。统一做法是只保留“服务小区RSRP有效且服务小区与栅格所属小区一致”的采样其他一律过滤掉。第二个是上行干扰的统计方式。上行干扰不能直接拿MR里某字段平均数因为不同厂商的上行干扰定义不一致有的用RTWP接收总宽带功率有的用NI噪声干扰数值基准也不一样。跨厂区对比时必须先做基准归一化把RTWP/NI统一转换为相对于底噪的抬升量比如“底噪3dB为强干扰门限”。不归一化就画图层看起来是全网高干扰实际上只是厂商字段口径没对齐。第三个是时间窗口的对齐。忙时定义在各地差异很大有的取9点到11点加19点到21点有的直接取10点到20点。栅格统计任务如果每次都手动修改时间范围历史对比基本没法做。正确做法是在平台里预置“忙时”时间模板所有任务引用同一个模板而不是手写时间字符串。这样后续换季度只需要改模板一处。3. 自定义图层操作把栅格数据变成网优能读得懂的专题图栅格统计跑完数据还是一张宽表不直观。自定义图层操作是这个环节的核心把不同指标渲染成带颜色、粒度可调的专题图层并叠加基站、道路、行政区等参考图层让分析从“查数字”变成“看地图”。本节讲图层体系设计、渲染方案以及一个可以自动操作图层的Python脚本。3.1 图层体系与渲染方案设计我通常把一个网优分析工程拆成四类图层底图、栅格专题图层、点线参考图层、标注图层。底图只承担地理参考功能渲染成灰白色避免抢戏栅格专题层放在底图之上半透明显示基站扇区、天线方向角、道路边界放在第三层最后是标注层放重点区域、投诉点、测试路线。图层顺序看起来是个小问题但实际操作中让不少人翻了车。云瞰平台的图层按“下-上”叠加顺序渲染如果你把灰度底图放在栅格层之上整个栅格专题图会被盖住只有调透明度才能看到一点点。我一般会用“下到上底图→栅格专题层→基站/扇区层→投诉标注层→区域框选层”的顺序。其中栅格专题层的透明度设置在0.6到0.8之间既能透出底图道路走向又不影响颜色辨识。栅格专题层的渲染关键是分级设色。RSRP层次色一般用绿色≥-95dBm、黄色-105到-95dBm、橙色-115到-105dBm、红色小于-115dBm。SINR用蓝黄红大于15dB蓝色5到15dB黄色小于5dB红色。CQI低于7的占比超过20%时标紫。色阶要固定成平台级模板这样不同时间生成的图层颜色含义一致出报告时才不需要反复解释图例。指标第一档第二档第三档第四档RSRP≥-95dBm绿-105~-95黄-115~-105橙-115红SINR≥15dB蓝5~15黄0~5橙0红CQI7占比5%绿5%~15%黄15%~30%橙30%红上行干扰抬升3dB绿3~6dB黄6~10dB橙10dB红3.2 图层叠加与联动分析多维度交叉定位弱覆盖单看RSRP栅格图你能找到弱覆盖区域但不知道它为什么弱。自定义图层的价值就在于把多个维度叠到同一画布上做交叉定位。一个典型的联动分析流程是先在RSRP格图上框选出低于-110dBm的栅格集合然后叠加SINR图层如果这些栅格同时SINR低于0说明不只是覆盖不足还存在强干扰问题很可能是越区覆盖。我会进一步叠加基站扇区图层和天线方位角。某城区一个连续弱覆盖带小区平均RSRP只有-102dBm看似由距离导致但栅格图上发现弱栅格集中在两个扇区交叠的夹角区域叠加方位角后确认是天线朝向与街道方向不一致导致阻挡反射薄弱区。这种结论在小区级KPI上根本看不出来只有图层叠加才能定位到“具体是哪一面天线对着哪条街”。联动分析在云瞰平台里一般靠空间筛选实现选中图层A的区域反向关联图层B中与该区域相交的栅格或小区。操作上要注意筛选条件是用“与区域相交”还是“完全位于区域内”。栅格中心点恰好在边界上的情况非常多如果平台支持优先用“中心点落在区域内”而不是“相交”后者会把外圈大量无关栅格也带进来造成统计范围虚大。3.3 图层操作的自动化脚本示例图层操作如果全靠鼠标点一次两次可以全城几十个栅格任务根本点不过来。云瞰平台一般提供图层服务接口我用一个Python脚本演示自动创建栅格图层并叠加参考图层的过程import requests from datetime import datetime BASE_URL http://yunkan-server/api/v1 HEADERS {Authorization: Bearer token} def create_rsrp_layer(grid_size50, task_date2025-06-10): payload { name: fRSRP_Grid_{task_date}, layerType: grid, gridSize: grid_size, metric: RSRP, aggregation: avg, colorRamp: [ {min: -115, color: #FF0000}, {min: -105, color: #FF8800}, {min: -95, color: #FFFF00}, {min: -95, color: #00FF00, toMax: True} ], opacity: 0.7, timeRange: [f{task_date} 09:00:00, f{task_date} 21:00:00] } resp requests.post(f{BASE_URL}/layers, jsonpayload, headersHEADERS) layer_id resp.json()[layerId] # 创建扇区参考层用于交叉分析 sector_payload { name: fSector_{task_date}, layerType: sector, field: azimuth, showLabel: False } resp2 requests.post(f{BASE_URL}/layers, jsonsector_payload, headersHEADERS) sector_id resp2.json()[layerId] # 设置图层顺序底图在下栅格层在上扇区层在上 requests.put(f{BASE_URL}/layers/order, json{order: [base_map, layer_id, sector_id]}, headersHEADERS) return layer_id, sector_id if __name__ __main__: gid, sid create_rsrp_layer() print(fcreated grid layer {gid}, sector layer {sid})脚本的逻辑是先用POST创建栅格专题图层传四段色阶和透明度再创建扇区参考层最后一次性调整图层顺序。注意colorRamp里我用了“到最大值”的写法如果不加toMax标记最亮的一档只会覆盖恰好等于-95dBm的栅格其余高于-95的所有栅格都会被漏掉这是常见的渲染边界问题。参数上最值得调的是colorRamp断点。断点的设置应该与平台图例表格保持一致并且修改后要重建旧图层不能只改当前图层否则新旧图层的颜色含义会不一致。这也是为什么我会把色阶模板通过配置中心下发而不是直接在脚本里硬编码。4. 网络性能洞察与数据导出系统设计从“看图”到“交报告”栅格图能看但优化动作要落到报告和工单上。这一章解决两件事一是怎么用多维度评估模型把栅格数据变成优化建议二是怎么设计一套能稳定导出、能进报告的数据导出系统。后者往往是项目验收时被卡得最久的环节。4.1 多维度评估模型覆盖、干扰、容量、质量四象限只看RSRP一个维度会把很多“覆盖不差但体验差”的区域漏掉。我把栅格级评估拆成四个维度每个栅格都要能回答四个问题覆盖够不够、干扰大不大、容量紧不紧张、质量达不达标。维度核心指标常用门限对应用户体验覆盖RSRP均值、RSRP-110占比占比20%判定弱覆盖掉话、无法接入干扰SINR均值、上行干扰抬升SINR0或抬升6dB速率低、时延大容量PRB利用率、激活用户数PRB60%判定拥塞感知速率下降质量CQI7占比、掉线率占比20%判定质差视频卡顿、语音断续实际操作时我给每个栅格打标签良好区、弱覆盖区、干扰区、容量受限区、质差区。如果一个栅格同时命中多个维度就按优先级归入最严重的那一类。优先级顺序我一般设为容量受限干扰质差弱覆盖因为在城区网络里容量拥塞会引发干扰和质差只做覆盖优化根本无效。栅格评估结果还要和小KPI做交叉验证。某个栅格被标记为干扰区如果它覆盖的小区同时出现切换成功率下降就能互相印证如果KPI完全正常则可能是栅格统计口径有误先回头检查采样点过滤条件再做决策。这个交叉验证步骤能筛掉至少三成的假问题避免把报告里的“红图”全部当成优化工单下发。4.2 数据导出系统的核心流程与格式设计数据导出是整个系统里最容易被低估的部分。栅格图在平台里看着很好但运营商的日报、月报要的是能放进PPT的图片和能二次统计的表格。一套实用的导出系统至少要支持四种产物栅格矢量数据GeoJSON/Shapefile、栅格指标统计表Excel/CSV、渲染后专题图PNG、以及按模板生成的分析Word/PDF报告。产物推荐格式适用场景关键点栅格矢量GeoJSON默认Shapefile需打包GIS二次分析与平台间迁移坐标系写进元数据统计表Excel分sheet / CSV报告附表、筛选排序单sheet不超过5万行专题图PNG300dpi插入报告带图例、比例尺、指北针分析报告Word/PDF交付客户图表与结论联动导出流程我建议做成“查询条件→栅格聚合→样式渲染→导出”四段式。查询条件是区域多边形、时间范围、栅格尺寸、指标组合聚合阶段在服务端完成不能把原始MR拉到前端再聚否则性能和内存都扛不住渲染阶段决定专题图的配色和标注导出阶段将矢量数据与统计表一并打包。我见过最多的问题是“全城导出”式操作用户直接选全市范围导出所有栅格结果是几个G的数据文件Excel打不开地图服务也卡死。血泪经验告诉我导出系统一定要加两个约束一是按行政区或网格单元分批二是强制过滤无效栅格采样点数少于5的栅格直接不导出。前者保证文件规模可控后者保证导出数据有统计意义。4.3 导出模块的代码骨架与关键参数我用一个Python函数演示导出栅格统计表到Excel的骨架这套写法同样适用于其他平台只要把接口换成对应的即可import pandas as pd from openpyxl import Workbook def export_grid_stats(bounds, grid_size, time_range, sampling_threshold5): # bounds: [minLon, minLat, maxLon, maxLat] params { bounds: bounds, gridSize: grid_size, timeRange: time_range, minSamplingCount: sampling_threshold, coordinateSystem: EPSG:4326 } # 这里调用云瞰平台查询接口返回栅格聚合结果 rows query_grid_stats(params) # 返回list[dict] df pd.DataFrame(rows) # 过滤无效采样点较少的栅格 df df[df[samplingCount] sampling_threshold] # 分sheet避免单sheet过载 with pd.ExcelWriter(grid_stats.xlsx, engineopenpyxl) as writer: stats_sheet df.drop(columns[polygon]).copy() stats_sheet.to_excel(writer, sheet_name栅格指标, indexFalse) geom_sheet df[[grid_id, polygon]].copy() geom_sheet.to_excel(writer, sheet_name栅格边界, indexFalse) summary { 总栅格数: len(df), 有效栅格数: int((df[samplingCount] sampling_threshold).sum()), 弱覆盖栅格数: int((df[rsrp_lt110_pct] 0.2).sum()) } pd.DataFrame(summary.items(), columns[指标, 数值]).to_excel( writer, sheet_name汇总, indexFalse) return grid_stats.xlsx这段代码的关键在于把“栅格指标”和“栅格边界”拆成两个sheet。如果合在一起几何对象会让Excel体积暴涨而分开后指标sheet保持为纯数值表边界sheet可以进一步转GeoJSON。coordinateSystem参数必须显式传递否则导出到其他GIS工具时图层位置会整体偏移。参数调整上coordinateSystem建议统一用EPSG:4326存储展示用EPSG:3857投影。栅格尺寸、时间范围和minSamplingCount这三个参数必须在任务创建时锁定并写入元数据导出时不允许临时改动。这样才能保证不同批次导出的数据在设计上具备可比性后续做趋势分析时不用重新计算。5. 栅格级指标分析与图层导出避坑现象、原因、解决这一章把我在栅格分析和图层交付里遇到的具体问题集中写出来每一条都按“现象→原因→解决”记录希望能帮你少走几段弯路。5.1 栅格边界漂移与采样点抖动的处理现象同一个位置在6月栅格图里属于“良好区”到了7月突然变成“弱覆盖区”但实际网络没有改造基站参数也没动。 原因MR采样点的定位结果本身就是概率分布同一个终端在不同时刻解算出的经纬度会有几十到上百米的抖动。栅格边界是硬切的一个采样点只要抖动跨过边界就会改变相邻两个栅格的统计结果边界栅格的指标因此很不稳定。 解决先确认栅格尺寸是否过小小于定位精度一半的栅格直接放弃然后用空间平滑替代硬边界每个栅格输出时把周围相邻3×3栅格的采样点按距离权重一并纳入统计相当于给栅格图做了一次低通滤波。我一般在平台后处理阶段加一步平滑能明显减少边界上的突变点。注意平滑会降低峰值纯弱覆盖定位场景要保留原始栅格副本对比。5.2 坐标系与图层顺序造成的“看起来不对”现象栅格专题层和基站扇区层叠在底图上栅格整体偏移向东几十米或者栅格层时隐时现让不同图层的点状信息无法对应。 原因最常见的是栅格数据用了EPSG:4326而底图和基站图层用了EPSG:3857或者反过来。GIS平台会自动做投影转换但某些导入接口要求预先指定几何字段的坐标系一旦没指定平台默认按WGS84读取平面坐标就被错误地当作经纬度渲染。 解决所有图层创建前先明确坐标系并在脚本里对栅格几何对象统一转换为EPSG:4326存储。验证方法很简单叠加一个已知精确经纬度的地标点缩放后看偏移是否小于一个栅格边长。图层顺序问题同理在自动化脚本里显式设置order不要依赖底图默认置底。每次新建工程后先用一个已知小区位置做几何对齐检查再开始正式分析。5.3 导出大数据量时的内存与编码问题现象按全市范围导出栅格统计表脚本跑到一半内存爆炸或者生成的Excel打开要十几分钟更严重的是导出后经纬度列里的中文和正负号乱码。 原因按天按栅格按小区三者的笛卡尔积导出行数会非常恐怖。一个中等城市50米栅格约80万个按天导出就是几十万行如果再把小区维度展开行数直接到千万级。Excel本身的单sheet行数限制是1048576行并不适合承载这种量级。 解决导出时强制三个条件一是按行政区范围拆分导出单次不超过5万个有效栅格二是只导出通过采样点阈值的栅格无效栅格不占体积三是用Parquet作为中间格式做数据落地最后再按报告需要转成Excel分sheet或GeoJSON。编码问题统一在导出层用UTF-8处理Excel模板里保持对UTF-8 CSV的兼容导入不要直接手写Excel存中文。5.4 时间口径不一致导致指标对不上现象同一栅格日报计算结果和月报计算结果相差超过3dB但明明用的是同一版本算法。 原因日报用的是“昨日全天”月报用的是“昨日忙时”或者日报统计到当日凌晨2点而MR原始表里还有一部分时延数据在凌晨3点才入库导致日报少统计了一段数据。另外如果时间字段存的是UTC而平台展示用的是本地时间跨时区查询会进一步放大偏差。 解决统一时间口径为“采集时间入库时间戳对齐到正点”忙时模板固定为9:00-11:00加上19:00-21:00禁止在单次任务里手改时间范围。导出时在文件名里自动拼上时间模板ID例如grid_stats_taskA_20250610.xlsx让报表使用者一眼看到时间口径来源。5.5 栅格统计周期切换后的历史数据对比失真现象把某区域栅格统计的聚合周期从“按小时”改成“按天”后与上周数据对比出现600多个栅格指标突变现场勘察没有任何变化。 原因统计周期变化会影响采样点数量也会改变栅格的聚合结果。例如按小时统计时忙时和非忙时各自输出独立栅格值按天统计时所有时段的采样被混在一起平均弱覆盖时段被稀释指标自然对不上。 解决历史对比必须锁定“同一个统计周期同一组参数”。我习惯每次导出前先检查任务版本号如果版本不一致宁可重新计算旧周期数据也不要直接拿新旧两期做对比。在报告里我还会附上一屏“参数指纹”表格包含栅格尺寸、统计周期、采样阈值、忙时模板、坐标系五个字段参数一变结论自动失效。6. 进阶把栅格级分析接入日常优化闭环的一个小技巧栅格分析如果只是用来出一张大图价值有限。我建议做一个“周级栅格变化检测”把每周的栅格指标与基线图层自动做差值只输出变化超过阈值的栅格再把这些栅格自动汇总成重点核查清单直接对接工单系统。具体做法分三步。第一步每周自动生成当期栅格图层指标固定为RSRP均值、SINR均值、采样数第二步与上月同周基线做差筛选Delta_RSRP小于-3dB且连续两周出现的栅格第三步把这些栅格按行政区域聚类输出到Excel每行带栅格ID、中心经纬度、当前值、基线值、差值、覆盖小区列表。这样做的好处是优化工程师每周不用再从头看全城栅格图只需要处理变化清单效率高很多。def weekly_delta_report(current_df, baseline_df, rsrp_delta-3.0): merged current_df.merge( baseline_df[[grid_id, rsrp_avg, sinr_avg]], ongrid_id, suffixes(_curr, _base) ) merged[rsrp_delta] merged[rsrp_avg_curr] - merged[rsrp_avg_base] merged[sinr_delta] merged[sinr_avg_curr] - merged[sinr_avg_base] flagged merged[ (merged[rsrp_delta] rsrp_delta) (merged[sinr_delta] 0) ].copy() flagged[level] pd.cut( flagged[rsrp_delta], bins[-999, -10, -5, 0], labels[严重恶化, 明显恶化, 轻度恶化] ) flagged.sort_values(rsrp_delta).to_excel( weekly_grid_delta.xlsx, sheet_name变化栅格, indexFalse ) return flagged这段脚本的关键是把“绝对差”和“相对变化”结合使用只筛掉绝对指标本身正常的栅格。通过pd.cut把变化量分档报告里就能按严重程度排序处理不用再人工翻图层判断优先级。做这个功能时我学到的教训是变化检测最容易翻车的地方不是算法而是基线的清洁度。基线图层必须用同一统计周期、同一忙时模板生成我第一版直接拿历史月报栅格当基线结果月报的时间口径与周报不一致全城一半栅格都显示恶化把所有人都吓了一跳。后来改成重新计算基线才恢复正常。这个坑给所有想加自动化分析的人提个醒参数口径永远比算法本身更容易出问题跑通之后先做三个栅格的本地比对再放开到全量。希望这套栅格级分析、自定义图层和数据导出的方法能帮到你让每一张栅格图都能真正推动一次优化动作落地。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。