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

文件操作

开发平台:

C/C++

  1. /************************************************************
  2.   文件名: shpFile.h
  3.   
  4.   作者:   谢婧       Version : 1.0          Date: 2008/05/26
  5.   
  6.   类描述: 完成Shp、shx、dbf 文件读取 实现对shp对象的管理及
  7.           绘制工作
  8.   
  9.   邮件地址:xiejing0707@163.com
  10. ***********************************************************/
  11. #ifndef _SHPFILE_H_
  12. #define _SHPFILE_H_
  13. #include "Global.h"
  14. #include "MapRectangle.h"
  15. #include "MapLine.h"
  16. #include "MapPolygon.h"
  17. #include "MapRender.h"
  18. #include "MapRecordSet.h"
  19. #define FILE_VERSION 1000
  20. #define MAX_BUFFER_SIZE 32768 /*32K*/
  21. /*系统错误常量*/
  22. #define FILE_READERR    -1 
  23. #define FILE_CODEERR    -2 
  24. #define FILE_VERSIONERR -3
  25. //shp 类型
  26. #define NULLSHP       0
  27. #define POINT         1
  28. #define POLYLINE      3
  29. #define POLYGON       5
  30. #define MULTIPOINT    8
  31. #define POINTZ        11
  32. #define POLYLINEZ     13
  33. #define POLYGONZ      15
  34. #define MULTIPOINTZ   18
  35. #define POINTM        21
  36. #define POLYLINEM     23
  37. #define POLYGONM      25
  38. #define MULTIPOINTM   28
  39. #define MULTIPATCH    31 
  40. #pragma pack(4) 
  41. typedef struct  {
  42. int iFileCode;      //文件标识
  43. int iReserved[5];   //保留字节
  44. int iFileLength;    //文件长度
  45. int iVersion;       //版本号
  46. int iShpType;       //文件类型
  47. double dbXMin;
  48. double dbYMin;
  49. double dbXMax;
  50. double dbYMax;
  51. double dbZMin;
  52. double dbZMax;
  53. double dbMMin;
  54. double dbMMax;
  55. } SHPHEADER;
  56. typedef struct shpRecordHeader {
  57. int iRecordNum;      //记录数
  58. int iContentLength;  //记录内容长度
  59. } SHPRECORDHEADER;
  60. typedef struct shpPoint
  61. {
  62. double dbX;
  63. double dbY;
  64. } SHPPOINT;
  65. typedef struct shpPtContent {
  66. int iShpType;
  67. double dbX;
  68. double dbY;
  69. } SHPPTCONTENT;
  70. typedef struct shxRecord {
  71. int iOffset;
  72. int iContentLength;
  73. } SHXRECORD;
  74. typedef struct shpInfo {
  75. int ishpType;          //shp 类型
  76. shpPoint Box[2];       //最大矩形范围 
  77. int iNumParts;         //分段数
  78. int iNumPoints;        //shp总共顶点数  
  79. } SHPINFO;
  80. class CMapLayer;
  81. class CShpFile 
  82. {
  83. public:
  84.     CShpFile();
  85. virtual ~CShpFile();
  86. public:
  87. BOOL ReadShp(CString& csFileName);
  88. CMapRectangle GetExtent();
  89. void SetExtent(CMapRectangle& extent );
  90. int GetShpType( ) {return m_shpType;};
  91. void SetShpType(int& iShpType);
  92. int SearchShape(CMapPoint& pt );
  93. void DrawShp(CDC*pDC ,  CMapRender* m_pRender , DrawParam& draw );
  94. void FlashShp(CDC*pDC , DrawParam& draw , int iIndex);
  95. protected:
  96. BOOL ReadRecord();
  97. BOOL GetRecordHeader(SHPRECORDHEADER& varHeader );
  98. BOOL GetShpInfo(SHPINFO& varInfo);
  99. int  ReadPoint(char* pszBuffer,int& iLength,BOOL& bEof); 
  100. int  SetRecordPos( int iRecord );
  101. BOOL ReadDBF(CString& csFileName);
  102. private:
  103. void DrawPoint(CDC*pDC ,  CMapRender* m_pRender , DrawParam& draw );
  104. void DrawPointElement(CDC*pDC,CMapPoint *pPoint,DrawParam& draw );
  105.     void DrawPLine(CDC*pDC ,  CMapRender* m_pRender , DrawParam& draw );
  106. void DrawPLineElement(CDC*pDC,CMapLine *pPline , DrawParam& draw );
  107. void DrawPolygon(CDC*pDC ,  CMapRender* m_pRender , DrawParam& draw );
  108. void DrawPolygonElement(CDC*pDC , CMapPolygon* pPolygon , DrawParam& draw );
  109. private:
  110. BOOL bShpOpen,bShxOpen;
  111. BOOL m_bBigEndian; 
  112. CFile fShp,fShx;
  113. CMapRectangle m_Extent;
  114. CMapRecordSet *pRecordSet;
  115. private:
  116. int m_shpFileLength;
  117. int m_shxFileLength;
  118. int m_iRecordCount;
  119. int m_shpType;
  120. CMapRectangle m_CurMapExtent;
  121. CObList m_ObList;
  122. private:
  123. friend class CMapLayer;
  124. };
  125. #endif //_SHPFILE_H_