ArcGIS Pro SDK (八)地理数据库 3 数据

ArcGIS Pro SDK (八)地理数据库 3 数据

文章目录

  • [ArcGIS Pro SDK (八)地理数据库 3 数据](#ArcGIS Pro SDK (八)地理数据库 3 数据)
    • [1 从地理数据库打开数据集](#1 从地理数据库打开数据集)
    • [2 检查表是否存在](#2 检查表是否存在)
    • [3 检查要素类是否存在](#3 检查要素类是否存在)
    • [4 打开关系两个表之间的类](#4 打开关系两个表之间的类)
    • [5 从关系类获取相关要素类](#5 从关系类获取相关要素类)
    • [6 从 shapefile 数据存储打开要素类](#6 从 shapefile 数据存储打开要素类)
    • [7 打开 CAD 数据存储](#7 打开 CAD 数据存储)

环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0

1 从地理数据库打开数据集

csharp 复制代码
public async Task OpeningDatasetsFromGeodatabase()
{
    await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
        () =>
        {
            using (Geodatabase geodatabase = new Geodatabase(new DatabaseConnectionFile(new Uri("path\\to\\sde\\file\\sdefile.sde"))))
            {
                using (Table table = 
                       geodatabase.OpenDataset<Table>("LocalGovernment.GDB.EmployeeInfo"))
                {
                }

                // 打开一个要素类(在要素数据集内或要素数据集外)。
                using (FeatureClass featureClass = 
                       geodatabase.OpenDataset<FeatureClass>("LocalGovernment.GDB.AddressPoint"))
                {
                }

                // 你可以将要素类作为表打开,这将为你提供一个表引用。
                using (Table featureClassAsTable = geodatabase.OpenDataset<Table>("LocalGovernment.GDB.AddressPoint"))
                {
                    // 但它实际上是一个要素类对象。
                    FeatureClass featureClassOpenedAsTable = featureClassAsTable as FeatureClass;
                }

                // 打开一个要素数据集。
                using (FeatureDataset featureDataset = geodatabase.OpenDataset<FeatureDataset>("LocalGovernment.GDB.Address"))
                {
                }

                // 打开一个关系类。就像你可以将要素类作为表打开一样,你也可以将带有属性的关系类作为关系类打开。
                using (RelationshipClass relationshipClass = geodatabase.OpenDataset<RelationshipClass>("LocalGovernment.GDB.AddressPointHasSiteAddresses"))
                {
                }
            }
        });
}

2 检查表是否存在

csharp 复制代码
// 必须在 QueuedTask.Run() 中调用
public bool TableExists(Geodatabase geodatabase, string tableName)
{
    try
    {
        TableDefinition tableDefinition = geodatabase.GetDefinition<TableDefinition>(tableName);
        tableDefinition.Dispose();
        return true;
    }
    catch
    {
        // 如果定义不存在,GetDefinition 会抛出异常
        return false;
    }
}

3 检查要素类是否存在

csharp 复制代码
// 必须在 QueuedTask.Run() 中调用
public bool FeatureClassExists(Geodatabase geodatabase, string featureClassName)
{
    try
    {
        FeatureClassDefinition featureClassDefinition = geodatabase.GetDefinition<FeatureClassDefinition>(featureClassName);
        featureClassDefinition.Dispose();
        return true;
    }
    catch
    {
        // 如果定义不存在,GetDefinition 会抛出异常
        return false;
    }
}

4 打开关系两个表之间的类

csharp 复制代码
// 必须在 QueuedTask.Run() 中调用。 
// 当与文件或企业级地理数据库一起使用时,此例程需要两个表名。
// 当与要素服务一起使用时,此例程需要图层 ID 或服务中暴露的表的名称(例如 "L0States")。
public IReadOnlyList<RelationshipClass> OpenRelationshipClassFeatureServices(Geodatabase geodatabase, string originClass, string destinationClass)
{
    return geodatabase.OpenRelationshipClasses(originClass, destinationClass);
}

5 从关系类获取相关要素类

csharp 复制代码
public async Task GetFeatureClassesInRelationshipClassAsync()
{
    await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
        () =>
        {
            using (Geodatabase geodatabase = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(@"C:\Data\LocalGovernment.gdb"))))
            {
                IReadOnlyList<RelationshipClassDefinition> relationshipClassDefinitions = 
                    geodatabase.GetDefinitions<RelationshipClassDefinition>();

                foreach (var relationshipClassDefinition in relationshipClassDefinitions)
                {
                    IReadOnlyList<Definition> definitions = 
                        geodatabase.GetRelatedDefinitions(relationshipClassDefinition,
                                                          DefinitionRelationshipType.DatasetsRelatedThrough);

                    foreach (var definition in definitions)
                    {
                        System.Diagnostics.Debug.WriteLine(
                            $"关系类中的要素类是:{definition.GetName()}");
                    }
                }
            }
        });
}

6 从 shapefile 数据存储打开要素类

csharp 复制代码
public async Task OpenShapefileFeatureClass()
{
    await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
        () =>
        {
            var fileConnection = new FileSystemConnectionPath(new Uri("path\\to\\folder\\containing\\shapefiles"), FileSystemDatastoreType.Shapefile);
            using (FileSystemDatastore shapefile = new FileSystemDatastore(fileConnection))
            {
                FeatureClass taxLotsFeatureClass = shapefile.OpenDataset<FeatureClass>("TaxLots");
                FeatureClass manHolesFeatureClass = shapefile.OpenDataset<FeatureClass>("ManHoles.shp"); // 可以使用 .shp 扩展名,但不是必需的。
                Table taxDetailsTableWithoutExtension = shapefile.OpenDataset<Table>("TaxDetails");
                Table taxDetailsTable = shapefile.OpenDataset<Table>("TaxDetails.dbf");
            }
        });
}

7 打开 CAD 数据存储

csharp 复制代码
public async Task OpenCADFeatureClass()
{
    await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(
        () =>
        {
            var fileConnection = new FileSystemConnectionPath(new Uri("path\\to\\folder\\containing\\CAD"), FileSystemDatastoreType.Cad);
            using (FileSystemDatastore cadDatastore = new FileSystemDatastore(fileConnection))
            {
                // 注意 - 扩展名是必需的
                var cadDataset = cadDatastore.OpenDataset<FeatureClass>("hatchplayboundaries.dwg");
                // 注意引用要素类的模式。
                var cadfeatureClass = cadDatastore.OpenDataset<FeatureClass>("hatchplayboundaries.dwg:Polyline");

                int numRows = 0;
                using (var cursor = cadfeatureClass.Search())
                {
                    while (cursor.MoveNext())
                        numRows++;
                }
            }
        });
}
相关推荐
six_12 小时前
C# 上位机(持续更新中)
前端·面试·c#
吴可可12313 小时前
多段线扩展数据的应用场景
c#
fangzhanpeng16814 小时前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
慧都小妮子15 小时前
C# 实现AI合同审查:从读取、风险标注到批量签发
ai·自然语言处理·c#·.net·办公自动化·ai合同审查·文档ai代理
李高钢19 小时前
C# WPF 的 Prism 框架入门:核心概念与一个完整示例
开发语言·c#·wpf
牛哇网络工作室1 天前
UnityHDRP写实数字人全流程基础5—语音输入和语音识别
android·unity·c#·游戏引擎·aigc·语音识别·xcode
zlinear数据采集卡2 天前
数据采集卡从入门到精通(9):分辨率与精度——16位卡不等于1/65536的精度
开发语言·数据库·fpga开发·开源·c#
深澈Vincel2 天前
我用 C# + WebView2 做了一个针对“流氓软件”的“一键清理工具“:架构实践与踩坑记录
c#
xiaominlaopodaren2 天前
three.js最小地图运行时(一):视图状态
javascript·gis·three.js
zlinear数据采集卡2 天前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#