地理数据

Layer Stacking 波段合成教程:不同传感器波段组合对照与常见报错

👤 为我痴狂 👁 2 阅读 ❤ 0 点赞 ➦ 0 分享 📅 2026-09-27
首页› 遥感› 地理数据› 正文
Layer Stacking 波段合成教程:不同传感器波段组合对照与常见报错

从波段物理语义到工程落地——一条贯穿遥感数据融合全流程的分析主线

摘要

Layer Stacking(波段合成/图层堆叠)是遥感影像处理中最基础却最容易出错的环节之一。它看似只是把多个单波段栅格“叠”成一个多波段文件,实则涉及波段物理语义对齐、空间参考一致性、像元尺寸重采样、数据类型转换、NoData传播等一连串工程决策。本文以“语义对齐优先于空间对齐”为贯穿全文的分析主线,系统梳理Landsat 8/9、Sentinel-2、MODIS、GF-1/2、ZY-3等主流传感器的波段设置与组合对照,给出ENVI、GDAL、Python(rasterio)、Google Earth Engine、SNAP等多平台的实操路径,并对“波段数不匹配”“投影不一致”“像元对齐失败”“内存溢出”“NoData污染”等高频报错做根因分析与排查清单。全文兼顾理论深度与工程可操作性,并对云原生、多模态融合、基础模型时代的波段合成新范式做出研判。

本文评述:波段合成的本质不是文件格式转换,而是物理量语义的重新编排。只有先回答“每个波段代表什么物理量、量纲如何、动态范围多大”,再谈“怎么叠”,才能从源头规避绝大多数报错。

一、波段合成的本质:为什么“叠”这么难

1.1 从“文件叠加”到“语义编排”的认知升级

很多初学者对Layer Stacking的理解停留在“把几个tif拖进一个文件”的层面。这种理解在单传感器、同分辨率、同投影、同数据类型的理想场景下勉强够用,一旦跨传感器、跨分辨率、跨时相,立刻崩溃。笔者认为,波段合成的真正难点在于:每个波段都携带独立的物理语义、量纲、动态范围和空间属性,合成过程是一次多维属性的强制对齐。

以Landsat 8 OLI为例,Band 4(红,0.64–0.67 μm)与Band 5(近红外,0.85–0.88 μm)反射率量纲相同,但动态范围受缩放系数影响(Collection 2 Level-2产品需乘以0.0000275再减0.2才是真实反射率)。若直接与Sentinel-2 L2A(缩放系数1/10000)堆叠而不做归一,得到的NDVI会出现系统性偏差。这类问题在文献中常被笼统归为“辐射不一致”,但本文评述:其根源是语义层未对齐,而非单纯的数值问题。

1.2 波段合成的四个一致性维度

综合GDAL官方文档、USGS Landsat技术报告与ESA Sentinel-2用户手册,波段合成需要同时满足四个维度的一致性:

  • 空间一致性:投影坐标系(CRS)、仿射变换参数(GeoTransform)、像元尺寸必须一致或可重采样对齐;
  • 辐射一致性:辐射定标状态(DN/辐亮度/反射率)、缩放系数、太阳高度角校正需统一;
  • 语义一致性:波段中心波长、带宽、物理量含义需明确对应,避免“红波段叠到近红外”这类低级错误;
  • 元数据一致性:NoData值、数据类型(Byte/UInt16/Float32)、波段描述(band description)需规范。

这四个维度中,语义一致性最容易被忽视,却最致命。空间不一致会报错,辐射不一致会偏差,而语义不一致往往“静默出错”——程序不报错,结果全错。这正是本文将其确立为分析主线的理由。

工程提示:在动手Stack之前,先用 gdalinfo 或 rasterio.open().profile 打印每个波段的CRS、transform、dtype、nodata、description,逐项核对。这一步花5分钟,能省5小时debug。

1.3 波段合成的典型应用场景

波段合成并非孤立操作,它服务于下游一系列分析任务。根据近年文献统计(模拟数据,基于Web of Science 2021–2024遥感类论文抽样),波段合成主要服务于:

应用场景 典型波段组合 核心诉求
真彩色可视化R/G/B目视解译、制图
植被监测NIR/R、NIR/RedEdgeNDVI、EVI、红边指数
水体提取Green/NIR、NDWI水陆边界、浑浊度
地质蚀变SWIR1/SWIR2矿物填图
城市不透水面NIR/SWIR1NDBI、建筑指数
深度学习输入多波段+多时相通道对齐、张量构建

本文评述:不同场景对“一致性”的容忍度差异巨大。目视制图对辐射一致性要求低,但对空间对齐要求高;而定量反演(如叶绿素含量估算)对辐射一致性要求极高,空间上反而可以容忍一定重采样误差。因此,波段合成方案必须“因用制宜”,不存在万能模板。

二、主流传感器波段设置与物理语义对照

2.1 Landsat 8/9 OLI & TIRS

Landsat 8/9搭载OLI(Operational Land Imager)和TIRS(Thermal Infrared Sensor),共11个波段。根据USGS Landsat 8 Data Users Handbook(2019版)与Landsat 9最新文档,OLI波段设置如下:

波段名称波长(μm)分辨率(m)物理语义
B1Coastal0.43–0.4530气溶胶、浅水
B2Blue0.45–0.5130水体穿透、植被健康
B3Green0.53–0.5930植被绿度
B4Red0.64–0.6730叶绿素吸收
B5NIR0.85–0.8830植被生物量
B6SWIR11.57–1.6530植被水分、地质
B7SWIR22.11–2.2930矿物蚀变
B8Pan0.50–0.6815全色锐化
B9Cirrus1.36–1.3830卷云检测
B10TIRS110.60–11.19100地表温度
B11TIRS211.50–12.51100地表温度

需要注意的是,Landsat 9的OLI-2在波段设置上与Landsat 8基本一致,但辐射分辨率提升至14 bit,动态范围更大。本文评述:Landsat 8与9数据在Stack时虽可视为同源,但若混用,需注意辐射定标系数的细微差异,尤其是Collection 2产品中Landsat 9的反射率缩放系数与Landsat 8略有不同(USGS 2021年技术说明)。

2.2 Sentinel-2 MSI

Sentinel-2 MSI(MultiSpectral Instrument)提供13个波段,空间分辨率分为10m、20m、60m三档。根据ESA Sentinel-2 User Handbook(2023更新),核心波段如下:

波段名称中心波长(nm)分辨率(m)用途
B1Coastal44360气溶胶
B2Blue49010水体、植被
B3Green56010绿度
B4Red66510叶绿素吸收
B5RedEdge170520红边、氮素
B6RedEdge274020红边
B7RedEdge378320红边
B8NIR84210生物量
B8ANIR Narrow86520窄近红外
B9Water Vapor94560水汽
B10Cirrus137560卷云
B11SWIR1161020水分、地质
B12SWIR2219020矿物

Sentinel-2最大的工程痛点在于多分辨率波段共存。10m的B2/B3/B4/B8与20m的B5–B7/B8A/B11/B12在Stack时必须重采样。ESA官方推荐将20m波段重采样至10m(或反之),但重采样方法(最近邻、双线性、三次卷积)会显著影响红边指数计算。笔者认为,对于红边波段,优先采用双线性或三次卷积以保留光谱梯度信息;对于分类任务,最近邻可避免光谱污染。

2.3 MODIS

MODIS(Moderate Resolution Imaging Spectroradiometer)搭载于Terra(2000–)和Aqua(2002–)卫星,共36个波段,覆盖0.4–14.4 μm。根据NASA MODIS Level 1 User Guide,常用波段包括:

  • B1–B2:250m,红(620–670nm)、近红外(841–876nm),用于植被指数;
  • B3–B7:500m,蓝、绿、近红外、短波红外,用于地表反射率;
  • B8–B36:1km,涵盖海洋水色、大气水汽、温度等。

MODIS的波段合成常见于大尺度时序分析。本文评述:MODIS与Landsat/Sentinel-2的跨传感器Stack是“小样本+大尺度”融合的典型场景,但MODIS 250m与Landsat 30m的分辨率差异达8倍以上,直接Stack会导致严重的混合像元问题。实践中通常采用STARFM、ESTARFM等时空融合算法,而非简单Stack。

2.4 国产高分系列(GF-1/2/6、ZY-3)

根据中国资源卫星应用中心公开资料,GF-1 PMS(全色多光谱)提供2m全色+8m多光谱(蓝、绿、红、近红外),GF-2提升至1m/4m,GF-6新增红边波段(PMS2)。ZY-3则提供2.1m全色+5.8m多光谱。国产数据的波段合成常见问题包括:

  • 元数据中波段顺序与文件命名不一致(如B1/B2/B3/B4对应关系因传感器版本而异);
  • 部分产品未提供NoData值,需手动指定;
  • 辐射定标系数需从元数据XML中解析,而非硬编码。

本文评述:国产高分数据的波段语义文档化程度参差不齐,工程中最稳妥的做法是“一景一核对”,即对每景数据用gdalinfo确认波段描述,必要时手动写入band description。

三、波段组合对照表:从真彩色到专题指数

3.1 经典RGB组合对照

不同传感器的波段编号不同,但物理语义可对齐。下表给出跨传感器波段组合对照(以Landsat 8/9、Sentinel-2、GF-2为例):

组合名称Landsat 8/9Sentinel-2GF-2 PMS效果
真彩色B4-B3-B2B4-B3-B2B3-B2-B1自然色
标准假彩色B5-B4-B3B8-B4-B3B4-B3-B2植被红色
农业B6-B5-B2B11-B8-B2B4-B3-B1作物长势
城市B7-B6-B4B12-B11-B4B4-B3-B1建筑灰白
水体B5-B6-B4B8-B11-B4B4-B3-B2水体深蓝
地质B7-B5-B3B12-B8-B3B4-B3-B2岩性增强

本文评述:跨传感器波段对照不能只看编号,必须核对中心波长。例如GF-2的B1(蓝,0.45–0.52μm)与Landsat 8的B2(蓝,0.45–0.51μm)基本对应,但GF-2的B4(近红外,0.76–0.90μm)带宽明显宽于Landsat 8的B5(0.85–0.88μm),直接混用会导致NDVI数值差异。

3.2 专题指数所需波段组合

波段合成的直接目的往往是计算光谱指数。下表列出常用指数及其波段需求:

指数公式所需波段适用传感器
NDVI(NIR-R)/(NIR+R)NIR, Red全部
EVI2.5(NIR-R)/(NIR+6R-7.5B+1)NIR, Red, BlueLandsat, S2, MODIS
NDWI(G-NIR)/(G+NIR)Green, NIR全部
NDBI(SWIR1-NIR)/(SWIR1+NIR)SWIR1, NIRLandsat, S2
NDRE(NIR-RedEdge)/(NIR+RedEdge)NIR, RedEdgeS2, GF-6
SAVI1.5(NIR-R)/(NIR+R+0.5)NIR, Red全部

本文评述:指数计算前必须确保参与运算的波段已完成辐射定标和大气校正。用DN值直接算NDVI在数学上可行,但物理意义模糊,且不同时相不可比。这是波段合成流程中“辐射一致性”维度的直接体现。

四、工程实操:五大平台Layer Stacking全流程

4.1 GDAL命令行(通用性最强)

GDAL的gdal_merge.py和gdalbuildvrt是波段合成的基石工具。推荐流程:

# 方法一:gdal_merge.py 直接合并(适合小数据量)
gdal_merge.py -separate -o stacked.tif -co COMPRESS=LZW \
  -co TILED=YES B2.tif B3.tif B4.tif B5.tif

# 方法二:gdalbuildvrt + gdal_translate(推荐,内存友好)
gdalbuildvrt -separate -resolution highest stack.vrt B2.tif B3.tif B4.tif B5.tif
gdal_translate -of GTiff -co COMPRESS=LZW -co TILED=YES stack.vrt stacked.tif

# 检查结果
gdalinfo stacked.tif | grep -E "Band|Type|NoData|Description"

本文评述:gdalbuildvrt + gdal_translate的组合优于gdal_merge.py,因为VRT是虚拟文件,不占磁盘,且支持惰性计算,处理大区域时内存占用显著更低。此外,gdal_merge.py在遇到不同分辨率时会默认采用第一个文件的像元尺寸,容易导致对齐偏差。

4.2 Python + rasterio(自动化首选)

rasterio提供了更精细的控制能力。以下是一个生产级波段合成函数:

import rasterio
from rasterio.enums import Resampling
import numpy as np

def stack_bands(band_paths, out_path, resampling=Resampling.bilinear,
                dtype='float32', nodata=-9999):
    """按顺序堆叠多个单波段栅格,自动对齐到第一个波段的网格"""
    with rasterio.open(band_paths[0]) as src0:
        meta = src0.meta.copy()
        meta.update(count=len(band_paths), dtype=dtype,
                    nodata=nodata, compress='lzw', tiled=True)

    with rasterio.open(out_path, 'w', **meta) as dst:
        for idx, path in enumerate(band_paths, start=1):
            with rasterio.open(path) as src:
                data = src.read(1, out_shape=(dst.height, dst.width),
                                resampling=resampling)
                # 处理NoData
                if src.nodata is not None:
                    data = np.where(data == src.nodata, nodata, data)
                dst.write(data.astype(dtype), idx)
                dst.set_band_description(idx, f'Band_{idx}')
    print(f'Stacked {len(band_paths)} bands -> {out_path}')

本文评述:这段代码的关键在于out_shape参数,它让rasterio在读取时自动重采样,避免手动插值。同时,set_band_description写入波段描述,为后续处理保留语义信息,这是很多教程忽略的一步。

4.3 ENVI(传统遥感工作流)

ENVI的Layer Stacking工具位于File > Save As > Layer Stacking。操作要点:

  1. 选择输入文件时,注意ENVI默认按文件列表顺序堆叠,需手动调整波段顺序;
  2. 在“Layer Stacking Parameters”中设置重采样方法(Nearest/Bilinear/Cubic Convolution);
  3. 若输入文件投影不一致,ENVI会提示“Projection not match”,需先统一投影;
  4. 输出时建议勾选“Output to File”并指定数据类型(避免默认Byte导致反射率截断)。

本文评述:ENVI的Layer Stacking对大数据量支持较差,超过2GB的文件容易内存溢出。建议先用ENVI做子区裁剪,再用GDAL做最终Stack。

4.4 Google Earth Engine(云原生)

GEE中的波段合成通过ee.Image.cat()或ee.ImageCollection.toBands()实现:

// 方法一:cat() 合并不同Image的波段
var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
  .filterDate('2024-01-01', '2024-06-30')
  .filterBounds(roi).first();
var s1 = ee.ImageCollection('COPERNICUS/S1_GRD')
  .filterDate('2024-01-01', '2024-06-30')
  .filterBounds(roi).first();
var stacked = s2.select(['B2','B3','B4','B8'])
  .addBands(s1.select(['VV','VH']));

// 方法二:toBands() 将时间序列转为多波段
var ts = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2')
  .filterDate('2024-01-01', '2024-12-31')
  .filterBounds(roi)
  .select(['SR_B4','SR_B5']);
var stacked_ts = ts.toBands();  // 每个时相一个波段

Export.image.toDrive({image: stacked, description: 'stacked',
  scale: 10, region: roi, maxPixels: 1e13});

本文评述:GEE的波段合成天然解决了空间对齐问题,因为所有数据在服务端已统一到同一投影网格。但辐射一致性仍需手动处理——S2_SR是反射率×10000,S1_GRD是dB,直接cat会导致量纲混乱。建议在cat前用.multiply()统一量纲。

4.5 SNAP(Sentinel专用)

SNAP的Band Maths和Collocation工具可用于Sentinel-1/2/3的波段合成。典型流程:

  1. 打开所有待合成产品;
  2. 使用Radar > Coregistration > Stack Tools > Create Stack;
  3. 在Stack Editor中调整波段顺序;
  4. 导出为GeoTIFF或BEAM-DIMAP格式。

本文评述:SNAP的强项在于Sentinel-1的InSAR配准,而非多光谱波段合成。对于Sentinel-2多光谱Stack,SNAP的操作效率低于GDAL和rasterio,不建议作为首选。

五、常见报错根因分析与排查清单

5.1 报错类型一:波段数不匹配

典型报错:ERROR 1: Band 1: Unexpected number of bands 或 ValueError: Expected 4 bands, got 3

根因:输入文件波段数与预期不符。常见于:①Sentinel-2 L2A产品中B10(卷云)在某些版本中被移除;②Landsat Collection 1与Collection 2波段数不同;③部分国产数据将全色与多光谱分开存储。

排查:用gdalinfo查看每个文件的Band Count,确认实际波段数。若使用rasterio,打印src.count。

5.2 报错类型二:投影/坐标系不一致

典型报错:ERROR 1: Failed to compute min/max, no valid pixels found 或 Warning: Input file has different projection

根因:不同文件的CRS不同(如WGS84 vs UTM),或同一CRS但GeoTransform不同(如不同UTM带)。

排查与解决:先用gdalwarp统一投影到同一CRS,再Stack。推荐使用-t_srs EPSG:32650指定目标CRS。

# 统一投影后再Stack
for f in B2.tif B3.tif B4.tif B5.tif; do
  gdalwarp -t_srs EPSG:32650 -tr 10 10 -r bilinear $f ${f%.tif}_utm.tif
done
gdalbuildvrt -separate stack.vrt B2_utm.tif B3_utm.tif B4_utm.tif B5_utm.tif

5.3 报错类型三:像元对齐失败

典型报错:ERROR 1: Image dimensions do not match 或 RasterioIOError: Shape mismatch

根因:文件行列数不同,或GeoTransform的origin/resolution不一致。常见于Sentinel-2的10m与20m波段混用。

排查与解决:用gdalinfo对比Size和Pixel Size。解决方案:①用gdalwarp重采样到统一分辨率;②用rasterio的out_shape参数自动对齐;③在GEE中直接使用.resample()。

5.4 报错类型四:内存溢出

典型报错:MemoryError 或 ERROR 2: Out of memory

根因:一次性读取全部数据到内存。一个10000×10000×12波段的Float32文件约4.8GB,若同时读取多个文件,内存迅速耗尽。

解决:①使用VRT惰性计算;②分块处理(rasterio的block_windows);③使用gdal_translate -co TILED=YES -co BIGTIFF=YES;④在GEE中设置maxPixels。

5.5 报错类型五:NoData污染

典型表现:合成后影像出现黑色/白色条带,或统计值异常(如NDVI出现-9999)。

根因:不同文件的NoData值不一致(如一个为0,一个为-9999),或NoData未正确传播。

解决:①统一NoData值;②在Stack时用掩膜处理;③使用gdalbuildvrt -vrtnodata指定;④在rasterio中显式处理。

排查清单(Checklist):
□ 所有文件CRS一致?
□ 所有文件像元尺寸一致?
□ 所有文件行列数一致?
□ 所有文件数据类型兼容?
□ 所有文件NoData值统一?
□ 波段顺序与物理语义对应?
□ 辐射定标系数已统一?
□ 波段描述已写入?

六、进阶议题:重采样、辐射归一与NoData治理

6.1 重采样方法的选择

重采样是波段合成中最容易被“默认参数”坑掉的环节。GDAL支持多种重采样方法,其适用场景差异显著:

方法GDAL参数适用场景风险
最近邻near分类图、掩膜光谱不连续
双线性bilinear连续光谱数据边缘平滑
三次卷积cubic高保真制图过冲伪影
均值average降尺度细节丢失
众数mode分类数据降尺度类别偏移

本文评述:对于Sentinel-2的红边波段(B5–B7),推荐使用双线性或三次卷积,因为红边区域光谱梯度大,最近邻会导致“阶梯效应”,影响NDRE等指数的连续性。而对于土地覆盖分类结果的重采样,最近邻是唯一正确选择。

6.2 辐射归一化:跨传感器Stack的核心难题

跨传感器波段合成时,即使都转换为地表反射率,不同传感器的光谱响应函数(SRF)差异仍会导致系统性偏差。根据近年研究(如Claverie等2018年发表于Remote Sensing的Landsat-Sentinel-2交叉定标研究),Landsat 8与Sentinel-2在红波段的一致性较好(偏差<2%),但在近红外波段偏差可达5%–8%。

常用的辐射归一化方法包括:

  • 线性回归法:以高精度传感器为参考,建立波段间线性关系;
  • 直方图匹配法:强制两传感器反射率分布一致;
  • 光谱响应函数校正法:基于SRF卷积,物理意义最强但需SRF数据;
  • 机器学习法:随机森林、神经网络等,适合非线性关系。

本文评述:直方图匹配法虽然简单,但会破坏物理量纲,不适合定量反演。笔者建议在定量应用中优先使用SRF校正法,在目视制图中可用直方图匹配快速出图。

6.3 NoData治理策略

NoData是波段合成中最隐蔽的“污染源”。一个典型的坑:Landsat Collection 2 Level-2产品的NoData值为0,但有效反射率范围是-0.2到1.0(缩放后),0恰好是有效值。若直接设置nodata=0,会把大量有效像元误判为NoData。

治理策略:

  1. 优先使用产品自带的QA波段(如Landsat的QA_PIXEL、Sentinel-2的SCL)生成掩膜;
  2. 若必须用数值判断,选择物理上不可能出现的值(如-9999);
  3. 在Stack时统一NoData值,并在元数据中明确记录;
  4. 下游计算前用numpy.ma.masked_array或rasterio的mask机制处理。

七、前沿研判:云原生与基础模型时代的波段合成

7.1 云原生:从“下载-Stack”到“按需合成”

传统波段合成是“先下载、后处理”,而云原生遥感(Cloud-Native Geospatial)倡导“数据不动、计算动”。STAC(SpatioTemporal Asset Catalog)规范与COG(Cloud Optimized GeoTIFF)格式的结合,使得波段合成可以在云端按需完成。例如,使用stackstac库可以直接从STAC目录构建多波段数组:

import stackstac, pystac_client
catalog = pystac_client.Client.open("https://earth-search.aws.element84.com/v1")
items = catalog.search(collections=["sentinel-2-l2a"],
                       bbox=roi, datetime="2024-01-01/2024-06-30").item_collection()
stack = stackstac.stack(items, assets=["blue","green","red","nir"],
                        resolution=10, epsg=32650)
# stack 是 dask 数组,惰性计算,不占内存

本文评述:云原生范式从根本上改变了波段合成的工程逻辑——不再需要本地管理文件,而是通过API按需拉取。但这也带来新挑战:网络延迟、API限流、数据版本漂移。笔者认为,未来3–5年,本地Stack与云原生Stack将长期共存,前者适合小区域精细处理,后者适合大区域时序分析。

7.2 基础模型时代的波段合成:从“人工对齐”到“语义嵌入”

随着Prithvi、SpectralGPT、SkySense等遥感基础模型(Foundation Model)的兴起,波段合成的角色正在发生变化。这些模型通常接受多波段、多时相输入,但其预训练时的波段配置各异。例如,IBM-NASA的Prithvi-100M使用6个HLS波段(蓝、绿、红、近红外、SWIR1、SWIR2),若输入Landsat 8的11波段,需要选择对应波段并调整顺序。

本文评述:基础模型对波段合成的“语义一致性”要求更高,因为模型权重是在特定波段配置下训练的,波段顺序错位会导致性能断崖式下降。笔者建议:在将数据输入基础模型前,务必核对模型的波段配置文档,必要时用.select()显式选择并重排波段。

7.3 多模态融合:SAR+光学+LiDAR的波段级对齐

多模态遥感融合是近年热点。Sentinel-1 SAR与Sentinel-2光学的联合使用,需要在波段级完成对齐。但SAR的VV/VH是后向散射系数(dB),光学是反射率,两者物理量完全不同。简单的cat()堆叠在数学上可行,但物理意义模糊。

本文评述:多模态波段合成的关键不是“叠”,而是“归一”。建议将SAR后向散射归一化到[0,1]区间,或使用标准化(z-score)处理,使不同模态数据在数值尺度上可比。同时,SAR的斑点噪声需先做Lee滤波或Refined Lee滤波。

八、结论与可复用操作模板

8.1 核心结论

本文以“语义对齐优先于空间对齐”为主线

分享到

💬
微信
📷
朋友圈
🐧
QQ好友
🌐
QQ空间
👁
微博
📌
钉钉
🔗
复制链接
📑
复制图文

微信扫一扫分享

打开微信「扫一扫」,扫描二维码后在微信中分享给好友或朋友圈。

💬 评论 (0)

评论功能已关闭

⏸️ 本站暂未开放评论功能,不能进行评论,此为规划的后续开发预留
首页| 关于本网| 网站声明| 联系我们| 网站纠错| 服务| 网站地图
黔ICP备19010680号-1  |  邮箱:six528528@163.com
贵公网安备 52010302001819号
Copyright 2019-2026 http://www.databrush.com/ All rights reserved.
QQ
QQ扫一扫
Logo
DBN数据刷