IName和Iworkspace的区别和说明

本文介绍了在ArcGIS中IWorkspace接口和IFeatureDataConverter类的应用。通过IFeatureDataConverter实现了图层数据源的转换,同时解释了工作空间在不同数据库中的类型,并展示了如何从图层获取数据源路径以及进行数据转换的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于两者的区别,在这篇文章上( 两者相关的区别)已经说得很好了,我就在补充一些内容:

   

若进行叠加求交分析时,如果要进行多个图层的叠加,而此时输入的参数是图层,那么我们可以利用示例二,通过图层对象获取其数据源的路径。

实际上在ArcMap中的 Table of Contents(如下图)应该就是这样实现的:(左:图层)(右:数据源)




数据转换:IFeatureDataConverter 接口




例子:

[csharp] view plain copy
  1.   IFeatureLayer featureLayer=pLayer as IFeatureLayer;  
  2.                  IFeatureClass inputFeatureClass = featureLayer.FeatureClass;  
  3.                  IDataset inputDataset = (IDataset)inputFeatureClass;  
  4.               //  IDatasetName inputDatasetName = (IDatasetName)inputDataset.FullName;  
  5.                 IFeatureClassName inputclassName = (IFeatureClassName)inputDataset.FullName ;  
  6.              // Get the layer's selection set.   
  7.              //利用属性打开  
  8.                IPropertySet ps = new PropertySetClass();  
  9.                 ps.SetProperty("DATABASE", fd.SelectedPath);  
  10.                 IWorkspaceFactory wsf = new FileGDBWorkspaceFactoryClass();  
  11.              IWorkspace ws = null;  
  12.               try  
  13.               {  
  14.                   ws = wsf.Open(ps, 0);  
  15.               }  
  16.               catch (Exception e)  
  17.               {  
  18.                     
  19.               }  
  20.                 //设置输出要素属性  
  21.               IDataset ds = (IDataset)ws;  
  22.               IWorkspaceName wsName = (IWorkspaceName)ds.FullName;  
  23.               IFeatureClassName featClsName = new FeatureClassNameClass();  
  24.               IDatasetName dsName = (IDatasetName)featClsName;  
  25.               dsName.WorkspaceName = wsName;  
  26.               dsName.Name = pLayer.Name;  
  27.                 
  28.               //// Use the IFieldChecker interface to make sure all of the field names are valid for a shapefile.   
  29.               IFieldChecker fieldChecker = new FieldCheckerClass();  
  30.               IFields shapefileFields = null;  
  31.               IEnumFieldError enumFieldError = null;  
  32.               fieldChecker.InputWorkspace = inputDataset.Workspace;  
  33.               fieldChecker.ValidateWorkspace = ws;  
  34.                 //out and ref  
  35. //////////////////用Ref型参数时,传入的参数必须先被初始化。而Out则不要要,对Out而言,就必须在方法中对其完成初始化。  
  36. // ///////////////用Ref和Out时都必须注意,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。  
  37. /////////////////// Out更适合用在要要Return多个返回值的地方,而Ref则用在要要被调出使用的方法修改调出使用者的引用的时候。  
  38.               fieldChecker.Validate(inputFeatureClass.Fields, out enumFieldError, out shapefileFields);  
  39.     
  40.               // At this point, reporting/inspecting invalid fields would be useful, but for this example it's omitted.  
  41.     
  42.  // We also need to retrieve the GeometryDef from the input feature class.   
  43.               int shapeFieldPosition = inputFeatureClass.FindField(inputFeatureClass.ShapeFieldName);  
  44.               IFields inputFields = inputFeatureClass.Fields;  
  45.   
  46.               IField shapeField = inputFields.get_Field(shapeFieldPosition);  
  47.               IGeometryDef geometryDef = shapeField.GeometryDef;  
  48.   
  49.               IGeometryDef pGeometryDef = new GeometryDef();  
  50.               IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit;  
  51.               pGeometryDefEdit.GeometryType_2 = inputFeatureClass.ShapeType;  
  52.               pGeometryDefEdit.SpatialReference_2 = mapcontrol3.Map.SpatialReference;  
  53.     
  54.               // Now we can create a feature data converter.   
  55.               IFeatureDataConverter featureDataConverter = new FeatureDataConverterClass();  
  56.   
  57.                 
  58.               IEnumInvalidObject enumInvalidObject = featureDataConverter.ConvertFeatureClass(inputclassName, null,   
  59.                   null, featClsName, pGeometryDef, shapefileFields, "", 1000, 0);  



IWorkspaceName.WorkspaceFactoryProgID 枚举的常量类型:


• esriDataSourcesGDB.AccessWorkspaceFactory

• esriDataSourcesFile.ArcInfoWorkspaceFactory

• esriDataSourcesFile.CadWorkspaceFactory

• esriDataSourcesGDB.FileGDBWorkspaceFactory

• esriDataSourcesOleDB.OLEDBWorkspaceFactory

• esriDataSourcesFile.PCCoverageWorkspaceFactory

• esriDataSourcesRaster.RasterWorkspaceFactory

• esriDataSourcesGDB.SdeWorkspaceFactory

        • esriDataSourcesFile.ShapefileWorkspaceFactory

        • esriDataSourcesOleDB.TextFileWorkspaceFactory
        • esriDataSourcesFile.TinWorkspaceFactory

        • esriDataSourcesFile.VpfWorkspaceFactory

Iworkspace接口的一些说明:

    

工作空间是空间和非空间数据集的容器,例如特征类、光栅数据集和表。它提供了实例化现有数据集和创建新数据集的方法。工作空间被分类为esriWorkspaceType枚举器指定的类型;FileSystemWorkspace、LocalDatabaseWorkspace RemoteDatabaseWorkspace。shapefile和ArcInfo工作区是文件系统工作空间的示例。存储在Access或文件地理数据库中的个人地理数据库是LocalDatabaseWorkspace的一个示例。存储在Oracle、DB2、SqlServer或Informix等RDBMS中的地理数据库,并通过ArcSDE访问是一个远程数据库工作区示例。

工作空间的工作空间可以被持久化,例如,在一个映射文档中。应用程序可以在将其从持久存储中载入之后调用Open方法,以便连接到工作区,并获得一个对象引用。WorkspaceName name对象可以通过使用IDataset.FullName来从工作空间返回。

IWorkspace接口提供了访问工作空间的各种属性的方法,例如它的连接属性,以及它所包含的数据集的集合。

WorkSpace类不能直接实例化,必须要由IWorkSpaceFactory的Create方法创建。


<think>我们正在讨论Linux中的find命令,特别是-name参数的使用以及不同写法之间的行为差异。 用户的问题:find命令中-name参数的使用及其在不同写法下的行为差异,特别是`find -name``find . -name`之间的区别。 首先,我们需要理解find命令的基本结构: find命令的一般形式:find [path...] [expression] 其中: - [path...]:指定查找的目录路径,可以是一个或多个。如果不指定,则默认为当前目录(但行为可能有细微差异,见下文)。 - [expression]:由选项、测试动作组成,比如-name、-type、-exec等。 具体到-name参数: -name pattern:按照文件名模式匹配,pattern可以使用通配符(如*、?等),但需要注意通配符需要被引号包裹,以避免shell扩展。 现在讨论两种写法: 1. `find -name pattern` 2. `find . -name pattern` 这两种写法在大多数情况下行为相同,但存在一些细微差别: 1. 默认路径的差异: - 在第一种写法`find -name pattern`中,根据POSIX标准,如果没有指定路径,则默认使用当前目录(即`.`)。但是,在某些历史版本的find命令中,如果没有指定路径,可能会使用一个默认的路径列表(如当前目录某些系统目录),但现代系统中通常默认就是当前目录。 - 第二种写法`find . -name pattern`明确指定了从当前目录开始搜索。 2. 输出路径的差异: - 当使用`find -name pattern`时,输出的文件路径是相对于当前目录的,但不会以`./`开头(在大多数实现中,直接输出文件名或子目录下的文件路径)。 - 当使用`find . -name pattern`时,输出的文件路径会以`./`开头,表示相对于当前目录的路径。 例如,假设当前目录下有一个文件file.txt,执行: `find -name file.txt` 可能输出:`file.txt` 而`find . -name file.txt` 则输出:`./file.txt` 但是,这种输出格式的差异并不是绝对的,因为有些版本的find命令可能会在第一种情况下也输出`./file.txt`。实际上,这取决于具体的find实现版本。 3. 安全性可预测性: - 明确指定路径(如`.`)通常更安全,因为这样不会依赖于默认行为。在脚本中,建议总是指定路径以避免歧义。 4. 其他注意事项: - 在两种写法中,pattern中的通配符都需要正确转义。通常,我们会将pattern用引号括起来,以防止shell将其扩展。例如:`find . -name "*.txt"`。 另外,还有一种常见的写法是`find /path/to/dir -name pattern`,这是最通用的形式,指定了具体的搜索起点。 总结: - `find -name pattern` `find . -name pattern` 在搜索范围上都是当前目录。 - 主要区别在于输出格式:前者可能省略`./`前缀,而后者通常会包含。但实际行为可能因系统而异。 - 在脚本中,建议总是明确指定路径(使用第二种写法),以提高可读性可移植性。 为了验证,我们可以进行简单的测试: - 在当前目录创建一个文件:`touch testfile` - 分别运行: `find -name testfile` # 可能输出:testfile 或 ./testfile `find . -name testfile` # 输出:./testfile 在大多数现代Linux系统(如使用GNU find)中,两种命令的输出都会包含`./`前缀。但根据POSIX标准,当路径是`.`时,输出可以省略`./`前缀。实际上,GNU find在两种情况下都会输出`./testfile`(除非使用某些选项改变输出格式)。 然而,在BSD系统(包括macOS)上,`find -name testfile`会输出`./testfile`,而`find . -name testfile`也会输出`./testfile`,所以两者输出相同。 因此,实际差异可能很小,但为了可移植性,建议总是指定路径。 另外,注意:如果当前目录下有子目录,那么两种命令都会递归搜索子目录。 最后,我们还可以讨论一下-name与-iname区别(后者不区分大小写),以及如何使用多个-name条件(使用-o表示或,-a表示与,但默认是与关系)等,但用户的问题集中在两种写法上。 根据用户的问题,我们主要回答这两种写法的区别。 生成相关问题: 1. find命令中如何同时匹配多个文件名模式? 2. find命令中-name-iname参数有什么区别? 3. 如何限制find命令的搜索深度? 4. find命令除了-name还有哪些常用的搜索条件? 5. 在find命令中如何排除特定目录或文件? 6. find命令的-exec参数如何使用? 注意:在回答中,我们引用了POSIX标准以及不同实现(GNUBSD)的行为,但不需要具体引用文献,因为这是通用知识。不过,我们可以引用一些在线资源作为参考(如果用户需要进一步阅读)。 由于用户要求使用中文回答,我们使用中文。</think>### find命令中`-name`参数的使用及不同写法的行为差异 `-name`是`find`命令中最常用的参数之一,用于按文件名模式搜索文件。以下是详细解析: #### 1. `-name`基础用法 - **语法**:`find [路径] -name "模式"` - **功能**:匹配文件名(不包括路径),支持通配符: - `*`:匹配任意字符(如`*.txt`匹配所有文本文件) - `?`:匹配单个字符(如`file?.log`匹配`file1.log`等) - **注意**: 必须用引号包裹模式(单/双引号均可),防止Shell提前展开通配符。 示例:搜索当前目录下所有`.conf`文件: ```bash find . -name "*.conf" ``` #### 2. `find -name` vs `find . -name`的行为差异 | **写法** | `find -name "模式"` | `find . -name "模式"` | |------------------|--------------------------|----------------------------| | **搜索起点** | 当前目录(隐含`.`) | 明确指定当前目录(`.`) | | **输出格式** | 直接输出文件名(如`a.txt`) | 输出相对路径(如`./a.txt`) | | **递归行为** | ✅ 递归子目录 | ✅ 递归子目录 | | **安全性** | 路径未明确,易歧义 | 路径明确,推荐使用 | | **兼容性** | POSIX标准支持 | 更清晰的语法 | **关键区别**: - **输出路径表示方式不同**(是否带`./`前缀),但文件匹配结果相同。 - **示例对比**: 假设当前目录有文件`a.txt`: ```bash $ find -name "a.txt" a.txt # 直接输出文件名 $ find . -name "a.txt" ./a.txt # 输出带相对路径 ``` #### 3. 其他注意事项 - **区分大小写**:`-name`默认区分大小写,需不区分时用`-iname`(如`-iname "*.jpg"`匹配`.JPG`文件)。 - **多条件组合**: ```bash # 同时匹配.txt.md文件 find . -name "*.txt" -o -name "*.md" ``` - **路径深度控制**: 用`-maxdepth`限制搜索深度(如`find . -maxdepth 1 -name "*.log"`仅搜索当前目录)。 #### 4. 最佳实践 1. **始终明确路径**:优先用`find . -name`避免歧义。 2. **引号包裹模式**:防止通配符被Shell意外展开。 3. **测试验证**:复杂模式先用`echo`测试通配符行为(如`echo "*.conf"`)。 > ℹ️ 在大多数现代系统(如Linux的GNU findutils)中,`find -name``find . -name`的搜索范围完全相同,差异仅体现在输出格式上。但明确指定路径(`.`)可提高命令可读性可移植性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值