ArcGIS读取DWG文件路径问题

来源:互联网 发布:超链接调用js函数传参 编辑:程序博客网 时间:2024/06/07 05:48

1、问题背景

最近接手同事留下的一个加载DWG的问题。测试时发现传入DWG文件路径,打开的时候死活报错。

如图:


2、分析步骤

1)怀疑是ArcEngine未授权,于是添加授权代码进行测试,未能解决。

2)使用AccessWorkspaceFactory打开.mdb文件进行测试,发现可以打开。

3)是不是组件版本的问题呢?修改组件引用方式,修改版本,不能解决。

4)发现CadWorkspaceFactory位于ESRI.ArcGIS.DataSourcesFile命名空间下,于是想起打开FileGDB、Shapefile的方式,即传入的应该是文件夹路径。于是修改测试代码,发现可以解决问题。

3、解决办法

如图:


即:CadWorkspaceFactory打开的的文件路径应当是目标DWG文件所在的文件夹,而在使用FeatureWorkspace对象打开要素类即OpenFeatureClass时,其参数才是具体的“文件名+要素类类型”的形式。

4、一点思考

刚开始时觉得ArcEngine中打开DWG文件的方式很怪异,即明明写着OpenFromFile,其参数不是文件路径,而是文件夹路径,OpenFeatureClass时明明只需要指定FeatureClass的类型是点、线、面或注记,却还要在前面加上文件名,真是十分别扭。

结合平时使用C++进行ArcEngine开发的经历,忽然觉得这样也有其合理之处,理由如下:

1)DataSourcesFile本身就已经告诉我们了,我要加载的文件(这一点与基于C++进行ArcEngine开发的方式是一致的)所在的文件夹,而非PGDB。如加载FileGDB时,其参数虽以.gdb结尾,但本身就是一个文件夹,而不是.mdb文件这样的文件路径。

2)打开不同类型的文件,使用不同的WorkspaceFactory引擎,各个引擎之间的参数是不同的。

HRESULT hr;IWorkspaceFactoryPtr ipWorkspaceFactory;if (FissDataTypeFGDB == m_nDataType){hr = ipWorkspaceFactory.CreateInstance(CLSID_FileGDBWorkspaceFactory);}else if (FissDataTypePGDB == m_nDataType){hr = ipWorkspaceFactory.CreateInstance(CLSID_AccessWorkspaceFactory);}else if (FissDataTypeShape == m_nDataType){hr = ipWorkspaceFactory.CreateInstance(CLSID_ShapefileWorkspaceFactory);}if (FAILED(hr) || NULL == ipWorkspaceFactory){return FALSE;}

3)细心很重要。


原创粉丝点击