第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 本章小结
本章学习了:
- 数据存储的概念和类型
- DataStoreService 的核心方法
- 各种数据源的连接配置
- 数据存储的增删改查操作
- 连接测试和验证
- 实用的数据存储管理工具
下一章将学习要素类型和图层管理。
相关资源:

浙公网安备 33010602011771号