Transfer.cpp
上传用户:bjslfz
上传日期:2022-07-25
资源大小:4430k
文件大小:42k
源码类别:

文件操作

开发平台:

C/C++

  1. // Transfer.cpp: implementation of the CTransfer class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "SHP2VCT.h"
  6. #include "Transfer.h"
  7. #include "ShpFile.h"
  8. #include "MapRecordSet.h"
  9. #include "MapField.h"
  10. #include "MapFields.h"
  11. #ifdef _DEBUG
  12. #undef THIS_FILE
  13. static char THIS_FILE[]=__FILE__;
  14. #define new DEBUG_NEW
  15. #endif
  16. //////////////////////////////////////////////////////////////////////
  17. // Construction/Destruction
  18. //////////////////////////////////////////////////////////////////////
  19. CTransfer::CTransfer(CString source,CString target)
  20. {
  21. if(source.Right(4)==".shp" && target.Right(4)==".vct")
  22. {
  23. int i;
  24. m_bShpOpen = FALSE;
  25. m_bShxOpen = FALSE;
  26. m_shpType = NULLSHP;
  27. /* -------------------------------------------------------------------- */
  28. /* Establish the byte order on this machine.                 */
  29. /* -------------------------------------------------------------------- */
  30. i = 1;
  31. if( *((uchar *) &i) == 1 )
  32. m_bBigEndian = FALSE;
  33. else
  34. m_bBigEndian = TRUE;
  35. if(!SHP2VCT(source,target))
  36. AfxMessageBox("数据转换失败",MB_OK,MB_ICONINFORMATION);
  37. else 
  38. AfxMessageBox("数据转换完成",MB_OK,MB_ICONINFORMATION);
  39. }
  40. AfxMessageBox("源文件:"+ source +"n目标文件:" + target,MB_OK,MB_ICONINFORMATION);
  41. }
  42. /*************************************************
  43.   描述:         读入DBF文件格式 
  44.   输入:         文件名(全路径) 
  45.   输出:        成功返回TRUE 失败返回FALSE
  46. *************************************************/
  47. CTransfer::~CTransfer()
  48. {
  49. CMapPoint*    pPt;
  50. CMapPoints*   pPts;
  51. CMapLine*     pLine;
  52. CMapPolygon*  pPolygon;
  53. while(!m_ObList.IsEmpty())
  54. {
  55. switch ( m_shpType )
  56.         {  
  57. case POINT:
  58. pPt =(CMapPoint*)m_ObList.RemoveTail();
  59. delete pPt;
  60. break;
  61. case MULTIPOINT:
  62. pPts =(CMapPoints*)m_ObList.RemoveTail();
  63. delete pPts;
  64. break;
  65. case POLYLINE:
  66. pLine =(CMapLine*)m_ObList.RemoveTail();
  67. delete pLine;
  68. break;
  69. case POLYGON:
  70. pPolygon =(CMapPolygon*)m_ObList.RemoveTail();
  71. delete pPolygon;
  72. break;
  73. default:
  74. m_ObList.RemoveTail();
  75. break;
  76. }
  77. }    
  78. if ( m_bShpOpen )
  79. m_fShp.Close();
  80. if (m_bShxOpen)
  81. m_fShx.Close();
  82. m_pRecordSet->fDbf.Close();
  83. if ( m_pRecordSet )
  84. delete m_pRecordSet;
  85. if ( m_bVctOpen)
  86. fclose(m_pVctFile);
  87. }
  88. /*************************************************
  89.   描述:         读入DBF文件格式 
  90.   输入:         文件名(全路径) 
  91.   输出:        成功返回TRUE 失败返回FALSE
  92. *************************************************/
  93. BOOL CTransfer::ReadDBF(CString& csFileName)
  94. {
  95. CString csDbfName;
  96. BOOL bResult;
  97. //创建记录集对象
  98. m_pRecordSet = new CMapRecordSet;
  99. ASSERT ( m_pRecordSet != NULL ); 
  100. csDbfName = csFileName.Left(csFileName.GetLength() - 3);
  101. csDbfName = csDbfName + "dbf";
  102. //打开DBF文件
  103. bResult =  m_pRecordSet->openDBF(csDbfName); 
  104.     if ( !bResult )
  105. delete m_pRecordSet;
  106. return bResult;
  107. }
  108. /*************************************************
  109.   描述:         打开要操作的文件,读文件头及记录 
  110.   输入:         源文件名,目标文件名
  111.   输出:        成功返回TRUE 失败返回FALSE  
  112. *************************************************/
  113. BOOL CTransfer::SHP2VCT(CString& sourceFileName,CString& targetFileName)
  114. {
  115. int   iTemp;
  116. CString csShxName;
  117. CFileException fe;
  118.     SHPHEADER varHeader;
  119. //打开主文件
  120. if ( !m_fShp.Open(sourceFileName, CFile::modeRead|CFile::shareDenyWrite,&fe))
  121. return FALSE;
  122. m_bShpOpen = TRUE;
  123.     
  124. //打开索引文件
  125. csShxName = sourceFileName.Left(sourceFileName.GetLength() - 3);
  126. csShxName = csShxName + "shx";
  127. //AfxMessageBox(csShxName);
  128.     if ( !m_fShx.Open(csShxName, CFile::modeRead|CFile::shareDenyWrite,&fe))
  129. return FALSE;
  130. m_bShxOpen = TRUE;
  131. /////////////////////////////////////////////////////////////////////////
  132. TRY
  133.     {
  134. //读主文件头 长100字节
  135. if ( m_fShp.Read(&varHeader , sizeof(SHPHEADER))!= sizeof(SHPHEADER))
  136. return FILE_READERR;
  137.         iTemp = varHeader.iFileCode;
  138. if ( !m_bBigEndian )
  139. SwapWord(sizeof(int),&iTemp);
  140. if ( iTemp != 9994 ) //是否是shp文件
  141. return FILE_CODEERR;
  142.         if ( varHeader.iVersion != FILE_VERSION ) //文件版本是否正确
  143. return FILE_VERSIONERR;        
  144. //shp 类型  
  145. m_shpType = varHeader.iShpType;  
  146. m_shpFileLength = varHeader.iFileLength;
  147. if ( !m_bBigEndian )
  148. SwapWord(sizeof(int),&m_shpFileLength);
  149. //保存数据最大矩形范围
  150. m_Extent.SetLeft(varHeader.dbXMin);
  151. m_Extent.SetRight(varHeader.dbXMax);
  152. m_Extent.SetTop(varHeader.dbYMin);
  153. m_Extent.SetBottom(varHeader.dbYMax);
  154. //读索引文件头 长100字节
  155. if ( m_fShx.Read(&varHeader , sizeof(SHPHEADER))!= sizeof(SHPHEADER))
  156. return FILE_READERR;
  157. iTemp = varHeader.iFileCode; 
  158. if ( !m_bBigEndian )
  159. SwapWord(sizeof(int),&iTemp);
  160. if ( iTemp != 9994 ) //是否是shx文件
  161. return FILE_CODEERR;
  162.         if ( varHeader.iVersion != FILE_VERSION ) //文件版本是否正确
  163. return FILE_VERSIONERR;
  164. m_shxFileLength = varHeader.iFileLength; 
  165. if ( !m_bBigEndian )
  166. SwapWord(sizeof(int),&m_shxFileLength);
  167. //通过索引文件计算主文件记录个数 文件长度数值以16位计
  168. m_iRecordCount = ((m_shxFileLength - 50 )*2)/sizeof(SHXRECORD);
  169. if ( !ReadRecord() )
  170. return FILE_READERR;
  171. if ( !ReadDBF(sourceFileName))
  172. return FALSE;
  173. }
  174. CATCH(CFileException ,eload)
  175.     {
  176. m_fShp.Abort();
  177. return FALSE;
  178.     }
  179. END_CATCH
  180. if(!WriteVctData(targetFileName))
  181. {
  182. AfxMessageBox("无法转换!");
  183. }
  184. return TRUE;
  185. }
  186. /*************************************************
  187.   描述:         读入Shp对象坐标 
  188.   输入:         无
  189.   输出:        成功返回TRUE 失败返回FALSE  
  190. *************************************************/
  191. BOOL CTransfer::ReadRecord()
  192. {
  193. int i,j,k,m;
  194. int iDataLen,iLength,iIndex;
  195. int *pIParts;
  196. double dbTmp;
  197. char *pszBuffer,*lpVer;
  198. BOOL bEof;
  199. SHPINFO shpIn;
  200. SHPRECORDHEADER RecordHeader;
  201.     CMapRectangle objRectangle;
  202.     CMapPoint   *pPoint;
  203. CMapPoints  *pPoints;
  204. CMapParts   *pParts;
  205. CMapLine    *pLine;
  206. CMapPolygon *pPolygon;
  207. bEof = FALSE;
  208. switch ( m_shpType )
  209. {
  210. case NULLSHP:
  211. return FALSE;
  212. break;
  213. case POINT:
  214. {
  215. SHPPTCONTENT point;
  216. //读入点记录
  217. for ( i = 1 ; i <= m_iRecordCount ; i++ ) 
  218. {
  219. iLength = SetRecordPos(i);
  220. if ( iLength <= 0 )
  221. return FALSE;
  222. //获得记录头信息
  223. if (!GetRecordHeader(RecordHeader))
  224. return FALSE;
  225. //记录内容长度是否与shp实体大小一致,索引记录长度是否与记录内容长度一致
  226. if ( RecordHeader.iContentLength*2 != sizeof(point)||
  227. RecordHeader.iContentLength*2 != iLength)
  228. return FALSE;
  229. if(m_fShp.Read(&point,sizeof(point))!= sizeof(point))
  230. return FALSE;
  231. pPoint = new CMapPoint;
  232. iIndex = i - 1;
  233. pPoint->SetIndex(iIndex); 
  234. if ( pPoint == NULL )
  235. return FALSE;
  236. //类型是否匹配
  237. if ( point.iShpType != m_shpType) 
  238. return FALSE;
  239. pPoint->SetX(point.dbX );
  240. pPoint->SetY(point.dbY );
  241. m_ObList.AddTail(pPoint);  
  242. break;
  243. case POLYLINE:
  244. pszBuffer = new char [MAX_BUFFER_SIZE]; //分配缓冲区
  245. if ( pszBuffer == NULL )
  246. return FALSE;
  247. memset(pszBuffer , 0 , MAX_BUFFER_SIZE);
  248. //读入线记录
  249. for ( i = 1 ; i <= m_iRecordCount ; i++ ) //m_iRecordCount
  250. {
  251. iLength = SetRecordPos(i);
  252. if ( iLength <= 0 )
  253. return FALSE;
  254. pLine = new CMapLine();
  255. iIndex = i - 1;
  256. pLine->SetIndex(iIndex); 
  257. if ( pLine == NULL )
  258. return FALSE;
  259. //获得记录头信息
  260. if (!GetRecordHeader(RecordHeader))
  261. return FALSE;
  262. if ( !GetShpInfo(shpIn))
  263. return FALSE;
  264. if (shpIn.ishpType != POLYLINE )//类型不匹配
  265. {  
  266. delete pLine;
  267. continue;
  268. }
  269. if ( shpIn.iNumParts*sizeof(int) > MAX_BUFFER_SIZE )
  270. {
  271. //多义线段数大于最大缓冲区长度,忽略该对象
  272. delete pLine;
  273. continue;
  274. //计算对象内容实际长度
  275. j = sizeof(SHPINFO) + shpIn.iNumParts*sizeof(int) ;
  276. j += shpIn.iNumPoints*sizeof(SHPPOINT);  
  277. //判断实际长度是否与索引文件中记录的一致 
  278. if ( RecordHeader.iContentLength*2 != j )
  279. {
  280. delete pLine;
  281. continue;
  282. }  
  283. //设置shp矩形范围
  284. objRectangle.SetLeft(shpIn.Box[0].dbX);
  285. objRectangle.SetTop(shpIn.Box[0].dbY);
  286. objRectangle.SetRight(shpIn.Box[1].dbX);
  287. objRectangle.SetBottom(shpIn.Box[1].dbY);
  288. pLine->SetExtent(objRectangle);
  289. pIParts = new int[shpIn.iNumParts];
  290. if ( pIParts == NULL )
  291. {
  292. delete pLine;
  293. return FALSE;
  294. }
  295. //读入多义线段索引
  296. if ( m_fShp.Read(pIParts,shpIn.iNumParts*4) != (uint)(shpIn.iNumParts*4))
  297. {
  298. delete pLine;
  299. return FALSE;
  300. }
  301. //点坐标存储所占字节数
  302. iLength = shpIn.iNumPoints*sizeof(SHPPOINT);
  303. //初始化缓冲区数据
  304. iDataLen = ReadPoint(pszBuffer,iLength,bEof);
  305. if ( iDataLen < 0 )
  306. {
  307. delete pLine;
  308. delete pIParts;
  309. return FALSE;
  310. }  
  311. lpVer = pszBuffer;
  312. for ( j = 0 ;  j < shpIn.iNumParts ; j++ )
  313. {
  314. pParts  = new CMapParts();
  315. pPoints = new CMapPoints();
  316. if ( pParts == NULL || pPoints == NULL)
  317. return FALSE;
  318. if ( j == shpIn.iNumParts - 1 )
  319. {
  320. k = pIParts[j];        //本段第一个顶点索引
  321. m = shpIn.iNumPoints ; //下一个段第一个顶点索引 
  322. }
  323. else
  324. {
  325. k = pIParts[j];
  326. m = pIParts[j+1];
  327. }
  328. //处理第i段的顶点
  329. for ( ; k < m ; k++)
  330. {   
  331. pPoint = new CMapPoint();
  332. if ( pPoint == NULL )
  333. return FALSE;
  334. //需要读入数据更新缓冲区
  335. if ( lpVer == pszBuffer + iDataLen && !bEof)
  336. {
  337. iDataLen = ReadPoint(pszBuffer,iLength,bEof);
  338. if ( iDataLen < 0 )
  339. {
  340. delete pPoint;
  341. delete pPoints;
  342. delete pLine;
  343. delete pIParts;
  344. return FALSE;
  345. }  
  346. lpVer = pszBuffer;
  347. }
  348. dbTmp = *(double*)lpVer;
  349. pPoint->SetX(dbTmp);
  350. lpVer += 8;
  351. //需要读入数据更新缓冲区
  352. if ( lpVer == pszBuffer + iDataLen && !bEof)
  353. {
  354. iDataLen = ReadPoint(pszBuffer,iLength,bEof);
  355. if ( iDataLen < 0 )
  356. {
  357. delete pPoint;
  358. delete pPoints;
  359. delete pLine;
  360. delete pIParts;
  361. return FALSE;
  362. }  
  363. lpVer = pszBuffer;
  364. }
  365. dbTmp = *(double*)(lpVer);
  366. lpVer += 8;
  367. pPoint->SetY(dbTmp); 
  368. pPoints->Add(pPoint); 
  369. }  
  370. pParts->Add(pPoints);   
  371. pLine->Add(pParts); 
  372. }
  373. m_ObList.AddTail( pLine);
  374. delete []pIParts;
  375.             }
  376. delete []pszBuffer;
  377. break;
  378.         case POLYGON:
  379. pszBuffer = new char [MAX_BUFFER_SIZE]; //分配缓冲区
  380. if ( pszBuffer == NULL )
  381. return FALSE;
  382. memset(pszBuffer , 0 , MAX_BUFFER_SIZE);
  383.             
  384. //读入多边形记录
  385. for ( i = 1 ; i <= m_iRecordCount ; i++ ) //m_iRecordCount
  386. {
  387. iLength = SetRecordPos(i);
  388. if ( iLength <= 0 )
  389. return FALSE;
  390. pPolygon = new CMapPolygon();
  391. iIndex = i - 1;
  392.                 pPolygon->SetIndex(iIndex);
  393. if (pPolygon == NULL )
  394. return FALSE;
  395. //获得记录头信息
  396. if (!GetRecordHeader(RecordHeader))
  397. return FALSE;
  398. if ( !GetShpInfo(shpIn))
  399. return FALSE;
  400. if (shpIn.ishpType != POLYGON )//类型不匹配
  401. {  
  402. delete pPolygon;
  403. continue;
  404. }
  405. if ( shpIn.iNumParts*sizeof(int) > MAX_BUFFER_SIZE )
  406. {
  407. //复合多边型中的多边形个数大于最大缓冲区长度,忽略该对象
  408. delete pPolygon;
  409. continue;
  410. //计算对象内容实际长度
  411. j = sizeof(SHPINFO) + shpIn.iNumParts*sizeof(int) ;
  412. j += shpIn.iNumPoints*sizeof(SHPPOINT);  
  413. //判断实际长度是否与索引文件中记录的一致 
  414. if ( RecordHeader.iContentLength*2 != j )
  415. {
  416. delete pPolygon;
  417. continue;
  418. }  
  419. //设置shp矩形范围
  420. objRectangle.SetLeft(shpIn.Box[0].dbX);
  421. objRectangle.SetTop(shpIn.Box[0].dbY);
  422. objRectangle.SetRight(shpIn.Box[1].dbX);
  423. objRectangle.SetBottom(shpIn.Box[1].dbY); 
  424. pPolygon->SetExtent(objRectangle);
  425. pIParts = new int[shpIn.iNumParts];
  426. if ( pIParts == NULL )
  427. {
  428. delete pPolygon;
  429. return FALSE;
  430. }
  431. //读入复合多边型段索引
  432. if ( m_fShp.Read(pIParts,shpIn.iNumParts*4) != (uint)(shpIn.iNumParts*4))
  433. {
  434. delete pPolygon;
  435. return FALSE;
  436. }
  437. //点坐标存储所占字节数
  438. iLength = shpIn.iNumPoints*sizeof(SHPPOINT);
  439. //初始化缓冲区数据
  440. iDataLen = ReadPoint(pszBuffer,iLength,bEof);
  441. if ( iDataLen < 0 )
  442. {
  443. delete pPolygon;
  444. delete pIParts;
  445. return FALSE;
  446. }  
  447. lpVer = pszBuffer;
  448. for ( j = 0 ;  j < shpIn.iNumParts ; j++ )
  449. {
  450. pParts  = new CMapParts();
  451. pPoints = new CMapPoints();
  452. if ( pParts == NULL || pPoints == NULL)
  453. return FALSE;
  454. if ( j == shpIn.iNumParts - 1 )
  455.                     {
  456. k = pIParts[j];        //本段第一个顶点索引
  457. m = shpIn.iNumPoints ; //下一个段第一个顶点索引 
  458.                     }
  459. else
  460.                     {
  461. k = pIParts[j];
  462. m = pIParts[j+1];
  463. }
  464. //处理第i段的顶点
  465. for ( ; k < m ; k++)
  466.                     {   
  467. pPoint = new CMapPoint();
  468. if ( pPoint == NULL )
  469. return FALSE;
  470. //需要读入数据更新缓冲区
  471. if ( lpVer == pszBuffer + iDataLen && !bEof)
  472. {
  473. iDataLen = ReadPoint(pszBuffer,iLength,bEof);
  474. if ( iDataLen < 0 )
  475. {
  476. delete pPolygon;
  477. delete pIParts;
  478. return FALSE;
  479. }  
  480. lpVer = pszBuffer;
  481. }
  482. dbTmp = *(double*)lpVer;
  483. pPoint->SetX(dbTmp);
  484.                         lpVer += 8;
  485. //需要读入数据更新缓冲区
  486. if ( lpVer == pszBuffer + iDataLen && !bEof)
  487. {
  488. iDataLen = ReadPoint(pszBuffer,iLength,bEof);
  489. if ( iDataLen < 0 )
  490. {
  491. delete pPolygon;
  492. delete pIParts;
  493. return FALSE;
  494. }  
  495. lpVer = pszBuffer;
  496. }
  497. dbTmp = *(double*)(lpVer);
  498.                         pPoint->SetY(dbTmp); 
  499. pPoints->Add(pPoint); 
  500. lpVer += 8;
  501. }  
  502.                     pParts->Add(pPoints);   
  503. pPolygon->Add(pParts); 
  504. }
  505. m_ObList.AddTail( pPolygon);
  506. delete []pIParts;
  507.             }
  508. delete []pszBuffer;
  509. break;
  510. default:
  511. return FALSE;
  512. break;
  513.     }    
  514. return TRUE;   
  515. }
  516. /*************************************************
  517.   描述:         计算每条shp对象相对文件头的偏移量
  518.   输入:         记录索引值(从零开始)
  519.   输出:        该shp对象数据在文件中的位置  
  520. *************************************************/
  521. int CTransfer::SetRecordPos( int iRecord )
  522. {
  523.     unsigned int iOffset,iTmp;
  524. SHXRECORD shxRD;
  525. if ( iRecord < 0 )
  526. return 0;
  527.     //获得索引文件记录偏移量相对文件头
  528. if (iRecord == 1 )
  529. iOffset = sizeof(SHPHEADER)  ;  
  530. else
  531. iOffset = sizeof(SHPHEADER) + (iRecord-1)*sizeof(shxRecord) ;
  532. if ( iOffset > m_shxFileLength*2 - sizeof(shxRecord) )
  533. return 0;
  534. m_fShx.Seek( iOffset , CFile::begin );
  535. int m = sizeof(shxRD);
  536. m_fShx.Read( &shxRD , sizeof(shxRD));
  537. iTmp = shxRD.iOffset;
  538. SwapWord(sizeof(int),&iTmp);
  539. m_fShp.Seek(iTmp*2 ,  CFile::begin );
  540. iTmp = shxRD.iContentLength;
  541. SwapWord(sizeof(int),&iTmp);
  542. return iTmp*2;
  543. }
  544. /*************************************************
  545.   描述:         获得每条shp对象记录记录头的信息
  546.   输入:         记录头结构对象
  547.   输出:        成功返回TRUE 失败返回FALSE    
  548. *************************************************/
  549. BOOL CTransfer::GetRecordHeader(SHPRECORDHEADER& RecordHeader )
  550. {
  551. int iLength,iNum;
  552. if(m_fShp.Read(&RecordHeader,sizeof(RecordHeader))!= sizeof(RecordHeader))
  553. return FALSE;
  554. if ( !m_bBigEndian )
  555.     {  
  556. iNum    = RecordHeader.iRecordNum;
  557.         iLength = RecordHeader.iContentLength;
  558. SwapWord(sizeof(int),&iLength);
  559. SwapWord(sizeof(int),&iNum);
  560. RecordHeader.iRecordNum = iNum;
  561.         RecordHeader.iContentLength = iLength;
  562. }
  563.     return TRUE;
  564. }
  565. /*************************************************
  566.   描述:         获得每条shp对象描述信息
  567.   输入:         描述信息结构对象
  568.   输出:        成功返回TRUE 失败返回FALSE    
  569. *************************************************/
  570. BOOL CTransfer::GetShpInfo(SHPINFO& varInfo)
  571. {
  572. if(m_fShp.Read(&varInfo,sizeof(varInfo))!= sizeof(varInfo))
  573. return FALSE;
  574. return TRUE;
  575. }
  576. /*************************************************
  577.   描述:         读入点对象数据
  578.   输入:         数据缓冲区指针 缓冲区最大32K 
  579.                 如果超出需要分多次读取,要读取的长度、
  580. 是否已读取完成
  581.   输出:        读取数据的实际长度   
  582. *************************************************/
  583. int  CTransfer::ReadPoint(char* pszBuffer,int& iLength,BOOL& bEof)
  584. {
  585. if ( iLength > MAX_BUFFER_SIZE)
  586.     {
  587. iLength -= MAX_BUFFER_SIZE;
  588. if ( m_fShp.Read(pszBuffer,MAX_BUFFER_SIZE) != MAX_BUFFER_SIZE )
  589. return FILE_READERR;
  590. bEof = FALSE;
  591. return MAX_BUFFER_SIZE;
  592.     }
  593.     else
  594.     {   
  595. if ( m_fShp.Read(pszBuffer,iLength) != (uint)iLength )
  596. return FILE_READERR;
  597. bEof = TRUE;
  598. return iLength;
  599. }     
  600. }
  601. /*************************************************
  602.   描述:         向目标文件写文件头数据
  603.   输入:         目标VCT文件名
  604.   输出:        无
  605. *************************************************/
  606. void CTransfer::WriteVctFileHead(FILE* pfile)
  607. {
  608. fprintf(pfile,"%s%sn","DataMark: ",m_VctFilehead.DataMark);
  609. fprintf(pfile,"%s%2.1fn","VerSion: ",m_VctFilehead.VerSion); 
  610. fprintf(pfile,"%s%cn","Unit: ",m_VctFilehead.Unit);
  611. fprintf(pfile,"%s%dn","Dim: ",m_VctFilehead.Dim);
  612. fprintf(pfile,"%s%dn","Topo: ",m_VctFilehead.Topo);
  613. if(m_VctFilehead.MinX!=0)
  614. fprintf(pfile,"%s%9.6fn","MinX: ",m_VctFilehead.MinX);
  615. if(m_VctFilehead.MinY!=0)
  616. fprintf(pfile,"%s%9.6fn","MinY: ",m_VctFilehead.MinY);
  617. if(m_VctFilehead.MinZ!=0)
  618. fprintf(pfile,"%s%9.6fn","MinZ: ",m_VctFilehead.MinZ);
  619. if(m_VctFilehead.MaxX!=0)
  620. fprintf(pfile,"%s%9.6fn","MaxX: ",m_VctFilehead.MaxX);
  621. if(m_VctFilehead.MaxY!=0)
  622. fprintf(pfile,"%s%9.6fn","MaxY: ",m_VctFilehead.MaxY);
  623. if(m_VctFilehead.MaxZ!=0)
  624. fprintf(pfile,"%s%9.6fn","MaxZ: ",m_VctFilehead.MaxZ);
  625. if(m_VctFilehead.ScaleM!=0)
  626. fprintf(pfile,"%s%9.0fn","ScaleM: ",m_VctFilehead.ScaleM);
  627. if(m_VctFilehead.Projection!="NO")
  628. fprintf(pfile,"%s%sn","Projection: ",m_VctFilehead.Projection);
  629. if(m_VctFilehead.Spheroid!="NO")
  630. fprintf(pfile,"%s%sn","Spheroid: ",m_VctFilehead.Spheroid);
  631. if(m_VctFilehead.Parameters!="NO")
  632. fprintf(pfile,"%s%sn","Parameters: ",m_VctFilehead.Parameters);
  633. if(m_VctFilehead.Date!="NO")
  634. fprintf(pfile,"%s%sn","Date: ",m_VctFilehead.Date);
  635. fprintf(pfile,"%s%cn","Separator: ",m_VctFilehead.Separator);
  636. ///暂没有坐标系Coordinate
  637. }
  638. /*************************************************
  639.   描述:         向目标文件写要素类型参数
  640.   输入:         目标VCT文件名
  641.   输出:        无
  642. *************************************************/
  643. void CTransfer::WriteVctFeature(FILE *pfile)
  644. {
  645. if(m_pVctFeature==NULL)
  646. {
  647. AfxMessageBox("被转入的文件没有要素类型参数信息");
  648. return;
  649. }
  650. VCTFeature* pVisitFeature = m_pVctFeature;
  651. while(pVisitFeature!=NULL)
  652. {
  653. fprintf(pfile,"%s,",pVisitFeature->Code);
  654. fprintf(pfile,"%s,",pVisitFeature->Name);
  655. fprintf(pfile,"%s,",pVisitFeature->Shape);
  656. fprintf(pfile,"%d,",pVisitFeature->Color);
  657. fprintf(pfile,"%s",pVisitFeature->ListName);
  658. fputs("n",pfile);
  659. pVisitFeature=pVisitFeature->pNext;
  660. }
  661. }
  662. /*************************************************
  663.   描述:         向目标文件写属性数据结构
  664.   输入:         目标VCT文件名
  665.   输出:        无
  666. *************************************************/
  667. void CTransfer::WriteVctTableStructure(FILE *pfile)
  668. {
  669. if(m_pVctTblStruct==NULL)
  670. {
  671. AfxMessageBox("被转入的文件没有属性数据结构信息");
  672. return;
  673. }
  674. VCTTableStructure *pVisitTblStruct=m_pVctTblStruct;
  675. while(pVisitTblStruct!=NULL)
  676. {
  677. fprintf(pfile,"%s,",pVisitTblStruct->ListName);
  678. fprintf(pfile,"%dn",pVisitTblStruct->ItemNum);
  679. for(int i=0;i<pVisitTblStruct->ItemNum;i++)
  680. {
  681. fprintf(pfile,"%s,",pVisitTblStruct->pItem[i].Name);
  682. fprintf(pfile,"%s,",pVisitTblStruct->pItem[i].Type);
  683. if(pVisitTblStruct->pItem[i].Type=="Char"||pVisitTblStruct->pItem[i].Type=="Integer")
  684. fprintf(pfile,"%dn",pVisitTblStruct->pItem[i].Width);
  685. if(pVisitTblStruct->pItem[i].Type=="Float")
  686. {
  687. fprintf(pfile,"%d,",pVisitTblStruct->pItem[i].Width);
  688. fprintf(pfile,"%dn",pVisitTblStruct->pItem[i].Pric);
  689. }
  690. }
  691. pVisitTblStruct=pVisitTblStruct->pTblNext;
  692. }
  693. }
  694. /*************************************************
  695.   描述:         向目标文件写图形数据
  696.   输入:         目标VCT文件名
  697.   输出:        无
  698. *************************************************/
  699. void CTransfer::WriteVctGraphy(FILE *pfile)
  700. {
  701. fputs("PointBeginn",pfile);
  702. WriteVctPoint(pfile);
  703. fputs("PointEndn",pfile);
  704. fputs("n",pfile);
  705. fputs("LineBeginn",pfile);
  706. WriteVctLine(pfile);
  707. fputs("LineEndn",pfile); 
  708. fputs("n",pfile);
  709. fputs("PolygonBeginn",pfile);
  710. WriteVctPolygon(pfile);
  711. fputs("PolygonEndn",pfile);
  712. fputs("n",pfile);
  713. }
  714. /*************************************************
  715.   描述:         向目标文件写图形数据点数据
  716.   输入:         目标VCT文件名
  717.   输出:        无
  718. *************************************************/
  719. void CTransfer::WriteVctPoint(FILE *pfile)
  720. {
  721. if(m_pVctPointData==NULL)
  722. {
  723. //AfxMessageBox("被转入的文件没有点数据信息");
  724. return;
  725. }
  726. VCTPointData *pVisitPoint=m_pVctPointData;
  727. while(pVisitPoint!=NULL)
  728. {
  729. fprintf(pfile,"%sn",pVisitPoint->AimCode);
  730. fprintf(pfile,"%sn",pVisitPoint->FeatureCode);
  731. fprintf(pfile,"%sn",pVisitPoint->LayerName);
  732. fprintf(pfile,"%dn",pVisitPoint->PointMark);
  733. fprintf(pfile,"%f,",pVisitPoint->X);
  734. fprintf(pfile,"%fn",pVisitPoint->Y);
  735. //////////////////////////坐标Z未加
  736. if(m_VctFilehead.Topo==2 && pVisitPoint->PointMark==2)
  737. {
  738. //////////待扩充的模块
  739. }
  740. fputs("n",pfile);
  741. pVisitPoint=pVisitPoint->pNext;
  742. }
  743. }
  744. /*************************************************
  745.   描述:         向目标文件写图形数据线数据
  746.   输入:         目标VCT文件名
  747.   输出:        无
  748. *************************************************/
  749. void CTransfer::WriteVctLine(FILE *pfile)
  750. {
  751. /////写线数据
  752. if(m_pVctLineData==NULL)
  753. {
  754. //AfxMessageBox("被转入的文件没有线数据信息");
  755. return;
  756. }
  757. VCTLineData *pVisitLine=m_pVctLineData;
  758. while(pVisitLine!=NULL)
  759. {
  760. fprintf(pfile,"%sn",pVisitLine->AimCode);
  761. fprintf(pfile,"%sn",pVisitLine->FeatureCode);
  762. fprintf(pfile,"%sn",pVisitLine->LayerName);
  763. fprintf(pfile,"%dn",pVisitLine->LineMark);
  764. if(pVisitLine->LineMark!=100)
  765. {
  766. fprintf(pfile,"%dn",pVisitLine->PointNum);
  767. for(int i=0;i<pVisitLine->PointNum;i++)
  768. {  
  769. fprintf(pfile,"%f,",pVisitLine->pMemberPoint->X);
  770. fprintf(pfile,"%fn",pVisitLine->pMemberPoint->Y);
  771. ///坐标Z暂未加
  772. pVisitLine->pMemberPoint = pVisitLine->pMemberPoint->pNext;
  773. }
  774. }
  775. else
  776. {
  777. ///////写间接坐标
  778. fprintf(pfile,"%dn",pVisitLine->ChildNum);
  779. int cout=GetShang(pVisitLine->ChildNum,8);
  780. for(int i=0;i<cout+1;i++)
  781. {
  782. if(i!=cout)
  783. {
  784. for(int j=0;j<8;j++)
  785. {
  786. if(j==7)
  787. fprintf(pfile,"%d",pVisitLine->pMemberChild[i*8+j]);
  788. else
  789. fprintf(pfile,"%d,",pVisitLine->pMemberChild[i*8+j]);
  790. }
  791. }
  792. else
  793. {
  794. for(int j=0;j<pVisitLine->ChildNum%8;j++)
  795. {
  796. if(j==(pVisitLine->ChildNum%8)-1)
  797. fprintf(pfile,"%d",pVisitLine->pMemberChild[cout*8+j]);
  798. else
  799. fprintf(pfile,"%d,",pVisitLine->pMemberChild[cout*8+j]);
  800. }
  801. }
  802. fputs("n",pfile);
  803. }
  804. }
  805. fputs("n",pfile);
  806. pVisitLine=pVisitLine->pNext;
  807. }
  808. }
  809. /*************************************************
  810.   描述:         向目标文件写图形数据面数据
  811.   输入:         目标VCT文件名
  812.   输出:        无
  813.   modify by xiejing 2008-6-5
  814. *************************************************/
  815. void CTransfer::WriteVctPolygon(FILE *pfile)
  816. {
  817.    /////////写多边形
  818. if(m_pVctPolygon==NULL)
  819. {
  820. //AfxMessageBox("被转入的文件没有多边形数据信息");
  821. return;
  822. }
  823. VCTPolygonData* pVisitPolygon=m_pVctPolygon;
  824. while(pVisitPolygon!=NULL)
  825. {
  826. fprintf(pfile,"%sn",pVisitPolygon->AimCode);
  827. fprintf(pfile,"%sn",pVisitPolygon->FeatureCode);
  828. fprintf(pfile,"%sn",pVisitPolygon->LayerName);
  829. fprintf(pfile,"%f,",pVisitPolygon->labX);   
  830. fprintf(pfile,"%fn",pVisitPolygon->labY);
  831. if(m_VctFilehead.Topo==0)
  832. { ///////写直接坐标
  833. fprintf(pfile,"%dn",pVisitPolygon->PointNum);
  834. while(pVisitPolygon->pMemberPoint != NULL)
  835. {
  836. fprintf(pfile,"%f,",pVisitPolygon->pMemberPoint->X);
  837. fprintf(pfile,"%fn",pVisitPolygon->pMemberPoint->Y);
  838. pVisitPolygon->pMemberPoint = pVisitPolygon->pMemberPoint->pNext;
  839. }
  840. fprintf(pfile,"%dn",0);
  841. }
  842. else
  843. {
  844. /////////写间接坐标
  845. fprintf(pfile,"%dn",pVisitPolygon->ChildNum);
  846. int cout=GetShang(pVisitPolygon->ChildNum,8);
  847. for(int i=0;i<cout+1;i++)
  848. {
  849. if(i!=cout)
  850. {
  851. for(int j=0;j<8;j++)
  852. {
  853. if(j==7)
  854. fprintf(pfile,"%d",pVisitPolygon->pMemberChild[i*8+j]);
  855. else
  856. fprintf(pfile,"%d,",pVisitPolygon->pMemberChild[i*8+j]);
  857. }
  858. }
  859. else
  860. {
  861. for(int j=0;j<(pVisitPolygon->ChildNum%8);j++)
  862. {
  863. if(j==(pVisitPolygon->ChildNum%8)-1)
  864. fprintf(pfile,"%d",pVisitPolygon->pMemberChild[cout*8+j]);
  865. else
  866. fprintf(pfile,"%d,",pVisitPolygon->pMemberChild[cout*8+j]);
  867. }
  868. }
  869. fputs("n",pfile);
  870. }
  871. }
  872. fputs("n",pfile);
  873. pVisitPolygon=pVisitPolygon->pNext;
  874. }
  875. }
  876. /*************************************************
  877.   描述:         向目标文件写注记
  878.   输入:         目标VCT文件名
  879.   输出:        无
  880. *************************************************/
  881. void CTransfer::WriteVctAnnotation(FILE *pfile)
  882. {
  883. /////////////写注记
  884. if(m_pVctAnnotation==NULL)
  885. {
  886. //AfxMessageBox("被转入的文件没有注记信息");
  887. return;
  888. }
  889. VCTAnnotation *pVisitAnnotation=m_pVctAnnotation;
  890. while(pVisitAnnotation!=NULL)
  891. {
  892. fprintf(pfile,"%sn",pVisitAnnotation->AimCode);
  893. fprintf(pfile,"%sn",pVisitAnnotation->FeatureCode);
  894. fprintf(pfile,"%sn",pVisitAnnotation->LayerName);
  895. fprintf(pfile,"%sn",pVisitAnnotation->Font);
  896. fprintf(pfile,"%dn",pVisitAnnotation->Color);
  897. fprintf(pfile,"%d,",pVisitAnnotation->Pound);
  898. fprintf(pfile,"%d,",pVisitAnnotation->Shape);
  899. fprintf(pfile,"%cn",pVisitAnnotation->Udline);
  900. if(pVisitAnnotation->Size>0&&pVisitAnnotation->Size<100)
  901. fprintf(pfile,"%f,",pVisitAnnotation->Size);
  902. else
  903. fprintf(pfile,"%f,",pVisitAnnotation->Width);
  904. fprintf(pfile,"%fn",pVisitAnnotation->High);
  905.         fprintf(pfile,"%fn",pVisitAnnotation->Intevel);
  906. fprintf(pfile,"%sn",pVisitAnnotation->Content);
  907. fprintf(pfile,"%dn",pVisitAnnotation->AntnNum);
  908. for(int i=0;i<pVisitAnnotation->AntnNum;i++)
  909. {
  910. fprintf(pfile,"%f,",pVisitAnnotation->pMemberPoint[i].X);
  911. fprintf(pfile,"%fn",pVisitAnnotation->pMemberPoint[i].Y);
  912. //fprintf(pfile,"%dn",pVisitAnnotation->Z);
  913. }
  914. fputs("n",pfile);
  915. pVisitAnnotation=pVisitAnnotation->pNext;
  916. }
  917. }
  918. /*************************************************
  919.   描述:         向目标文件写属性数据
  920.   输入:         目标VCT文件名
  921.   输出:        无
  922. *************************************************/
  923. void CTransfer::WriteVctAttribute(FILE *pfile)
  924. {
  925. ///////写属性数据   
  926.     if(m_pVctAttribute==NULL)
  927. {
  928. AfxMessageBox("被转入的文件没有属性信息");
  929. return;
  930. }
  931. VCTAttribute *pVisitAbute=m_pVctAttribute;
  932. while( pVisitAbute != NULL)
  933. {
  934. fprintf(pfile,"%s,t",pVisitAbute->ListName);
  935. for(int i=1;i<pVisitAbute->ItemNum+1;i++)
  936. {
  937. if(i==pVisitAbute->ItemNum)
  938. {
  939. fprintf(pfile,"%sn",pVisitAbute->pRecordList->Record);
  940. }
  941. else
  942. {
  943. fprintf(pfile,"%s,t",pVisitAbute->pRecordList->Record);
  944. pVisitAbute->pRecordList = pVisitAbute->pRecordList->pNext;
  945. }
  946. }
  947. pVisitAbute=pVisitAbute->pNext;
  948. }
  949. fputs("TableEndn",pfile);
  950. }
  951. int CTransfer::GetShang(int dividend, int divisor)// 求商
  952. {
  953. int temp,result;
  954. temp=dividend%divisor;
  955. result=(dividend-temp)/divisor;
  956. return result;
  957. }
  958. /*************************************************
  959.   描述:         初始化VCT格式数据
  960.   输入:         源shp文件名
  961.   输出:        成功返回TRUE 失败返回FALSE
  962. *************************************************/
  963. BOOL CTransfer::InitVctData(CString& csTargetFileName)
  964. {
  965. //创建并打开目标vct文件
  966. m_pVctFile = fopen(csTargetFileName,"w");
  967. m_bVctOpen = TRUE;
  968. if(m_pVctFile==NULL)
  969. {
  970. AfxMessageBox("写入文件失败");
  971. return FALSE;
  972. }
  973. m_pVctFeature = NULL;
  974. m_pVctTblStruct = NULL;
  975. m_pVctPointData = NULL;
  976. m_pVctLineData = NULL;
  977. m_pVctPolygon = NULL;
  978. m_pVctAnnotation = NULL;
  979. m_pVctAttribute = NULL;
  980. //Vct文件头初始化
  981. m_VctFilehead.DataMark = "CNSDTF-VCT";
  982. m_VctFilehead.VerSion = (float) 1.0;
  983. m_VctFilehead.Unit = 'D';
  984. m_VctFilehead.Dim = 2;
  985. m_VctFilehead.Topo = 0;
  986. m_VctFilehead.MaxX = (float)0.0;
  987. m_VctFilehead.MaxY = (float)0.0;
  988. m_VctFilehead.MinX = (float)0.0;
  989. m_VctFilehead.MinY = (float)0.0;
  990. m_VctFilehead.MinZ = (float)0.0;
  991. m_VctFilehead.MaxZ = (float)0.0;
  992. m_VctFilehead.ScaleM = (float)10000.0;
  993. m_VctFilehead.Projection = "";
  994. m_VctFilehead.Spheroid = "";
  995. m_VctFilehead.Parameters = "";
  996. m_VctFilehead.Date = "NO";
  997. m_VctFilehead.Separator = ',';
  998. //取文件名
  999. CString tempName= csSourseFileName; //保存源文件的文件名
  1000. tempName = tempName.Mid(tempName.ReverseFind('\')+1);
  1001. m_strFileName = tempName.Left(tempName.ReverseFind('.'));
  1002.     //Vct要素类型初始化
  1003. m_pVctFeature = new VCTFeature();
  1004. m_pVctFeature->Code = m_pVctFeature->ListName 
  1005. = m_pVctFeature->Name 
  1006. = m_pVctFeature->Shape 
  1007. = m_strFileName;
  1008. m_pVctFeature->Color = 0;
  1009. m_pVctFeature->pNext = NULL;
  1010. //Vct属性数据结构初始化
  1011. m_pVctTblStruct = new VCTTableStructure();
  1012. m_pVctTblStruct->ItemNum = 0;
  1013. m_pVctTblStruct->ListName = m_strFileName;
  1014. m_pVctTblStruct->pItem = NULL;
  1015. m_pVctTblStruct->pTblNext = NULL;
  1016. //Vct几何图形数据初始化
  1017. m_pVctLineData = NULL;
  1018. m_pVctPolygon = NULL;
  1019. m_pVctPointData = NULL;
  1020. //Vct注记初始化(未定义)
  1021. m_pVctAnnotation = NULL;
  1022. //属性数据初始化
  1023. m_pVctAttribute = NULL;
  1024. //SHP格式数据到VCT格式数据的转换
  1025. DataTransfer();
  1026. return TRUE;
  1027. }
  1028. /*************************************************
  1029.   描述:         向目标vct文件写入数据
  1030.   输入:         源shp文件名
  1031.   输出:        成功返回TRUE 失败返回FALSE
  1032. *************************************************/
  1033. BOOL CTransfer::WriteVctData(CString& csFileName) 
  1034. {
  1035. if (!InitVctData(csFileName))
  1036. {
  1037. return FALSE;
  1038. }
  1039. fputs("HeadBeginn",m_pVctFile);
  1040. WriteVctFileHead(m_pVctFile);
  1041. fputs("HeadEndn",m_pVctFile);
  1042. fputs("n",m_pVctFile);
  1043. fputs("FeatureCodeBeginn",m_pVctFile); 
  1044. WriteVctFeature(m_pVctFile);
  1045. fputs("FeatureCodeEndn",m_pVctFile);
  1046. fputs("n",m_pVctFile);
  1047. fputs("TableStructureBeginn",m_pVctFile);
  1048. WriteVctTableStructure(m_pVctFile);
  1049. fputs("TableStructureEndn",m_pVctFile);
  1050. fputs("n",m_pVctFile);
  1051. WriteVctGraphy(m_pVctFile);
  1052. fputs("AnnotationBeginn",m_pVctFile);
  1053. WriteVctAnnotation(m_pVctFile);
  1054. fputs("AnnotationEndn",m_pVctFile);
  1055. fputs("n",m_pVctFile);
  1056. fputs("AttributeBeginn",m_pVctFile);
  1057. fputs(m_strFileName + "n",m_pVctFile);
  1058. WriteVctAttribute(m_pVctFile);
  1059. fputs("AttributeEndn",m_pVctFile);
  1060. fclose(m_pVctFile);
  1061. return TRUE;
  1062. }
  1063. /*************************************************
  1064.   描述:         数据转换
  1065.   输入:         无
  1066.   输出:        无
  1067. *************************************************/
  1068. void CTransfer::DataTransfer()
  1069. {
  1070. ///////////文件头数据转换/////////////////////////////////////////////
  1071. //边界
  1072. m_VctFilehead.MaxX = (float) m_Extent.GetRight();
  1073. m_VctFilehead.MinX = (float) m_Extent.GetLeft();
  1074. m_VctFilehead.MaxY = (float) m_Extent.GetBottom();
  1075. m_VctFilehead.MinY = (float) m_Extent.GetTop();
  1076. //时间
  1077. m_VctFilehead.Date.Format("%d%d%d",(int)m_pRecordSet->m_Header.yy,(int)m_pRecordSet->m_Header.mm,(int)m_pRecordSet->m_Header.dd);
  1078. //要素类型参数转换///
  1079. //直接加到初始化里了///////////////////
  1080. //属性数据结构转换//////////////////////////////////////////
  1081. TableStructureTransfer();
  1082. //几何图形数据部分//////////////////////////////////////////
  1083. GraphyDatatransfer();
  1084. //注记转换部分(省略)//////////////////////////////////////
  1085. //属性数据转换//////////////////////////////////////////////
  1086. AttributeTransfer();
  1087. }
  1088. /*************************************************
  1089.   描述:         文件头数据转换
  1090.   部分在DataTransfer()方法中,部分在初始化方法中
  1091.   输入:         无
  1092.   输出:        无
  1093. *************************************************/
  1094. /*************************************************
  1095.   描述:         要素类型参数转换
  1096.               (直接加到初始化里了)
  1097.   输入:         无
  1098.   输出:        无
  1099. *************************************************/
  1100. /*************************************************
  1101.   描述:         属性数据结构转换
  1102.   输入:         无
  1103.   输出:        无
  1104. *************************************************/
  1105. void CTransfer::TableStructureTransfer()
  1106. {
  1107. int iSize = m_pRecordSet->m_TableDesc.m_fieldsDesc.GetSize();
  1108. FIELD_ELEMENT* pFileElement;
  1109. VCTTableStructure* pTableStructure;
  1110. m_pVctTblStruct = pTableStructure = new VCTTableStructure();
  1111. pTableStructure->pTblNext = NULL;
  1112. pTableStructure->ItemNum = iSize;
  1113. pTableStructure->ListName = m_strFileName;
  1114.     pTableStructure->pItem = new VCTItem[iSize];
  1115. for(int i=0;i<iSize;i++)
  1116. {
  1117. pFileElement = m_pRecordSet->m_TableDesc.m_fieldsDesc.GetAt(i);
  1118. pTableStructure->pItem[i].Name.Format("%s",pFileElement->szFieldName);
  1119. pTableStructure->pItem[i].Width = (int)pFileElement->ucFieldLength;
  1120. if(pFileElement->cFieldType == 'N' || pFileElement->cFieldType == 'F' )
  1121. {
  1122. if( pFileElement->ucFieldDecimal == 0 )
  1123. pTableStructure->pItem[i].Type = "Integer";
  1124. else
  1125. {
  1126. pTableStructure->pItem[i].Type = "Float";
  1127. pTableStructure->pItem[i].Pric = (int) pFileElement->ucFieldDecimal;
  1128. }
  1129. }
  1130. else if(pFileElement->cFieldType == 'C')
  1131. {
  1132. pTableStructure->pItem[i].Type = "Char";
  1133. }
  1134. else
  1135. pTableStructure->pItem[i].Type = "Invaild";
  1136. }
  1137. }
  1138. /*************************************************
  1139.   描述:     几何图形数据部分转换
  1140.   输入:            无
  1141.   输出:           无
  1142. *************************************************/
  1143. void CTransfer::GraphyDatatransfer()
  1144. {
  1145. switch ( m_shpType )
  1146. {
  1147. case POINT:
  1148. {
  1149. m_pVctFeature->Shape = "Point";
  1150. CMapPoint* pPoint;
  1151. VCTPointData* pCurPointData;
  1152. POSITION pos = m_ObList.GetHeadPosition();
  1153. int iCount = 1;
  1154. while(pos != NULL)
  1155. {
  1156. if(iCount == 1)
  1157. {
  1158. m_pVctPointData = pCurPointData = new VCTPointData();
  1159. pCurPointData->pNext = NULL;
  1160. }
  1161. else
  1162. {
  1163. pCurPointData->pNext = new VCTPointData();
  1164. pCurPointData = pCurPointData->pNext;
  1165. pCurPointData->pNext = NULL;
  1166. }
  1167. pCurPointData->pNext = NULL;
  1168. pPoint = (CMapPoint*) m_ObList.GetNext(pos);
  1169. pCurPointData->FeatureCode = m_strFileName;
  1170. pCurPointData->LayerName = m_strFileName;
  1171. pCurPointData->X = (float) pPoint->GetX();
  1172. pCurPointData->Y = (float) pPoint->GetY();
  1173. pCurPointData->PointMark = 1;
  1174. pCurPointData->AimCode.Format("%d",iCount);
  1175. iCount ++;
  1176. }
  1177. break;
  1178. }
  1179. case POLYLINE:
  1180. {
  1181. m_pVctFeature->Shape = "Line";
  1182. CMapLine* pMapLine = NULL;
  1183. CMapParts* pMapParts;
  1184. CMapPoints* pPoints;
  1185. CMapPoint* pPoint;
  1186. VCTLineData* pVctLine;
  1187. POSITION pos = m_ObList.GetHeadPosition(); 
  1188. int tempLineCount = 0;
  1189. VCTPoint* pVctHeadPoint;
  1190. while(pos != NULL)
  1191. {
  1192. if(tempLineCount == 0)
  1193. {
  1194. m_pVctLineData = pVctLine = new VCTLineData();
  1195. pVctLine->pNext = NULL;
  1196. }
  1197. else
  1198. {
  1199. pVctLine->pNext = new VCTLineData();
  1200. pVctLine = pVctLine->pNext;
  1201. pVctLine->pNext = NULL;
  1202. }
  1203. pMapLine = (CMapLine*)m_ObList.GetNext(pos);
  1204. int temPointCount = 0;
  1205. for(int i=0;i<pMapLine->m_Line.GetSize();i++)//线
  1206. {
  1207. temPointCount = 0;
  1208. pMapParts = pMapLine->m_Line[i];
  1209. for(int j=0;j<pMapParts->m_Parts.GetSize();j++)//段
  1210. {
  1211. pPoints = pMapParts->m_Parts[j];
  1212. for(int k=0;k<pPoints->m_Points.GetSize();k++)//点
  1213. {
  1214. pPoint = pPoints->m_Points[k];
  1215. if(temPointCount == 0)
  1216. {
  1217. pVctHeadPoint = pVctLine->pMemberPoint = new VCTPoint();
  1218. pVctLine->pMemberPoint->pNext = NULL;
  1219. }
  1220. else
  1221. {
  1222. pVctLine->pMemberPoint->pNext = new VCTPoint();
  1223. pVctLine->pMemberPoint = pVctLine->pMemberPoint->pNext;
  1224. pVctLine->pMemberPoint->pNext = NULL;
  1225. }
  1226. pVctLine->pMemberPoint->X = (float)pPoint->GetX();
  1227. pVctLine->pMemberPoint->Y = (float)pPoint->GetY();
  1228. temPointCount++;
  1229. }
  1230. }
  1231. }
  1232. pVctLine->AimCode.Format("%d",++tempLineCount);
  1233. pVctLine->FeatureCode = m_strFileName;
  1234. pVctLine->LayerName = m_strFileName;
  1235. pVctLine->LineMark = 1;
  1236. pVctLine->PointNum = temPointCount;
  1237. pVctLine->pMemberPoint = pVctHeadPoint;
  1238. }
  1239. break;
  1240. }
  1241. case POLYGON:
  1242. {
  1243. m_pVctFeature->Shape = "Polygon";
  1244. CMapPolygon* pMapPoiygon = NULL;
  1245. CMapParts* pMapParts;
  1246. CMapPoints* pPoints;
  1247. CMapPoint* pPoint;
  1248. VCTPolygonData* pVctPolygon;
  1249. POSITION pos = m_ObList.GetHeadPosition(); 
  1250. int tempPolygonCount = 0;
  1251. VCTPoint* pVctHeadPoint;
  1252. while(pos != NULL)
  1253. {
  1254. if(tempPolygonCount == 0)
  1255. {
  1256. m_pVctPolygon = pVctPolygon = new VCTPolygonData();
  1257. pVctPolygon->pNext = NULL;
  1258. }
  1259. else
  1260. {
  1261. pVctPolygon->pNext = new VCTPolygonData();
  1262. pVctPolygon = pVctPolygon->pNext;
  1263. pVctPolygon->pNext = NULL;
  1264. }
  1265. pMapPoiygon = (CMapPolygon*) m_ObList.GetNext(pos);
  1266. pVctPolygon->AimCode.Format("%d",++tempPolygonCount);
  1267. pVctPolygon->FeatureCode = m_strFileName;
  1268. pVctPolygon->LayerName = m_strFileName;
  1269. // pVctPolygon->labX = (float) pMapPoiygon->m_Extent.GetLeft();  //why ()
  1270. // pVctPolygon->labY = (float) pMapPoiygon->m_Extent.GetTop();
  1271. pVctPolygon->labX = (float) 0.000000;  //why ()
  1272. pVctPolygon->labY = (float) atof("7836836683315036600000000000000000000.000000");
  1273. int iPointCount = 0;
  1274. for(int i=0;i<pMapPoiygon->m_Polygon.GetSize();i++)//线
  1275. {
  1276. pMapParts = pMapPoiygon->m_Polygon[i];
  1277. for(int j=0;j<pMapParts->m_Parts.GetSize();j++)//段
  1278. {
  1279. pPoints = pMapParts->m_Parts[j];
  1280. for(int k=0;k<pPoints->m_Points.GetSize();k++)//点
  1281. {
  1282. pPoint = pPoints->m_Points[k];
  1283. if(iPointCount == 0)
  1284. {
  1285. pVctHeadPoint = pVctPolygon->pMemberPoint = new VCTPoint();
  1286. pVctPolygon->pMemberPoint->pNext = NULL;
  1287. }
  1288. else
  1289. {
  1290. pVctPolygon->pMemberPoint->pNext = new VCTPoint();
  1291. pVctPolygon->pMemberPoint = pVctPolygon->pMemberPoint->pNext;
  1292. pVctPolygon->pMemberPoint->pNext = NULL;
  1293. }
  1294. pVctPolygon->pMemberPoint->X = (float)pPoint->GetX();
  1295. pVctPolygon->pMemberPoint->Y = (float)pPoint->GetY();
  1296. iPointCount++;
  1297. }
  1298. }
  1299. }
  1300. pVctPolygon->PointNum = iPointCount;
  1301. pVctPolygon->pMemberPoint = pVctHeadPoint;
  1302. }
  1303. break;
  1304. }
  1305. default:
  1306. break;
  1307. }
  1308. }
  1309. /*************************************************
  1310.   描述:      注记转换部分(忽略)
  1311.   输入:            无
  1312.   输出:           无
  1313. *************************************************/
  1314. /*************************************************
  1315.   描述:       属性数据转换
  1316.   输入:            无
  1317.   输出:           无
  1318. *************************************************/
  1319. void CTransfer::AttributeTransfer()
  1320. {
  1321. LONG    iRecordOffset;
  1322. char   *pszBuffer;
  1323. char   szBuff[255];
  1324. double dbValue;
  1325. FIELD_ELEMENT *pField;
  1326. CMapField *pMapField;
  1327. VCTAttribute* pAttribute;
  1328. VCTRecordList* pHeadRecordList;
  1329. VARIANT varValue;
  1330. //逐条读取属性记录
  1331. for(unsigned long recs=0;recs<m_pRecordSet->m_Header.no_recs;recs++)
  1332. {
  1333. if( recs < 0 || recs >= m_pRecordSet->m_Header.no_recs)
  1334. {
  1335. AfxMessageBox("无效的索引值!");
  1336. return; //无效的索引值
  1337. }
  1338. iRecordOffset = recs*m_pRecordSet->m_Header.rec_len + m_pRecordSet->m_Header.head_len;
  1339. pszBuffer = new char[ m_pRecordSet->m_Header.rec_len];
  1340.         m_pRecordSet->fDbf.Seek(iRecordOffset , CFile::begin);   
  1341. if ( m_pRecordSet->fDbf.Read(pszBuffer,m_pRecordSet->m_Header.rec_len) 
  1342. != m_pRecordSet->m_Header.rec_len)
  1343. {     
  1344. delete []pszBuffer;
  1345. AfxMessageBox("读取属性记录错误!");
  1346. return ;
  1347. }
  1348. if( recs == 0)
  1349. {
  1350. m_pVctAttribute = pAttribute = new VCTAttribute();
  1351. pAttribute->pNext = NULL;
  1352. }
  1353. else
  1354. {
  1355. pAttribute->pNext = new VCTAttribute();
  1356. pAttribute = pAttribute->pNext;
  1357. pAttribute->pNext = NULL;
  1358. }
  1359. pAttribute->ListName.Format("%d",recs+1);
  1360. pAttribute->ItemNum =  m_pRecordSet->m_TableDesc.GetFieldCount();
  1361. for ( int j = 0 ; j < m_pRecordSet->m_TableDesc.GetFieldCount() ; j++)
  1362. {
  1363. pMapField = new CMapField();
  1364. pField = m_pRecordSet->m_TableDesc.GetDesc(j); 
  1365. pMapField->SetName( pField->szFieldName );
  1366. pMapField->SetType( pField->cFieldType );
  1367. memset(szBuff , 0 , 255);
  1368. //略过该记录是否删除标记字节pszBuffer+1
  1369. strncpy(szBuff, pszBuffer+1+pField->ulOffset , pField->ucFieldLength);
  1370. if ( pField->cFieldType == 'N' || pField->cFieldType == 'F' )
  1371. {
  1372. ::VariantInit(&varValue);
  1373. dbValue = atof(szBuff );
  1374. if ( pField->ucFieldDecimal == 0 )
  1375. {   
  1376. varValue.bVal = VT_I4;   
  1377. varValue.lVal = (int)dbValue;
  1378. pMapField->SetType(fdInteger);
  1379. }
  1380. else
  1381. {
  1382. varValue.bVal = VT_R8;
  1383. varValue.dblVal = dbValue;
  1384. pMapField->SetType(fdDouble);
  1385. }
  1386. pMapField->SetValue(varValue);
  1387. }
  1388. else if ( pField->cFieldType == 'C' )
  1389. {
  1390. pMapField->SetValueAsString(szBuff);
  1391. pMapField->SetType(fdString);
  1392. }
  1393. else
  1394. pMapField->SetType(fdInvaild);
  1395. if( j == 0)
  1396. {
  1397. pHeadRecordList = pAttribute->pRecordList = new VCTRecordList();
  1398. pAttribute->pRecordList->pNext = NULL;
  1399. }
  1400. else
  1401. {
  1402. pAttribute->pRecordList->pNext = new VCTRecordList();
  1403. pAttribute->pRecordList = pAttribute->pRecordList->pNext;
  1404. pAttribute->pRecordList->pNext = NULL;
  1405. }
  1406. pAttribute->pRecordList->Record = pMapField->GetValueAsString();
  1407. delete pMapField;
  1408. pMapField = NULL;
  1409. }
  1410. delete []pszBuffer;
  1411. pszBuffer = NULL;
  1412. pAttribute->pRecordList = pHeadRecordList;
  1413. }
  1414. }