|
阅读:1252回复:1
我也来说说CreateFeatureClass出错的问题
平台:winXP(SP2)<BR>编译器:VC6(SP6)+AE9.2(许可全)<BR><FONT face="宋体 "><FONT size=5>该程序参照《</FONT></FONT><FONT style="FONT-SIZE: 14pt"><FONT face="Times New Roman ">ArcGIS</FONT></FONT><FONT face="宋体 "><FONT style="FONT-SIZE: 14pt">开发宝典-从入门到精通》编写(目录中的</FONT></FONT><FONT style="FONT-SIZE: 14pt"><FONT face="Times New Roman ">7.4.2</FONT></FONT><FONT face="宋体 "><FONT style="FONT-SIZE: 14pt">),你可参见这部分内容。</FONT></FONT><BR><BR>部分代码如下:<BR>......<BR>BOOL CDataOperator::AddHospitalLyr()<BR>{<BR>if(NULL == m_ipMap) return FALSE;<BR>BOOL bRes = FALSE;<BR>//创建MapComposer对象<BR>CString strHosName;<BR>strHosName.LoadString(ID_SIMMAP_HOSPITALNAME);<BR>CMapComposer MapComp;<BR>MapComp.m_ipMap = m_ipMap;<BR>ILayerPtr ipLyr = MapComp.GetLyrByName(strHosName);<BR>if(NULL == ipLyr)<BR>{<BR> //创建Access工作空间<BR> //注意:Location参数不必包含结尾的'\';Name不应包含扩展名.mdb<BR><BR> ///特征工作空间接口<BR> CString strMDBName;<BR> strMDBName.LoadString(ID_SIMMAP_MDBPATH);<BR> IWorkspacePtr ipWs = OpenPGD(strMDBName);<BR> IFeatureClassPtr ipFeatCls = OpenPGDFeatCls(ipWs, strHosName);<BR> if(NULL == ipFeatCls)<BR> {<BR> ipFeatCls = CreateHospitalFC();<BR> }<BR> bRes = AddFC2Map(ipFeatCls, strHosName);<BR> if(!bRes) return FALSE;<BR>}<BR>return TRUE;<BR>}<BR><BR>IFeatureClassPtr CDataOperator::CreateHospitalFC()<BR>{<BR>if(NULL == m_ipMap) return NULL;<BR>HRESULT hr;<BR>CString strMDBName;<BR>strMDBName.LoadString(ID_SIMMAP_MDBPATH);<BR>IWorkspacePtr ipWs = OpenPGD(strMDBName);<BR>IFieldsPtr ipFields(CLSID_Fields);<BR>IFieldsEditPtr ipFieldEdit(ipFields);<BR>IFieldEditPtr ipField;<BR>hr = ipFieldEdit->put_FieldCount(3);<BR>hr = ipField.CreateInstance(CLSID_Field);<BR>hr = ipField->put_Name((_bstr_t)"ObjectID");<BR>hr = ipField->put_AliasName((_bstr_t)"FID");<BR>hr = ipField->put_Type(esriFieldTypeOID);<BR>hr = ipFieldEdit->putref_Field(0, ipField);<BR>hr = ipField.CreateInstance(CLSID_Field);<BR>hr = ipField->put_Name((_bstr_t)"NAME");<BR>hr = ipField->put_AliasName((_bstr_t)"Name");<BR>hr = ipField->put_Type(esriFieldTypeString);<BR>hr = ipFieldEdit->putref_Field(1, ipField);<BR><BR>IGeometryDefEditPtr ipGeoDef(CLSID_GeometryDef);<BR>ISpatialReferencePtr ipSR;<BR>hr = m_ipMap->get_SpatialReference(;ipSR);<BR>hr = ipGeoDef->putref_SpatialReference(ipSR);<BR>hr = ipGeoDef->put_GeometryType(esriGeometryPoint);<BR>hr = ipField.CreateInstance(CLSID_Field);<BR>hr = ipField->put_Name((_bstr_t)"Shape");<BR>hr = ipField->put_AliasName((_bstr_t)"shape");<BR>hr = ipField->put_Type(esriFieldTypeGeometry);<BR>hr = ipField->putref_GeometryDef(ipGeoDef);<BR>hr = ipFieldEdit->putref_Field(2, ipField);<BR><BR>IFeatureClassPtr ipFeatCls = NULL;<BR>CString strHosName;<BR>strHosName.LoadString(ID_SIMMAP_HOSPITALNAME);<BR>ipFeatCls = CreateFC(ipWs, strHosName, ipFields, esriFTSimple);<BR>return ipFeatCls;<BR>}<BR><BR>IFeatureClassPtr CDataOperator::CreateFC(IWorkspacePtr ipWs, CString strFCName, IFieldsPtr ipFields, esriFeatureType eFT)<BR>{<BR>if(NULL == ipWs) return NULL;<BR>HRESULT hr;<BR>IFeatureClassPtr ipFeatCls = NULL;<BR>ipFeatCls = OpenPGDFeatCls(ipWs, strFCName);<BR>if(NULL != ipFeatCls) return ipFeatCls;<BR>BSTR bsShpFldName;<BR>IFieldPtr ipFd;<BR>esriFieldType eType;<BR>long lCnt, l;<BR>hr = ipFields->get_FieldCount(;lCnt);<BR>for(l = 0; l < lCnt; l++)<BR>{<BR> hr = ipFields->get_Field(l, ;ipFd);<BR> hr = ipFd->get_Type(;eType);<BR> if(esriFieldTypeGeometry == eType)<BR> {<BR> ipFd->get_Name(;bsShpFldName);<BR> break;<BR> }<BR>}<BR>if(l == lCnt) return NULL;<BR>IFeatureWorkspacePtr ipFeatWs(ipWs);<BR>hr = ipFeatWs->CreateFeatureClass((_bstr_t)strFCName, ipFields, NULL, NULL, eFT, bsShpFldName, (_bstr_t)"", ;ipFeatCls);<BR>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~跟到这一步出错.即会弹出CreateFeatureClass Fail!"的对话框.编译器显示pFeatCls为NULL<BR>if( FAILED(hr) ) <BR>{<BR> AfxMessageBox("CreateFeatureClass Fail!", MB_OK, 0);<BR> return NULL;<BR>}<BR>return ipFeatCls;<BR>}<BR>......<BR><BR>请各位大虾帮忙看看,解解惑,小弟拜谢了!
|
|
|
1楼#
发布于:2008-06-11 14:39
<P>我原来遇到类似的问题,主要原因是一些路径信息中含有中文,改成全部英文字符串的路径就好了。</P>
|
|