需先解压sentinel-2 l2a级safe数据包,进入img_data/r10m子目录确认b04(红光)和b08(近红外)波段tiff文件存在,为后续ndvi计算提供基础数据。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在Linux服务器上直接处理Codex遥感卫星影像,完成从原始数据加载、NDVI计算、长势分级到地块矢量化输出的全流程,必须避开Windows专属GIS软件依赖,全程使用开源命令行工具链。你手头已有Sentinel-2 L2A级SAFE格式数据包,且系统已安装GDAL 3.8+、Python 3.10+、rasterio、numpy、scikit-image、ogr2ogr可用,但未预装QGIS或ArcGIS——这恰恰是本方案的起点。
解压并校验Sentinel-2 SAFE数据包
进入存放压缩包的目录,执行:unzip S2B_MSIL2A_20260528T031549_N0509_R075_T49QEE_20260528T054220.zip。
解压后进入生成的SENTINEL2B_……/GRANULE/L2A_T49QEE_A029872_20260528T031549/IMG_DATA/R10m/子目录,确认存在
运行gdalinfo B04.jp2 | grep "Size\|Projection",核对四波段图像尺寸一致(如10980×10980)、投影为EPSG:32649(UTM Zone 49N),否则后续配准会失败。
批量重采样与波段堆叠
方法一:用gdalwarp统一重采样至相同分辨率与地理范围
执行:gdalwarp -tr 10 10 -t_srs EPSG:32649 -r bilinear -co COMPRESS=DEFLATE B02.jp2 B02_10m.tif,对B02/B03/B04/B08逐个执行,替换波段名。
方法二:一步堆叠(更高效)gdalbuildvrt -separate stack.vrt B02_10m.tif B03_10m.tif B04_10m.tif B08_10m.tif → gdal_translate -co COMPRESS=DEFLATE stack.vrt stacked.tif。
注意:若原始B08.jp2为20米分辨率,强制重采样到10米会引入插值噪声,此时应先用gdalwarp -tr 20 20统一到20米,再整体缩放——【盲目统一到10米会导致NDVI空间误差放大】。
命令行计算NDVI并生成长势分级栅格
第一步:用rasterio+numpy脚本计算NDVI
新建calc_ndvi.py,写入:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
import rasterio, numpy as np<br>with rasterio.open("stacked.tif") as src:<br> red = src.read(3).astype(np.float32)<br> nir = src.read(4).astype(np.float32)<br> ndvi = (nir - red) / (nir + red + 1e-8)<br> profile = src.profile.copy()<br> profile.update(dtype=rasterio.float32, count=1, compress="DEFLATE")<br> with rasterio.open("ndvi.tif", "w", **profile) as dst:<br> dst.write(ndvi.astype(np.float32), 1)
第二步:用gdal_calc.py快速验证(无需写脚本)gdal_calc.py -A stacked.tif --A_band=3 -B stacked.tif --B_band=4 --outfile=ndvi_quick.tif --calc="(B-A)/(B+A+0.000001)" --type=Float32。
第三步:按农业标准分级(非线性映射)gdal_translate -of GTiff -ot Byte -scale -1 0.8 1 255 ndvi.tif ndvi_byte.tif → 再用gdal_edit.py -a_nodata 0 ndvi_byte.tif设无效值;然后运行python classify_ndvi.py ndvi_byte.tif longshi_classified.tif(需自写脚本将0–255值映射为1=较差/2=一般/3=良/4=优)。
基于NDVI阈值提取地块边界
① 用gdal_rasterize将分类后的长势图转为矢量面:gdal_rasterize -burn 1 -where "DN=4" -l ndvi_classified ndvi_classified.tif good_zone.gpkg,仅提取“优”级区域。
② 对矢量面进行形态学简化:ogr2ogr -f GPKG -dialect sqlite -sql "SELECT ST_Buffer(geometry, 0), ST_Area(geometry) as area FROM good_zone WHERE area > 10000" good_buffered.gpkg good_zone.gpkg,消除细碎斑块。
③ 与行政边界叠加裁剪:ogr2ogr -f GPKG -clipsrc county_boundary.shp final_good_fields.gpkg good_buffered.gpkg,确保结果落在真实耕地范围内。
这一步操作起来很简单,直接把文件拖进去就行。但若county_boundary.shp坐标系不是EPSG:32649,【必须先用ogr2ogr -t_srs EPSG:32649重投影,否则裁剪结果完全错位】。










