📄 mitab_priv.h
字号:
virtual int WriteObj(TABMAPObjectBlock *);
// protected:
virtual int ReadObj(TABMAPObjectBlock *);
private:
// private copy ctor and assignment operator to prevent shallow copying
TABMAPObjCollection& operator=(const TABMAPObjCollection& rhs);
TABMAPObjCollection(const TABMAPObjCollection& rhs);
};
/*=====================================================================
Classes to handle .MAP files low-level blocks
=====================================================================*/
typedef struct TABBlockRef_t
{
GInt32 nBlockPtr;
struct TABBlockRef_t *psNext;
} TABBlockRef;
/*---------------------------------------------------------------------
* class TABBinBlockManager
*
* This class is used to keep track of allocated blocks and is used
* by various classes that need to allocate a new block in a .MAP file.
*--------------------------------------------------------------------*/
class TABBinBlockManager
{
protected:
int m_nBlockSize;
GInt32 m_nLastAllocatedBlock;
TABBlockRef *m_psGarbageBlocks;
public:
TABBinBlockManager(int nBlockSize=512);
~TABBinBlockManager();
GInt32 AllocNewBlock();
void Reset();
void SetLastPtr(int nBlockPtr) {m_nLastAllocatedBlock=nBlockPtr; };
void PushGarbageBlock(GInt32 nBlockPtr);
GInt32 GetFirstGarbageBlock();
GInt32 PopGarbageBlock();
};
/*---------------------------------------------------------------------
* class TABRawBinBlock
*
* This is the base class used for all other data block types... it
* contains all the base functions to handle binary data.
*--------------------------------------------------------------------*/
class TABRawBinBlock
{
protected:
FILE *m_fp; /* Associated file handle */
TABAccess m_eAccess; /* Read/Write access mode */
int m_nBlockType;
GByte *m_pabyBuf; /* Buffer to contain the block's data */
int m_nBlockSize; /* Size of current block (and buffer) */
int m_nSizeUsed; /* Number of bytes used in buffer */
GBool m_bHardBlockSize;/* TRUE=Blocks MUST always be nSize bytes */
/* FALSE=last block may be less than nSize */
int m_nFileOffset; /* Location of current block in the file */
int m_nCurPos; /* Next byte to read from m_pabyBuf[] */
int m_nFirstBlockPtr;/* Size of file header when different from */
/* block size (used by GotoByteInFile()) */
int m_bModified; /* Used only to detect changes */
public:
TABRawBinBlock(TABAccess eAccessMode = TABRead,
GBool bHardBlockSize = TRUE);
virtual ~TABRawBinBlock();
virtual int ReadFromFile(FILE *fpSrc, int nOffset, int nSize = 512);
virtual int CommitToFile();
int CommitAsDeleted(GInt32 nNextBlockPtr);
virtual int InitBlockFromData(GByte *pabyBuf,
int nBlockSize, int nSizeUsed,
GBool bMakeCopy = TRUE,
FILE *fpSrc = NULL, int nOffset = 0);
virtual int InitNewBlock(FILE *fpSrc, int nBlockSize, int nFileOffset=0);
int GetBlockType();
virtual int GetBlockClass() { return TAB_RAWBIN_BLOCK; };
GInt32 GetStartAddress() {return m_nFileOffset;};
#ifdef DEBUG
virtual void Dump(FILE *fpOut = NULL);
#endif
void DumpBytes(GInt32 nValue, int nOffset=0, FILE *fpOut=NULL);
int GotoByteRel(int nOffset);
int GotoByteInBlock(int nOffset);
int GotoByteInFile(int nOffset,
GBool bForceReadFromFile = FALSE,
GBool bOffsetIsEndOfData = FALSE);
void SetFirstBlockPtr(int nOffset);
int GetNumUnusedBytes();
int GetFirstUnusedByteOffset();
int GetCurAddress();
virtual int ReadBytes(int numBytes, GByte *pabyDstBuf);
GByte ReadByte();
GInt16 ReadInt16();
GInt32 ReadInt32();
float ReadFloat();
double ReadDouble();
virtual int WriteBytes(int nBytesToWrite, GByte *pBuf);
int WriteByte(GByte byValue);
int WriteInt16(GInt16 n16Value);
int WriteInt32(GInt32 n32Value);
int WriteFloat(float fValue);
int WriteDouble(double dValue);
int WriteZeros(int nBytesToWrite);
int WritePaddedString(int nFieldSize, const char *pszString);
void SetModifiedFlag(GBool bModified) {m_bModified=bModified;};
// This semi-private method gives a direct access to the internal
// buffer... to be used with extreme care!!!!!!!!!
GByte * GetCurDataPtr() { return (m_pabyBuf + m_nCurPos); } ;
};
/*---------------------------------------------------------------------
* class TABMAPHeaderBlock
*
* Class to handle Read/Write operation on .MAP Header Blocks
*--------------------------------------------------------------------*/
class TABMAPHeaderBlock: public TABRawBinBlock
{
protected:
TABProjInfo m_sProj;
public:
TABMAPHeaderBlock(TABAccess eAccessMode = TABRead);
~TABMAPHeaderBlock();
virtual int CommitToFile();
virtual int InitBlockFromData(GByte *pabyBuf,
int nBlockSize, int nSizeUsed,
GBool bMakeCopy = TRUE,
FILE *fpSrc = NULL, int nOffset = 0);
virtual int InitNewBlock(FILE *fpSrc, int nBlockSize, int nFileOffset=0);
virtual int GetBlockClass() { return TABMAP_HEADER_BLOCK; };
int Int2Coordsys(GInt32 nX, GInt32 nY, double &dX, double &dY);
int Coordsys2Int(double dX, double dY, GInt32 &nX, GInt32 &nY,
GBool bIgnoreOverflow=FALSE);
int ComprInt2Coordsys(GInt32 nCenterX, GInt32 nCenterY,
int nDeltaX, int nDeltaY,
double &dX, double &dY);
int Int2CoordsysDist(GInt32 nX, GInt32 nY, double &dX, double &dY);
int Coordsys2IntDist(double dX, double dY, GInt32 &nX, GInt32 &nY);
int SetCoordsysBounds(double dXMin, double dYMin,
double dXMax, double dYMax);
int GetMapObjectSize(int nObjType);
GBool MapObjectUsesCoordBlock(int nObjType);
int GetProjInfo(TABProjInfo *psProjInfo);
int SetProjInfo(TABProjInfo *psProjInfo);
#ifdef DEBUG
virtual void Dump(FILE *fpOut = NULL);
#endif
// Instead of having over 30 get/set methods, we'll make all data
// members public and we will initialize them in the overloaded
// LoadFromFile(). For this reason, this class should be used with care.
GInt16 m_nMAPVersionNumber;
GInt16 m_nBlockSize;
double m_dCoordsys2DistUnits;
GInt32 m_nXMin;
GInt32 m_nYMin;
GInt32 m_nXMax;
GInt32 m_nYMax;
GBool m_bIntBoundsOverflow; // Set to TRUE if coordinates
// outside of bounds were written
GInt32 m_nFirstIndexBlock;
GInt32 m_nFirstGarbageBlock;
GInt32 m_nFirstToolBlock;
GInt32 m_numPointObjects;
GInt32 m_numLineObjects;
GInt32 m_numRegionObjects;
GInt32 m_numTextObjects;
GInt32 m_nMaxCoordBufSize;
GByte m_nDistUnitsCode; // See Appendix F
GByte m_nMaxSpIndexDepth;
GByte m_nCoordPrecision; // Num. decimal places on coord.
GByte m_nCoordOriginQuadrant;
GByte m_nReflectXAxisCoord;
GByte m_nMaxObjLenArrayId; // See gabyObjLenArray[]
GByte m_numPenDefs;
GByte m_numBrushDefs;
GByte m_numSymbolDefs;
GByte m_numFontDefs;
GInt16 m_numMapToolBlocks;
double m_XScale;
double m_YScale;
double m_XDispl;
double m_YDispl;
};
/*---------------------------------------------------------------------
* class TABMAPIndexBlock
*
* Class to handle Read/Write operation on .MAP Index Blocks (Type 01)
*--------------------------------------------------------------------*/
class TABMAPIndexBlock: public TABRawBinBlock
{
protected:
int m_numEntries;
TABMAPIndexEntry m_asEntries[TAB_MAX_ENTRIES_INDEX_BLOCK];
int ReadNextEntry(TABMAPIndexEntry *psEntry);
int WriteNextEntry(TABMAPIndexEntry *psEntry);
// Use these to keep track of current block's MBR
GInt32 m_nMinX;
GInt32 m_nMinY;
GInt32 m_nMaxX;
GInt32 m_nMaxY;
TABBinBlockManager *m_poBlockManagerRef;
// Info about child currently loaded
TABMAPIndexBlock *m_poCurChild;
int m_nCurChildIndex;
// Also need to know about its parent
TABMAPIndexBlock *m_poParentRef;
int ReadAllEntries();
public:
TABMAPIndexBlock(TABAccess eAccessMode = TABRead);
~TABMAPIndexBlock();
virtual int InitBlockFromData(GByte *pabyBuf,
int nBlockSize, int nSizeUsed,
GBool bMakeCopy = TRUE,
FILE *fpSrc = NULL, int nOffset = 0);
virtual int InitNewBlock(FILE *fpSrc, int nBlockSize, int nFileOffset=0);
virtual int CommitToFile();
virtual int GetBlockClass() { return TABMAP_INDEX_BLOCK; };
int GetNumFreeEntries();
int GetNumEntries() {return m_numEntries;};
TABMAPIndexEntry *GetEntry( int iIndex );
int AddEntry(GInt32 XMin, GInt32 YMin,
GInt32 XMax, GInt32 YMax,
GInt32 nBlockPtr,
GBool bAddInThisNodeOnly=FALSE);
int GetCurMaxDepth();
void GetMBR(GInt32 &nXMin, GInt32 &nYMin,
GInt32 &nXMax, GInt32 &nYMax);
GInt32 GetNodeBlockPtr() { return GetStartAddress();};
void SetMAPBlockManagerRef(TABBinBlockManager *poBlockMgr);
void SetParentRef(TABMAPIndexBlock *poParent);
void SetCurChildRef(TABMAPIndexBlock *poChild, int nChildIndex);
int GetCurChildIndex() { return m_nCurChildIndex; }
TABMAPIndexBlock *GetCurChild() { return m_poCurChild; }
TABMAPIndexBlock *GetParentRef() { return m_poParentRef; }
int SplitNode(GInt32 nNewEntryXMin, GInt32 nNewEntryYMin,
GInt32 nNewEntryXMax, GInt32 nNewEntryYMax);
int SplitRootNode(GInt32 nNewEntryXMin, GInt32 nNewEntryYMin,
GInt32 nNewEntryXMax, GInt32 nNewEntryYMax);
void UpdateCurChildMBR(GInt32 nXMin, GInt32 nYMin,
GInt32 nXMax, GInt32 nYMax,
GInt32 nBlockPtr);
void RecomputeMBR();
int InsertEntry(GInt32 XMin, GInt32 YMin,
GInt32 XMax, GInt32 YMax, GInt32 nBlockPtr);
int ChooseSubEntryForInsert(GInt32 nXMin, GInt32 nYMin,
GInt32 nXMax, GInt32 nYMax);
GInt32 ChooseLeafForInsert(GInt32 nXMin, GInt32 nYMin,
GInt32 nXMax, GInt32 nYMax);
int UpdateLeafEntry(GInt32 nBlockPtr,
GInt32 nXMin, GInt32 nYMin,
GInt32 nXMax, GInt32 nYMax);
int GetCurLeafEntryMBR(GInt32 nBlockPtr,
GInt32 &nXMin, GInt32 &nYMin,
GInt32 &nXMax, GInt32 &nYMax);
// Static utility functions for node splitting, also used by
// the TABMAPObjectBlock class.
static double ComputeAreaDiff(GInt32 nNodeXMin, GInt32 nNodeYMin,
GInt32 nNodeXMax, GInt32 nNodeYMax,
GInt32 nEntryXMin, GInt32 nEntryYMin,
GInt32 nEntryXMax, GInt32 nEntryYMax);
static int PickSeedsForSplit(TABMAPIndexEntry *pasEntries,
int numEntries,
int nSrcCurChildIndex,
GInt32 nNewEntryXMin,
GInt32 nNewEntryYMin,
GInt32 nNewEntryXMax,
GInt32 nNewEntryYMax,
int &nSeed1, int &nSeed2);
#ifdef DEBUG
virtual void Dump(FILE *fpOut = NULL);
#endif
};
/*---------------------------------------------------------------------
* class TABMAPObjectBlock
*
* Class to handle Read/Write operation on .MAP Object data Blocks (Type 02)
*--------------------------------------------------------------------*/
class TABMAPObjectBlock: public TABRawBinBlock
{
protected:
int m_numDataBytes; /* Excluding first 4 bytes header */
GInt32 m_nFirstCoordBlock;
GInt32 m_nLastCoordBlock;
GInt32 m_nCenterX;
GInt32 m_nCenterY;
// In order to compute block center, we need to keep track of MBR
GInt32 m_nMinX;
GInt32 m_nMinY;
GInt32 m_nMaxX;
GInt32 m_nMaxY;
// Keep track of current object either in read or read/write mode
int m_nCurObjectOffset; // -1 if there is no current object.
int m_nCurObjectId; // -1 if there is no current object.
int m_nCurObjectType; // -1 if there is no current object.
public:
TABMAPObjectBlock(TABAccess eAccessMode = TABRead);
~TABMAPObjectBlock();
virtual int CommitToFile();
virtual int InitBlockFromData(GByte *pabyBuf,
int nBlockSize, int nSizeUsed,
GBool bMakeCopy = TRUE,
FILE *fpSrc = NULL, int nOffset = 0);
virtual int InitNewBlock(FILE *fpSrc, int nBlockSize, int nFileOffset=0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -