GeoServer发布土地利用图层问题处理
项目上用到土地利用的GeoTIFF,使用geoserver 的 ImageMosaic数据源发布后,显示范围总是不全。
由于项目着急上线,当时是使用每个GeoTIFF文件都作为一个存储仓库,发布为图层,然后使用图层组提供对外服务,供应用使用。
问题是图层太多,不好管理。
GeoTIFF 文件列表(共755个文件)

ImageMosaic数据源

图层配置

图层预览

解决方法
坐标系不一致,使用QGIS 查看GeoTIFF 的 坐标系发现存在多个坐标系,然后又通过豆包得知GeoServer 的 ImageMosaic 只支持单一坐标系,问题就算定位成功了。
解决方法一:按GeoTIFF坐标系进行分组,分别发布ImageMosaic,然后用图层组进行串联
安装gdal,配合脚本识别所有GeoTIFF的坐标系
安装gdal
conda 也可以安装,但本地安装出现包不全问题,所以改用brew安装
conda deactivate
brew install gdal查看gdal版本
gdalwarp --version脚本创建及执行
extract_epsg.sh
#!/bin/bash
# 定义目标目录(你指定的 TIFF 文件夹路径)
TARGET_DIR="/Users/dftshine/Career/LocalDocker/docker_volumes/geoserver/data/nepsp/2024-land"
# 定义输出日志文件(当前目录下的 1.log)
LOG_FILE="./1.log"
# 清空原有日志文件(避免内容叠加)
> $LOG_FILE
# 遍历目标目录下所有 .tif 文件(仅当前目录,无嵌套)
for tif_file in "$TARGET_DIR"/*.tif; do
# 跳过不存在的文件(比如目录下无tif时的空匹配)
if [ ! -f "$tif_file" ]; then
continue
fi
# 提取仅文件名(去掉完整路径)
filename=$(basename "$tif_file")
# 提取 EPSG 编码(处理提取失败情况)
epsg_code=$(gdalinfo "$tif_file" 2>/dev/null | grep -oE 'ID\["EPSG",[0-9]+\]' | grep -oE '[0-9]+' | tail -1)
# 若提取失败,标记为 "未知"
if [ -z "$epsg_code" ]; then
epsg_code="未知"
fi
# 输出到日志文件:文件名 + EPSG 编码
echo "文件名: $filename | EPSG 编码: $epsg_code" >> $LOG_FILE
done
# 脚本执行完成提示
echo "✅ 处理完成!结果已保存到当前目录的 1.log 文件中"
echo "📄 共处理 $(grep -c "文件名:" $LOG_FILE) 个 TIFF 文件"授权并执行
chmod +x extract_epsg.sh
./extract_epsg.sh脚本输出结果(部分)
文件名: 01C_20240101-20241231.tif | EPSG 编码: 32701
文件名: 01G_20240101-20241231.tif | EPSG 编码: 32701
文件名: 01J_20240101-20241231.tif | EPSG 编码: 32701
文件名: 01K_20240101-20241231.tif | EPSG 编码: 32701
文件名: 01L_20240101-20241231.tif | EPSG 编码: 32701
文件名: 01M_20240101-20241231.tif | EPSG 编码: 32701
文件名: 01N_20240101-20241231.tif | EPSG 编码: 32601
文件名: 01R_20240101-20241231.tif | EPSG 编码: 32601
文件名: 01U_20240101-20241231.tif | EPSG 编码: 32601
文件名: 01W_20240101-20241231.tif | EPSG 编码: 32601
文件名: 02C_20240101-20241231.tif | EPSG 编码: 32702
文件名: 02K_20240101-20241231.tif | EPSG 编码: 32702
文件名: 02L_20240101-20241231.tif | EPSG 编码: 32702
文件名: 02M_20240101-20241231.tif | EPSG 编码: 32702
文件名: 02Q_20240101-20241231.tif | EPSG 编码: 32602
文件名: 02R_20240101-20241231.tif | EPSG 编码: 32602
文件名: 02U_20240101-20241231.tif | EPSG 编码: 32602
文件名: 02V_20240101-20241231.tif | EPSG 编码: 32602
文件名: 02W_20240101-20241231.tif | EPSG 编码: 32602
文件名: 03C_20240101-20241231.tif | EPSG 编码: 32703
文件名: 03K_20240101-20241231.tif | EPSG 编码: 32703
文件名: 03L_20240101-20241231.tif | EPSG 编码: 32703
文件名: 03N_20240101-20241231.tif | EPSG 编码: 32603
文件名: 03Q_20240101-20241231.tif | EPSG 编码: 32603
文件名: 03R_20240101-20241231.tif | EPSG 编码: 32603
文件名: 03U_20240101-20241231.tif | EPSG 编码: 32603
文件名: 03V_20240101-20241231.tif | EPSG 编码: 32603
文件名: 03W_20240101-20241231.tif | EPSG 编码: 32603
文件名: 04C_20240101-20241231.tif | EPSG 编码: 32704
...组织文件夹,分别发布ImageMosaic服务
按相同EPSG编码组织文件夹和文件, 按文件夹发布ImageMosaic,然后用图层组进行串联。具体操作(略)
解决方法二:使用gdal脚本批量转换所有GeoTIFF文件为统一坐标系(比如EPSG:4326)
安装gdal,配合脚本转换所有GeoTIFF的坐标系
安装gdal
conda 也可以安装,但本地安装出现包不全问题,所以改用brew安装
conda deactivate
brew install gdal查看gdal
gdalwarp --version脚本创建及执行
convert_to_4326.sh
#!/bin/bash
# 源目录:存放多坐标系 TIFF 的 land 文件夹
SRC_DIR="/Users/dftshine/Career/LocalDocker/docker_volumes/geoserver/data/nepsp/2024-land"
# 目标目录:存放转换后 4326 的 TIFF
DST_DIR="/Users/dftshine/Career/LocalDocker/docker_volumes/geoserver/data/nepsp/2024-land-4326"
# 创建目标目录(若不存在)
mkdir -p "$DST_DIR"
# 遍历所有 TIFF 文件,批量转换(仅当前目录,无嵌套)
for tif in "$SRC_DIR"/*.tif; do
# 跳过空匹配(比如目录下无tif文件时)
if [ ! -f "$tif" ]; then
echo "⚠️ 未找到 TIFF 文件,跳过空匹配"
continue
fi
# 获取文件名(不含路径)
filename=$(basename "$tif")
echo "🔄 正在转换:$filename"
# 步骤1:提前删除旧文件(覆盖效果)
[ -f "$DST_DIR/$filename" ] && rm "$DST_DIR/$filename"
[ -f "$DST_DIR/$filename.ovr" ] && rm "$DST_DIR/$filename.ovr"
# 步骤2:gdalwarp 转换坐标系+控分辨率+缩小分块(解决2GB超限),纯单行
gdalwarp -t_srs EPSG:4326 -tr 0.0005 0.0005 -srcnodata 0 -dstnodata 0 -co COMPRESS=LZW -co TILED=YES -co BLOCKXSIZE=128 -co BLOCKYSIZE=128 -co PHOTOMETRIC=PALETTE -multi -wm 2048 "$tif" "$DST_DIR/$filename"
# 步骤3:生成嵌入式金字塔(无外部.ovr),纯单行
if [ -f "$DST_DIR/$filename" ]; then
echo "🗼 生成嵌入式金字塔:$filename"
gdaladdo -r average -ro --config COMPRESS_OVERVIEW LZW --config BIGTIFF YES "$DST_DIR/$filename" 2 4 8 16
# 强制清理可能的外部.ovr
[ -f "$DST_DIR/$filename.ovr" ] && rm "$DST_DIR/$filename.ovr"
echo "✅ 完成:$filename(无 .ovr,体积可控)"
else
echo "❌ 转换失败:$filename"
fi
done
echo -e "\n🎉 所有文件转换完成!目标目录:$DST_DIR"
echo "📌 结果说明:仅保留 TIFF 文件(无 .ovr),体积≈80-200MB/个,QGIS 可直接显示"授权并执行
chmod +x convert_to_4326.sh
./convert_to_4326.sh脚本输出文件夹(部分)

发布ImageMosaic服务
存储仓库

图层

图层预览

