阅读:940回复:0
[求助] 将Shapfile 导入Geodatabase (vc)问题
<P>最近用AE+ARCSDE (VC)Shapfile 导入Geodatabase 代码运行到最后转换函数:</P>
<P>ConvertFeatureClass()总是不成功。估计是pOutSDEFeatDSName的问题,(用ARCCATOLOG已经建立好了数据集Usa)但是找不出原因。恳请各位高手帮忙!!</P> <P>代码如下:</P> <P>HRESULT hr;<BR> AoInitialize;<BR> try<BR> {<BR> <BR> IPropertySetPtr pPropertySet;<BR> pPropertySet.CreateInstance(CLSID_PropertySet);<BR> <BR> <BR> CComBSTR server = CComBSTR("zjk");<BR> CComBSTR instance = CComBSTR("esri_sde");<BR> CComBSTR user = CComBSTR("sde");<BR> CComBSTR password = CComBSTR("sde");<BR> CComBSTR database = CComBSTR("sde");<BR> CComBSTR version = CComBSTR("SDE.DEFAULT");</P> <P> <BR> pPropertySet->SetProperty(CComBSTR("SERVER"),CComVariant(server));<BR> pPropertySet->SetProperty(CComBSTR("INSTANCE"),CComVariant(instance));<BR> pPropertySet->SetProperty(CComBSTR("DATABASE"),CComVariant(user));<BR> pPropertySet->SetProperty(CComBSTR("USER"),CComVariant(password));<BR> pPropertySet->SetProperty(CComBSTR("PASSWORD"),CComVariant(database));<BR> pPropertySet->SetProperty(CComBSTR("VERSION"),CComVariant(version));<BR> </P> <P> IWorkspaceNamePtr pOutSDEWorkspaceName;<BR> pOutSDEWorkspaceName.CreateInstance(CLSID_WorkspaceName);<BR> hr= pOutSDEWorkspaceName->put_ConnectionProperties(pPropertySet); <BR> hr= pOutSDEWorkspaceName->put_WorkspaceFactoryProgID(CComBSTR("esriDataSourcesGDB.SdeWorkspaceFactory.1"));//esriCore.SdeWorkspaceFactory<BR> <BR> IEnumDatasetNamePtr ipe;<BR> IFeatureDatasetNamePtr pOutSDEFeatDSName;<BR> hr= pOutSDEFeatDSName.CreateInstance(CLSID_FeatureDatasetName);<BR> IDatasetNamePtr pSDEDSname(pOutSDEFeatDSName);<BR> CComBSTR name;<BR> <BR> hr= pSDEDSname->putref_WorkspaceName(pOutSDEWorkspaceName);<BR> hr= pSDEDSname->put_Name(CComBSTR("Usa"));<BR> </P> <P> //定义导入数据源 <BR> //定义Shapfiles 对应的工作区名称对象<BR> <BR> <BR> IWorkspaceNamePtr ipWorkspaceName_InShp;<BR> ipWorkspaceName_InShp.CreateInstance(CLSID_WorkspaceName);<BR> <BR> CString shp_name="c:/Data/Usa/";<BR>// CString shp_name="c:/Data/Usa/";<BR> hr=ipWorkspaceName_InShp->put_PathName(CComBSTR(shp_name));<BR> hr=ipWorkspaceName_InShp->put_WorkspaceFactoryProgID(CComBSTR("esriDataSourcesFile.ShapefileWorkspaceFactory"));<BR> <BR> <BR> ////定义Shapefile对应的要素类名称对象<BR> <BR> <BR> IFeatureClassNamePtr pInshpFeatCLSNm;<BR> hr=pInshpFeatCLSNm.CreateInstance(CLSID_FeatureClassName);<BR> ////<BR> IDatasetNamePtr ipDatasetName_InShp(pInshpFeatCLSNm);<BR> hr=ipDatasetName_InShp->putref_WorkspaceName(ipWorkspaceName_InShp);<BR> hr=ipDatasetName_InShp->put_Name(CComBSTR("ushigh"));<BR> <BR> /////<BR> IFeatureClassNamePtr ipOutputFCName;<BR> ipOutputFCName.CreateInstance(CLSID_FeatureClassName);<BR> IDatasetNamePtr ipOutputDSName(ipOutputFCName);<BR> hr=ipOutputDSName->putref_WorkspaceName(pOutSDEWorkspaceName);<BR> hr=ipOutputDSName->put_Name(CComBSTR("USHIGN"));<BR> <BR> <BR> /////////打开输入的shapefile 对应的要素对象。从而可以获得SHAPEFILE 的属性项<BR> <BR> INamePtr pName(pInshpFeatCLSNm);<BR> IUnknownPtr pUnk;<BR> <BR> hr=pName->Open(;pUnk);<BR> IFeatureClassPtr pInshpFeatCls(pUnk);<BR> /////////////得到输入的FEATURE CLASS 的所有字段,并检查这些字段的合理性<BR> /////////最后复制这些字段给另外一个字段集对象<BR> <BR> long i;<BR> IFieldsPtr pOutSDEFlds;<BR> IFieldsPtr pInShpFlds;<BR> <BR> IFieldCheckerPtr pFldChk;<BR> IFieldPtr pGeoField(CLSID_Field);<BR> IGeometryDefPtr pOutSDEGeoDef;<BR> hr=pInshpFeatCls->get_Fields(;pInShpFlds);<BR> hr=pFldChk.CreateInstance(CLSID_FieldChecker);<BR> IEnumFieldErrorPtr EnumFieldError;<BR> hr=pFldChk->Validate(pInShpFlds,;EnumFieldError,;pOutSDEFlds);<BR> ///////////迭代循环得到几何字段,目的是为了得到这个要素的空间参考<BR> long fieldsCount;<BR> <BR> hr=pOutSDEFlds->get_FieldCount(;fieldsCount);<BR> IFieldPtr field ;<BR> esriFieldType fieldType;<BR> for (i=0;i<fieldsCount;i++)<BR> {<BR> hr= pOutSDEFlds->get_Field(i,;field);<BR> <BR> CComBSTR bname;<BR> <BR> field->get_Name(;bname);<BR> field->get_Type(;fieldType);<BR> <BR> if(fieldType==esriFieldTypeGeometry)<BR> {<BR> hr=pOutSDEFlds->get_Field(i,;pGeoField);<BR> <BR> break;<BR> }<BR> <BR> }<BR> <BR> <BR> hr=pGeoField->get_GeometryDef(;pOutSDEGeoDef);<BR> <BR> pOutSDEGeoDef.CreateInstance(CLSID_GeometryDef);<BR> hr=pGeoField->get_GeometryDef(;pOutSDEGeoDef);<BR> <BR> <BR> <BR> IGeometryDefEditPtr pOutSDEGeoDefEdit(pOutSDEGeoDef);<BR> hr=pOutSDEGeoDefEdit->put_GridCount(1);<BR> hr=pOutSDEGeoDefEdit->put_GridSize(0,1500);<BR> <BR> //////////////////////<BR> IFeatureDataConverterPtr pShpToFc;<BR> IEnumInvalidObjectPtr ipEnumIncvalidObject;<BR> <BR> pShpToFc.CreateInstance(CLSID_FeatureDataConverter);<BR> <BR> hr=pShpToFc->ConvertFeatureClass(pInshpFeatCLSNm ,NULL,pOutSDEFeatDSName,ipOutputFCName,<BR> NULL,pOutSDEFlds,CComBSTR(""),100,0,;ipEnumIncvalidObject); <BR> if(SUCCEEDED(hr))<BR> <BR> MessageBox("导入成功!!!!"); <BR>}<BR>catch(_com_error ;e)<BR>{<BR> _bstr_t bs(e.Source());<BR> _bstr_t bD(e.Description());<BR> ATLTRACE("\tMean =%s \n",e.ErrorMessage());<BR> ATLTRACE("\tSource =%s \n",(LPCTSTR)bs);<BR> ATLTRACE("\tDescript=%s \n",(LPCTSTR)bD);<BR> <BR> CString msg;<BR> msg.Format("%s" ,(LPCTSTR)bD);<BR> ATLTRACE(msg);<BR>}</P> |
|