Skip to content

GeoServer发布土地利用图层问题处理

约 1414 字大约 5 分钟

GeoServerImageMosaicSRS

2026-01-23

项目上用到土地利用的GeoTIFF,使用geoserver 的 ImageMosaic数据源发布后,显示范围总是不全

由于项目着急上线,当时是使用每个GeoTIFF文件都作为一个存储仓库,发布为图层,然后使用图层组提供对外服务,供应用使用。

问题是图层太多,不好管理。

GeoTIFF 文件列表(共755个文件)

image-20260123162311692

ImageMosaic数据源

image-20260123162529288

图层配置

image-20260123162729702

图层预览

image-20260126130547814

解决方法

坐标系不一致,使用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

脚本输出文件夹(部分)

image-20260126125738252

发布ImageMosaic服务

存储仓库

image-20260126125817952

图层

image-20260126125902433

图层预览

image-20260126125937439