第05章-数据存储管理API详解

第05章:数据存储管理API详解

5.1 数据存储概述

数据存储(DataStore)是 GeoServer 中连接和访问矢量数据源的核心组件。它定义了如何连接到特定的数据源,如 PostGIS 数据库、Shapefile 文件夹或其他支持的数据格式。

5.1.1 支持的数据存储类型

  • PostGIS:PostgreSQL + PostGIS 扩展
  • Shapefile:ESRI Shapefile 文件
  • GeoPackage:OGC GeoPackage 数据库
  • Oracle Spatial:Oracle 数据库
  • SQL Server:Microsoft SQL Server
  • MySQL:MySQL/MariaDB 数据库
  • Directory of Shapefiles:Shapefile 文件夹
  • Properties:Java 属性文件

5.1.2 DataStoreService 核心方法

public class DataStoreService
{
    // 获取数据存储列表
    public async Task<DataStore[]> GetDataStoresAsync(string workspaceName);
    
    // 获取数据存储详情
    public async Task<DataStore> GetDataStoreAsync(string workspaceName, string dataStoreName);
    
    // 创建数据存储
    public async Task CreateDataStoreAsync(string workspaceName, DataStore dataStore);
    
    // 更新数据存储
    public async Task UpdateDataStoreAsync(string workspaceName, string dataStoreName, DataStore dataStore);
    
    // 删除数据存储
    public async Task DeleteDataStoreAsync(string workspaceName, string dataStoreName, bool recurse = false);
    
    // 重置数据存储缓存
    public async Task ResetDataStoreAsync(string workspaceName, string dataStoreName);
    
    // 上传文件
    public async Task UploadFileAsync(string workspaceName, string dataStoreName, string fileFormat, byte[] fileContent, string contentType);
}

5.2 获取数据存储列表

using var factory = new GeoServerClientFactory(options);
var dataStoreService = factory.CreateDataStoreService();

// 获取工作空间中的所有数据存储
var dataStores = await dataStoreService.GetDataStoresAsync("myWorkspace");

Console.WriteLine($"找到 {dataStores.Length} 个数据存储:");
foreach (var ds in dataStores)
{
    Console.WriteLine($"- {ds.Name} ({ds.Type})");
}

5.3 创建 PostGIS 数据存储

var postgisStore = new DataStore
{
    Name = "my_postgis",
    Type = "PostGIS",
    Enabled = true,
    ConnectionParameters = new ConnectionParameters
    {
        Entry = new[]
        {
            new ConnectionParameter { Key = "host", Value = "localhost" },
            new ConnectionParameter { Key = "port", Value = "5432" },
            new ConnectionParameter { Key = "database", Value = "gisdata" },
            new ConnectionParameter { Key = "schema", Value = "public" },
            new ConnectionParameter { Key = "user", Value = "postgres" },
            new ConnectionParameter { Key = "passwd", Value = "password" },
            new ConnectionParameter { Key = "dbtype", Value = "postgis" }
        }
    }
};

await dataStoreService.CreateDataStoreAsync("myWorkspace", postgisStore);
Console.WriteLine("PostGIS 数据存储创建成功!");

5.4 创建 Shapefile 数据存储

5.4.1 上传 Shapefile

// 读取 Shapefile 压缩包
var zipBytes = File.ReadAllBytes("data/cities.zip");

// 上传到 GeoServer
await dataStoreService.UploadFileAsync(
    workspaceName: "myWorkspace",
    dataStoreName: "cities_shapefile",
    fileFormat: "shp",
    fileContent: zipBytes,
    contentType: "application/zip");

Console.WriteLine("Shapefile 上传成功!");

5.4.2 创建 Shapefile 目录数据存储

var shapefileStore = new DataStore
{
    Name = "shapefile_directory",
    Type = "Directory of spatial files (shapefiles)",
    Enabled = true,
    ConnectionParameters = new ConnectionParameters
    {
        Entry = new[]
        {
            new ConnectionParameter 
            { 
                Key = "url", 
                Value = "file:///path/to/shapefiles" 
            }
        }
    }
};

await dataStoreService.CreateDataStoreAsync("myWorkspace", shapefileStore);

5.5 更新数据存储

// 获取现有数据存储
var dataStore = await dataStoreService.GetDataStoreAsync("myWorkspace", "my_postgis");

// 修改连接参数
foreach (var param in dataStore.ConnectionParameters.Entry)
{
    if (param.Key == "host")
    {
        param.Value = "新服务器地址";
    }
}

// 更新
await dataStoreService.UpdateDataStoreAsync("myWorkspace", "my_postgis", dataStore);
Console.WriteLine("数据存储更新成功!");

5.6 删除数据存储

// 非递归删除(数据存储必须为空)
await dataStoreService.DeleteDataStoreAsync("myWorkspace", "empty_store", recurse: false);

// 递归删除(同时删除所有要素类型和图层)
await dataStoreService.DeleteDataStoreAsync("myWorkspace", "old_store", recurse: true);
Console.WriteLine("数据存储删除成功!");

5.7 数据存储连接测试

public static class DataStoreValidator
{
    public static async Task<bool> TestConnectionAsync(
        DataStoreService service,
        string workspaceName,
        string dataStoreName)
    {
        try
        {
            // 尝试获取数据存储信息
            var dataStore = await service.GetDataStoreAsync(workspaceName, dataStoreName);
            
            // 检查是否启用
            if (!dataStore.Enabled)
            {
                Console.WriteLine("数据存储已禁用");
                return false;
            }

            // 尝试重置(测试连接)
            await service.ResetDataStoreAsync(workspaceName, dataStoreName);
            
            Console.WriteLine("数据存储连接正常");
            return true;
        }
        catch (GeoServerRequestException ex)
        {
            Console.WriteLine($"连接测试失败: {ex.Message}");
            return false;
        }
    }
}

5.8 常用连接配置示例

5.8.1 PostGIS 连接池配置

var advancedPostGIS = new DataStore
{
    Name = "postgis_pooled",
    Type = "PostGIS",
    Enabled = true,
    ConnectionParameters = new ConnectionParameters
    {
        Entry = new[]
        {
            new ConnectionParameter { Key = "host", Value = "localhost" },
            new ConnectionParameter { Key = "port", Value = "5432" },
            new ConnectionParameter { Key = "database", Value = "gisdata" },
            new ConnectionParameter { Key = "schema", Value = "public" },
            new ConnectionParameter { Key = "user", Value = "geoserver" },
            new ConnectionParameter { Key = "passwd", Value = "password" },
            new ConnectionParameter { Key = "dbtype", Value = "postgis" },
            new ConnectionParameter { Key = "max connections", Value = "10" },
            new ConnectionParameter { Key = "min connections", Value = "1" },
            new ConnectionParameter { Key = "validate connections", Value = "true" },
            new ConnectionParameter { Key = "Connection timeout", Value = "20" },
            new ConnectionParameter { Key = "preparedStatements", Value = "true" }
        }
    }
};

5.8.2 GeoPackage 配置

var geopackageStore = new DataStore
{
    Name = "my_geopackage",
    Type = "GeoPackage",
    Enabled = true,
    ConnectionParameters = new ConnectionParameters
    {
        Entry = new[]
        {
            new ConnectionParameter 
            { 
                Key = "database", 
                Value = "file:///path/to/data.gpkg" 
            },
            new ConnectionParameter 
            { 
                Key = "dbtype", 
                Value = "geopkg" 
            }
        }
    }
};

5.9 数据存储迁移工具

public class DataStoreMigrator
{
    private readonly DataStoreService _service;

    public DataStoreMigrator(DataStoreService service)
    {
        _service = service;
    }

    /// <summary>
    /// 将数据存储从一个工作空间复制到另一个
    /// </summary>
    public async Task<bool> CopyDataStoreAsync(
        string sourceWorkspace,
        string targetWorkspace,
        string dataStoreName,
        string newDataStoreName = null)
    {
        try
        {
            // 获取源数据存储
            var source = await _service.GetDataStoreAsync(sourceWorkspace, dataStoreName);
            
            // 创建副本
            var target = new DataStore
            {
                Name = newDataStoreName ?? dataStoreName,
                Type = source.Type,
                Enabled = source.Enabled,
                ConnectionParameters = source.ConnectionParameters
            };

            // 在目标工作空间创建
            await _service.CreateDataStoreAsync(targetWorkspace, target);
            
            Console.WriteLine($"数据存储从 {sourceWorkspace} 复制到 {targetWorkspace}");
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"复制失败: {ex.Message}");
            return false;
        }
    }
}

5.10 本章小结

本章学习了:

  1. 数据存储的概念和类型
  2. DataStoreService 的核心方法
  3. 各种数据源的连接配置
  4. 数据存储的增删改查操作
  5. 连接测试和验证
  6. 实用的数据存储管理工具

下一章将学习要素类型和图层管理。


相关资源

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