如何使用Name对象,包括WorkspaceNames和DatasetNames

简介:

转自chanyinhelv原文 如何使用Name对象,包括WorkspaceNames和DatasetNames

第一原文链接

该博主还有很多有关arcgis二次开发的不错的文章。

如何使用Name对象,包括WorkspaceNames和DatasetNames

一、Name对象
    Name对象是一个代表性对象。通过使用Name对象,可以访问它所代表的对象的一些基本属性,而不用将整个对象调入内存,如果需要用到Name对象所代表的对象本身,可以通过Name来获取它。
    Name对象可以应用于Tables,FeatureClasses和Workspaces。

Name:
       1、WorkspaceName
       2、DatasetName
             1>RelationshipClassName
             2>FeatureDatasetName
             3>RasterDatasetName
             4>TinName
             5>TableName    
                        △--FeatureClassName
        使用Name对象最重要的一点是通过Name来获取所代表的对象,要访问Name子类里的任何对象,使用IName接口的Open方法。
示例:查找某个数据集并打开它

使用Name对象最重要的一点是通过Name来获取所代表的对象,要访问Name子类里的任何对象,使用IName接口的Open方法。
示例:查找某个数据集并打开它

复制代码
public void OpenCities()
{
    IWorkspaceFactory pWSFactory;
    IWorkspace pWS;
    IEnumDatasetName pEnumDSNames;
    IDatasetName pDSName;
    IFeatureClass pCities;

    pWSFactory = new ShapefileWorkspaceFactoryClass();
    pWS = pWSFactory.OpenFromFile("C:\\Data\\Africa", 0);
    pEnumDSNames = pWS.DatasetNames(esriDatasetType.esriDTFeatureClass);//feature class
    pDSName = pEnumDSNames.Next();
    while (pDSName != null)
    {
       if (pDSName.Name == "AfricanCities")
       {
          IName pName = pDSName as IName;
          pCities = pName.Open() as IFeatureClass;
          return;
        }
    pDSName = pEnumDSNames.Next();
}
复制代码

二、使用DataSetNames
    Name对象的一个常用用法是用来在磁盘中新建数据集时指定名字。例如,在数据转换过程中的输入输出参数中,使用DatasetName对象即可,而不必用dataset对象。DatasetName的所有子类都是可以用New关键字新建的CoClass,一旦创建好就可以设置Name属性来代表数据集。

示例:在C:\Data下创建一个新表PositianFroys.dbf。

IWorkspaceFactory pShapeWSFactory;
IWorkspaceName pWorkName;
IDatasetName pTableName;

pShapeWSFactory = new ShapefileWorkspaceFactoryClass();
pWorkName = pShapeWSFactory.Create("C:\\", "Data", null, 0);
pTableName = new TableNameClass();
pTableName.WorkspaceName = pWorkName;
pTable.Name = "PositianFroys.dbf";

三、数据的转换、输出和装载
    FeatureDataConverter是一个能将要素类、要素集或表转换成其它数据集的CoClass,它不仅可以转换单个的要素类或表,也可以转换整个数据集(如ArcInfo Coverage)。FeatureDataConverter对象能够使数据在geodatabase,shapefile和coverages之间转换支持大多数的数据类型(除了标注)。在把数据引入geodatabase时,可以指定数据的区别;对ArcSDE Geodatabase还可以通过配置ArcSDE的某些关键字来指定存储参数。
    ExportOperation是一个用于输出要素类或表的CoClass。它提供的功能与要素数据转换器大体相似,但是形式更简单。在ArcMap的目录表中右击一个图层时就是调用了这个数据输出函数。
    ObjectLoader用于向表(或要素类)中追加一个表(或要素类)。IObjectLoader只包含一个方法--LoadObjects。

四、验证字段和记录
    FieldChecker对象可以用来验证一个字段集,这对于在不同格式间转换数据时很有用,因为不同格式的数据集字段名可能不通用。FieldChecker遇到非法字段名时能够根据一定的标准(如加底线UID)来纠正错误从而产生一个合法的字段集。在把数据转换成Geodatabase格式时,FieldChecker将为Geometry字段和OID字段生成标准的名字(Shape和OBJECTID)。
    在用ObjectLoader或FeatureDataConverter装载或者转换要素时,非法对象将以枚举的形式被返回(IEnumInvalidObject),通过查看这个枚举,很容易知道哪些对象不能被装载或转换。

五、使用Feature Data Converter
    IFeatureDataConverter接口有3个方法用于转换数据:
1、ConvertFeatureClass
2、ConvertFeatureDataset
3、ConvertTable

public IEnumInvalidObject ConvertFeatureClass (
    IFeatureClassName InputDatasetName,
    IQueryFilter InputQueryFilter,
    IFeatureDatasetName outputFDatasetName,
    IFeatureClassName outputFClassName,
    IGeometryDef OutputGeometryDef,
    IFields OutputFields,
    string configKey,
    int FlushInterval,
    int parentHWND
);
InputDatasetName--IFeatureClassName用于指定转换的要素类的一个Name对象;
InputQueryFilter--IQueryFilter用于过滤要转换的要素的QueryFilter对象;
outputFDatasetName--IFeatureDatasetName要素类输出的新数据集成现存数据集的Name对象;
outputFClassName--IFeatureClassName新输出的要素类的Name对象;
OutputGeometryDef--用于指定输出要素类的空间参考信息的GeometryDef对象。如果知道为null就使用输出的要素集成输入的要素类的空间参考信息。
OutputFields--IFields用于指定输出要素类的字段集。如果把要素类简单的输出为同样的格式,可以使用输入的要素类的字段集。如果格式有变化,建议使用FieldChecker以确保输出的格式有效;
configKey--string用于指定ArcSDE配置关键字的字符串;
FlushInterval--在输出到Geodatabase时用于指定把要素转换到新的要素类时的区间整数值;
parentHWND--指定应用程序的窗口句柄;

示例://IFeatureDataConverter ConvertFeatureClass Example(From .NET Help)

 

复制代码
// e.g., nameOfSourceFeatureClass = "ctgFeatureshp.shp"
// nameOfTargetFeatureClass = "ctgFeature"
public void IFeatureDataConverter_ConvertFeatureClass_Example(IWorkspace sourceWorkspace, IWorkspace targetWorkspace, string nameOfSourceFeatureClass, string nameOfTargetFeatureClass)
{
    //create source workspace name
    IDataset sourceWorkspaceDataset = (IDataset)sourceWorkspace;
    IWorkspaceName sourceWorkspaceName = (IWorkspaceName)sourceWorkspaceDataset.FullName;

    //create source dataset name
    IFeatureClassName sourceFeatureClassName = new FeatureClassNameClass();
    IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureClassName;
    sourceDatasetName.WorkspaceName = sourceWorkspaceName;
    sourceDatasetName.Name = nameOfSourceFeatureClass;

    //create target workspace name
    IDataset targetWorkspaceDataset = (IDataset)targetWorkspace;
    IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDataset.FullName;

    //create target dataset name
    IFeatureClassName targetFeatureClassName = new FeatureClassNameClass();
    IDatasetName targetDatasetName = (IDatasetName)targetFeatureClassName;
    targetDatasetName.WorkspaceName = targetWorkspaceName;
    targetDatasetName.Name = nameOfTargetFeatureClass;

    //Open input Featureclass to get field definitions.
    ESRI.ArcGIS.esriSystem.IName sourceName = (ESRI.ArcGIS.esriSystem.IName)sourceFeatureClassName;
    IFeatureClass sourceFeatureClass = (IFeatureClass)sourceName.Open();

    //Validate the field names because you are converting between different workspace types.
    IFieldChecker fieldChecker = new FieldCheckerClass();
    IFields targetFeatureClassFields;
    IFields sourceFeatureClassFields = sourceFeatureClass.Fields;
    IEnumFieldError enumFieldError;

    // Most importantly set the input and validate workspaces!
    fieldChecker.InputWorkspace = sourceWorkspace;
    fieldChecker.ValidateWorkspace = targetWorkspace;
    fieldChecker.Validate(sourceFeatureClassFields, out enumFieldError, out targetFeatureClassFields);

    // Loop through the output fields to find the geomerty field
    IField geometryField;
    for (int i = 0; i < targetFeatureClassFields.FieldCount; i++)
    {
        if (targetFeatureClassFields.get_Field(i).Type == esriFieldType.esriFieldTypeGeometry)
        {
            geometryField = targetFeatureClassFields.get_Field(i);
            // Get the geometry field's geometry defenition
            IGeometryDef geometryDef = geometryField.GeometryDef;

            //Give the geometry definition a spatial index grid count and grid size
            IGeometryDefEdit targetFCGeoDefEdit = (IGeometryDefEdit)geometryDef;

            targetFCGeoDefEdit.GridCount_2 = 1;
            targetFCGeoDefEdit.set_GridSize(0, 0); //Allow ArcGIS to determine a valid grid size for the data loaded
            targetFCGeoDefEdit.SpatialReference_2 = geometryField.GeometryDef.SpatialReference;

            // we want to convert all of the features
            IQueryFilter queryFilter = new QueryFilterClass();
            queryFilter.WhereClause = "";

            // Load the feature class
            IFeatureDataConverter fctofc = new FeatureDataConverterClass();
            IEnumInvalidObject enumErrors = fctofc.ConvertFeatureClass(sourceFeatureClassName, queryFilter, null, targetFeatureClassName, geometryDef, targetFeatureClassFields, "", 1000, 0);
            break;
        }
    }
}
复制代码

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。


    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6262358.html ,如需转载请自行联系原作者

相关文章
|
9月前
|
存储 Python
Python 的其他主题:解释 Python 中的命名空间(Namespace)是什么?
Python 的其他主题:解释 Python 中的命名空间(Namespace)是什么?
86 2
|
9月前
|
Python
什么是Python中的命名空间(Namespace)?如何访问不同命名空间中的变量?
什么是Python中的命名空间(Namespace)?如何访问不同命名空间中的变量?
139 0
|
Python
第22天:Python NameSpace & Scope
第22天:Python NameSpace & Scope
141 0
第22天:Python NameSpace & Scope
|
8月前
|
C++
C++一分钟之—名空间(namespace)的作用与使用
【6月更文挑战第22天】C++的命名空间是代码组织的关键,防止命名冲突并促进模块化。通过`namespace`定义代码块,如`MyNamespace{...}`,并使用别名(`namespace MN = MyNamespace::...`)简化引用。避免过度使用和嵌套,以及`using namespace`的滥用,而应在小范围内导入所需成员。明智选择名空间名称并有效利用`using`声明,能提升代码可读性和专业性。
256 1
关于catkin_init_workspace找不到命令的原因
关于catkin_init_workspace找不到命令的原因
564 3
关于catkin_init_workspace找不到命令的原因
|
C++
如何使用命令行删除TFS客户端无用的Workspace
有时候,如果我们的项目更换了TFS服务器,当本地的项目目录没有变化时,但我们check out项目时会提示这个"路径...已经定义到工作区",解决这个问题可以通过删除之前旧的workspace来完成。 首先我们打开VS的命令提示行: 之后输入tf workspaces 命令来查看已有的workspace,注意,命令最后有个s。
815 0
|
图形学
Unity 报错之 The type or namespace name 'UI' does not exist in the namespace 'UnityEngine'
关于Unity2017 升级到 Unity2019 两个问题。 The type or namespace name 'UI' does not exist in the namespace 'UnityEngine'
3309 0
Unity 报错之 The type or namespace name 'UI' does not exist in the namespace 'UnityEngine'
|
9月前
Mac系统R语言升级后无法加载包报错 package or namespace load failed in dyn.load
Mac系统R语言升级后无法加载包报错 package or namespace load failed in dyn.load
|
9月前
launcher中Workspace类大致分析
launcher中Workspace类大致分析
42 1
|
敏捷开发 存储 数据可视化
aPaaS是什么(aPaaS与iPaaS的区别)
依题:aPaaS是什么?aPaaS与iPaaS二者之间的区别在哪?要想了解区别,首先得搞清概念,不然就是在耍流氓!下面本人就从概念到区别用大白话给你一次性讲清楚。
aPaaS是什么(aPaaS与iPaaS的区别)

热门文章

最新文章