ArcGIS Pro SDK (八)地理数据库 1 地理数据库和数据存储
文章目录
- ArcGIS Pro SDK (八)地理数据库 1 地理数据库和数据存储
- 1 打开给定路径的文件地理数据库
- 2 使用连接属性打开企业级地理数据库
- 3 使用 sde 文件路径打开企业级地理数据库
- 4 从工程项获取地理数据库
- 5 从连接文件获取数据库连接属性
- 6 从要素图层获取地理数据库
- 7 执行 SQL 语句
环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0
1 打开给定路径的文件地理数据库
public async Task OpenFileGDB()
{
try
{
await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
() =>
{
// 打开一个文件地理数据库。如果文件夹存在且包含有效的地理数据库,这将打开该地理数据库。
using ( Geodatabase geodatabase = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(@"C:\Data\LocalGovernment.gdb"))))
{
// 使用地理数据库。
}
});
}
catch (GeodatabaseNotFoundOrOpenedException exception)
{
// 处理异常。
}
}
2 使用连接属性打开企业级地理数据库
public async Task OpenEnterpriseGeodatabase()
{
await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
() =>
{
// 打开一个非版本化的 SQL Server 实例。
DatabaseConnectionProperties connectionProperties = new DatabaseConnectionProperties(EnterpriseDatabaseType.SQLServer)
{
AuthenticationMode = AuthenticationMode.DBMS,
// testMachine 是运行该实例的计算机,testInstance 是 SQL Server 实例的名称。
Instance = @"testMachine\testInstance",
// 假设在 testInstance 上已创建一个名为 LocalGovernment 的数据库,并且已在该数据库上启用地理数据库。
Database = "LocalGovernment",
// 假设已创建一个名为 gdb 的登录名,并为其创建了具有所需权限的相应架构。
User = "gdb",
Password = "password",
Version = "dbo.DEFAULT"
};
using (Geodatabase geodatabase = new Geodatabase(connectionProperties))
{
// 使用地理数据库
}
});
}
3 使用 sde 文件路径打开企业级地理数据库
public async Task OpenEnterpriseGeodatabaseUsingSDEFilePath()
{
await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
() =>
{
using (Geodatabase geodatabase = new Geodatabase(new DatabaseConnectionFile(new Uri("path\\to\\sde\\file\\sdefile.sde"))))
{
// 使用地理数据库。
}
});
}
4 从工程项获取地理数据库
public async Task ObtainingGeodatabaseFromProjectItem()
{
IEnumerable<GDBProjectItem> gdbProjectItems = Project.Current.GetItems<GDBProjectItem>();
await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
() =>
{
foreach (GDBProjectItem gdbProjectItem in gdbProjectItems)
{
using (Datastore datastore = gdbProjectItem.GetDatastore())
{
// 不支持的存储类型(非文件地理数据库和非企业级地理数据库)将是 UnknownDatastore 类型
if (datastore is UnknownDatastore)
continue;
Geodatabase geodatabase = datastore as Geodatabase;
// 使用地理数据库。
}
}
});
}
5 从连接文件获取数据库连接属性
DatabaseConnectionFile connectionFile = new DatabaseConnectionFile(new Uri("path\\to\\sde\\file\\sdefile.sde"));
DatabaseConnectionProperties connectionProperties = DatabaseClient.GetDatabaseConnectionProperties(connectionFile);
// 现在你可以,例如,在使用连接属性打开地理数据库之前更改用户名和密码
6 从要素图层获取地理数据库
public async Task ObtainingGeodatabaseFromFeatureLayer()
{
IEnumerable<Layer> layers = MapView.Active.Map.Layers.Where(layer => layer is FeatureLayer);
await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
() =>
{
foreach (FeatureLayer featureLayer in layers)
{
using (Table table = featureLayer.GetTable())
using (Datastore datastore = table.GetDatastore())
{
if (datastore is UnknownDatastore)
continue;
Geodatabase geodatabase = datastore as Geodatabase;
}
}
});
}
7 执行 SQL 语句
// 在底层数据库管理系统上执行原始 SQL 语句。
// 任何 SQL 都是允许的(DDL 或 DML),但不能返回结果
public void ExecuteSQLOnGeodatabase(Geodatabase geodatabase, string statement)
{
QueuedTask.Run(
() =>
{
DatabaseClient.ExecuteStatement(geodatabase, statement);
});
}