第12章-覆盖范围与栅格数据管理

第12章:覆盖范围与栅格数据管理

12.1 覆盖范围概述

覆盖范围(Coverage)是GeoServer中用于管理栅格数据的核心概念。它包括卫星影像、数字高程模型(DEM)、气象数据等栅格数据类型。

12.1.1 支持的栅格格式

  • GeoTIFF:地理标记的TIFF文件
  • WorldImage:带世界文件的图像(JPEG, PNG等)
  • ArcGrid:ESRI ASCII Grid格式
  • ECW, MrSID:压缩格式
  • NetCDF, HDF:科学数据格式
  • ImageMosaic:影像镶嵌

12.2 CoverageStoreService 核心功能

12.2.1 服务接口

public class CoverageStoreService
{
    // 获取覆盖范围存储列表
    public async Task<CoverageStore[]> GetCoverageStoresAsync(string workspaceName);
    
    // 获取覆盖范围存储详情
    public async Task<CoverageStore> GetCoverageStoreAsync(string workspaceName, string storeName);
    
    // 创建覆盖范围存储
    public async Task CreateCoverageStoreAsync(string workspaceName, CoverageStore store);
    
    // 更新覆盖范围存储
    public async Task UpdateCoverageStoreAsync(string workspaceName, string storeName, CoverageStore store);
    
    // 删除覆盖范围存储
    public async Task DeleteCoverageStoreAsync(string workspaceName, string storeName, bool recurse = false);
}

12.2.2 数据模型

public class CoverageStore
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("type")]
    public string Type { get; set; } // GeoTIFF, WorldImage, etc.

    [JsonProperty("enabled")]
    public bool Enabled { get; set; }

    [JsonProperty("workspace")]
    public WorkspaceReference Workspace { get; set; }

    [JsonProperty("url")]
    public string URL { get; set; }

    [JsonProperty("coverages")]
    public string Coverages { get; set; }
}

12.3 创建GeoTIFF覆盖范围存储

12.3.1 基本创建

using var factory = new GeoServerClientFactory(options);
var coverageStoreService = factory.CreateCoverageStoreService();

var coverageStore = new CoverageStore
{
    Name = "elevation_data",
    Type = "GeoTIFF",
    Enabled = true,
    URL = "file:///data/elevation.tif"
};

await coverageStoreService.CreateCoverageStoreAsync("myWorkspace", coverageStore);
Console.WriteLine("GeoTIFF覆盖范围存储创建成功!");

12.3.2 上传GeoTIFF文件

// 读取GeoTIFF文件
var tiffBytes = File.ReadAllBytes("path/to/elevation.tif");

// 上传到GeoServer
var content = new ByteArrayContent(tiffBytes);
content.Headers.ContentType = new MediaTypeHeaderValue("image/tiff");

await httpClient.PutAsync(
    $"/rest/workspaces/myWorkspace/coveragestores/elevation_data/file.geotiff",
    content);

Console.WriteLine("GeoTIFF文件上传成功!");

12.4 Coverage Service - 覆盖范围管理

12.4.1 CoverageService 接口

public class CoverageService
{
    // 获取覆盖范围列表
    public async Task<Coverage[]> GetCoveragesAsync(string workspaceName, string storeName);
    
    // 获取覆盖范围详情
    public async Task<Coverage> GetCoverageAsync(string workspaceName, string storeName, string coverageName);
    
    // 创建覆盖范围
    public async Task CreateCoverageAsync(string workspaceName, string storeName, Coverage coverage);
    
    // 更新覆盖范围
    public async Task UpdateCoverageAsync(string workspaceName, string storeName, string coverageName, Coverage coverage);
    
    // 删除覆盖范围
    public async Task DeleteCoverageAsync(string workspaceName, string storeName, string coverageName, bool recurse = false);
}

12.4.2 发布覆盖范围

var coverageService = factory.CreateCoverageService();

var coverage = new Coverage
{
    Name = "elevation",
    NativeName = "elevation",
    Title = "数字高程模型",
    Abstract = "某地区的数字高程数据",
    Enabled = true,
    SRS = "EPSG:4326",
    ProjectionPolicy = "REPROJECT_TO_DECLARED",
    NativeCRS = "EPSG:4326",
    DefaultInterpolationMethod = "nearest neighbor"
};

await coverageService.CreateCoverageAsync("myWorkspace", "elevation_data", coverage);
Console.WriteLine("覆盖范围发布成功!");

12.5 影像镶嵌(ImageMosaic)

12.5.1 创建影像镶嵌存储

var mosaicStore = new CoverageStore
{
    Name = "satellite_mosaic",
    Type = "ImageMosaic",
    Enabled = true,
    URL = "file:///data/satellite_images"
};

await coverageStoreService.CreateCoverageStoreAsync("myWorkspace", mosaicStore);

// 配置时间维度
var coverage = await coverageService.GetCoverageAsync("myWorkspace", "satellite_mosaic", "mosaic");
coverage.Dimensions = new Dimensions
{
    Dimension = new[]
    {
        new Dimension
        {
            Name = "TIME",
            Enabled = true,
            Presentation = "LIST",
            DefaultValue = "CURRENT"
        }
    }
};

await coverageService.UpdateCoverageAsync("myWorkspace", "satellite_mosaic", "mosaic", coverage);

12.6 影像金字塔配置

12.6.1 配置金字塔级别

public class PyramidConfigurator
{
    /// <summary>
    /// 配置影像金字塔以优化性能
    /// </summary>
    public async Task ConfigurePyramidsAsync(
        string workspaceName,
        string storeName,
        string coverageName)
    {
        var coverage = await _coverageService.GetCoverageAsync(
            workspaceName, storeName, coverageName);

        // 启用金字塔
        coverage.OverviewPolicy = "QUALITY"; // or "SPEED", "NEAREST"
        coverage.InterpolationMethods = new[]
        {
            "nearest neighbor",
            "bilinear",
            "bicubic"
        };

        await _coverageService.UpdateCoverageAsync(
            workspaceName, storeName, coverageName, coverage);

        Console.WriteLine("金字塔配置完成!");
    }
}

12.7 栅格样式配置

12.7.1 配置颜色映射

// 为DEM配置颜色渐变样式
var sldContent = @"<?xml version='1.0' encoding='UTF-8'?>
<StyledLayerDescriptor version='1.0.0'>
  <NamedLayer>
    <Name>elevation</Name>
    <UserStyle>
      <Title>Elevation Style</Title>
      <FeatureTypeStyle>
        <Rule>
          <RasterSymbolizer>
            <ColorMap>
              <ColorMapEntry color='#0000FF' quantity='0' label='Sea Level'/>
              <ColorMapEntry color='#00FF00' quantity='100' label='100m'/>
              <ColorMapEntry color='#FFFF00' quantity='500' label='500m'/>
              <ColorMapEntry color='#FF0000' quantity='1000' label='1000m'/>
              <ColorMapEntry color='#FFFFFF' quantity='2000' label='2000m+'/>
            </ColorMap>
          </RasterSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>";

var styleService = factory.CreateStyleService();
await styleService.CreateStyleAsync("elevation_colormap", sldContent);

// 应用样式到覆盖范围图层
var layerService = factory.CreateLayerService();
var layer = await layerService.GetLayerAsync("myWorkspace:elevation");
layer.DefaultStyle = new StyleReference { Name = "elevation_colormap" };
await layerService.UpdateLayerAsync("myWorkspace:elevation", layer);

12.8 性能优化

12.8.1 配置栅格读取参数

public class RasterPerformanceOptimizer
{
    public async Task OptimizeCoveragePerformanceAsync(
        string workspaceName,
        string storeName,
        string coverageName)
    {
        var coverage = await _coverageService.GetCoverageAsync(
            workspaceName, storeName, coverageName);

        // 配置缓存
        coverage.CachingEnabled = true;
        coverage.MaxCachedTiles = 10000;

        // 配置瓦片大小
        coverage.TileWidth = 512;
        coverage.TileHeight = 512;

        // 配置压缩
        coverage.Compression = "JPEG";
        coverage.CompressionQuality = 0.85;

        // 配置内存限制
        coverage.MaxInputMemory = 536870912; // 512MB
        coverage.MaxOutputMemory = 536870912;

        await _coverageService.UpdateCoverageAsync(
            workspaceName, storeName, coverageName, coverage);

        Console.WriteLine("性能优化配置完成!");
    }
}

12.9 多波段影像处理

12.9.1 配置波段选择

// 为多光谱影像配置RGB合成
var coverage = await coverageService.GetCoverageAsync("myWorkspace", "multispectral", "image");

coverage.Bands = new Bands
{
    Band = new[]
    {
        new Band { Index = 0, Name = "Red", SampleDimension = "Band 1" },
        new Band { Index = 1, Name = "Green", SampleDimension = "Band 2" },
        new Band { Index = 2, Name = "Blue", SampleDimension = "Band 3" },
        new Band { Index = 3, Name = "NIR", SampleDimension = "Band 4" }
    }
};

// 配置默认RGB显示
coverage.DefaultBands = new[] { 0, 1, 2 }; // R, G, B

await coverageService.UpdateCoverageAsync("myWorkspace", "multispectral", "image", coverage);

12.10 实战案例

12.10.1 发布卫星影像时间序列

public async Task PublishSatelliteTimeSeriesAsync()
{
    // 1. 创建影像镶嵌存储
    var mosaicStore = new CoverageStore
    {
        Name = "landsat_timeseries",
        Type = "ImageMosaic",
        Enabled = true,
        URL = "file:///data/landsat"
    };

    await coverageStoreService.CreateCoverageStoreAsync("satellite", mosaicStore);

    // 2. 配置覆盖范围
    var coverage = new Coverage
    {
        Name = "landsat",
        Title = "Landsat 时间序列",
        Enabled = true,
        SRS = "EPSG:4326"
    };

    await coverageService.CreateCoverageAsync("satellite", "landsat_timeseries", coverage);

    // 3. 配置时间维度
    coverage = await coverageService.GetCoverageAsync("satellite", "landsat_timeseries", "landsat");
    coverage.Dimensions = new Dimensions
    {
        Dimension = new[]
        {
            new Dimension
            {
                Name = "TIME",
                Enabled = true,
                Presentation = "DISCRETE_INTERVAL",
                DefaultValue = "CURRENT",
                NearestMatchEnabled = true
            }
        }
    };

    await coverageService.UpdateCoverageAsync("satellite", "landsat_timeseries", "landsat", coverage);

    Console.WriteLine("卫星影像时间序列发布成功!");
}

12.11 本章小结

本章学习了:

  1. 覆盖范围和栅格数据的概念
  2. CoverageStoreService 和 CoverageService 的使用
  3. GeoTIFF 和影像镶嵌的配置
  4. 影像金字塔和性能优化
  5. 栅格样式和颜色映射
  6. 多波段影像处理
  7. 时间序列影像发布实战

下一章将学习 GeoWebCache 集成与缓存管理。


相关资源

posted @ 2025-12-11 09:29  我才是银古  阅读(2)  评论(0)    收藏  举报