zjknet
路人甲
路人甲
  • 注册日期2006-09-22
  • 发帖数10
  • QQ
  • 铜币158枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:940回复:0

[求助] 将Shapfile 导入Geodatabase (vc)问题

楼主#
更多 发布于:2007-08-21 21:43
<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>

喜欢0 评分0
游客

返回顶部