📄 mitab_priv.h
字号:
virtual int GetBlockClass() { return TABMAP_OBJECT_BLOCK; };
virtual int ReadIntCoord(GBool bCompressed, GInt32 &nX, GInt32 &nY);
int WriteIntCoord(GInt32 nX, GInt32 nY, GBool bCompressed);
int WriteIntMBRCoord(GInt32 nXMin, GInt32 nYMin,
GInt32 nXMax, GInt32 nYMax,
GBool bCompressed);
int UpdateMBR(GInt32 nX, GInt32 nY);
int PrepareNewObject(TABMAPObjHdr *poObjHdr);
int CommitNewObject(TABMAPObjHdr *poObjHdr);
void AddCoordBlockRef(GInt32 nCoordBlockAddress);
GInt32 GetFirstCoordBlockAddress() { return m_nFirstCoordBlock; }
GInt32 GetLastCoordBlockAddress() { return m_nLastCoordBlock; }
void GetMBR(GInt32 &nXMin, GInt32 &nYMin,
GInt32 &nXMax, GInt32 &nYMax);
void SetMBR(GInt32 nXMin, GInt32 nYMin,
GInt32 nXMax, GInt32 nYMax);
void Rewind();
int AdvanceToNextObject( TABMAPHeaderBlock * );
int GetCurObjectOffset() { return m_nCurObjectOffset; }
int GetCurObjectId() { return m_nCurObjectId; }
int GetCurObjectType() { return m_nCurObjectType; }
#ifdef DEBUG
virtual void Dump(FILE *fpOut = NULL) { Dump(fpOut, FALSE); };
void Dump(FILE *fpOut, GBool bDetails);
#endif
};
/*---------------------------------------------------------------------
* class TABMAPCoordBlock
*
* Class to handle Read/Write operation on .MAP Coordinate Blocks (Type 03)
*--------------------------------------------------------------------*/
class TABMAPCoordBlock: public TABRawBinBlock
{
protected:
int m_numDataBytes; /* Excluding first 8 bytes header */
GInt32 m_nNextCoordBlock;
int m_numBlocksInChain;
GInt32 m_nComprOrgX;
GInt32 m_nComprOrgY;
// 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;
TABBinBlockManager *m_poBlockManagerRef;
int m_nTotalDataSize; // Num bytes in whole chain of blocks
int m_nFeatureDataSize; // Num bytes for current feature coords
GInt32 m_nFeatureXMin; // Used to keep track of current
GInt32 m_nFeatureYMin; // feature MBR.
GInt32 m_nFeatureXMax;
GInt32 m_nFeatureYMax;
public:
TABMAPCoordBlock(TABAccess eAccessMode = TABRead);
~TABMAPCoordBlock();
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_COORD_BLOCK; };
void SetMAPBlockManagerRef(TABBinBlockManager *poBlockManager);
virtual int ReadBytes(int numBytes, GByte *pabyDstBuf);
virtual int WriteBytes(int nBytesToWrite, GByte *pBuf);
void SetComprCoordOrigin(GInt32 nX, GInt32 nY);
int ReadIntCoord(GBool bCompressed, GInt32 &nX, GInt32 &nY);
int ReadIntCoords(GBool bCompressed, int numCoords, GInt32 *panXY);
int ReadCoordSecHdrs(GBool bCompressed, int nVersion,
int numSections, TABMAPCoordSecHdr *pasHdrs,
GInt32 &numVerticesTotal);
int WriteCoordSecHdrs(int nVersion, int numSections,
TABMAPCoordSecHdr *pasHdrs,
GBool bCompressed);
void SetNextCoordBlock(GInt32 nNextCoordBlockAddress);
GInt32 GetNextCoordBlock() { return m_nNextCoordBlock; };
int WriteIntCoord(GInt32 nX, GInt32 nY, GBool bCompressed);
int GetNumBlocksInChain() { return m_numBlocksInChain; };
void ResetTotalDataSize() {m_nTotalDataSize = 0;};
int GetTotalDataSize() {return m_nTotalDataSize;};
void SeekEnd();
void StartNewFeature();
int GetFeatureDataSize() {return m_nFeatureDataSize;};
//__TODO__ Can we flush GetFeatureMBR() and all MBR tracking in this class???
void GetFeatureMBR(GInt32 &nXMin, GInt32 &nYMin,
GInt32 &nXMax, GInt32 &nYMax);
#ifdef DEBUG
virtual void Dump(FILE *fpOut = NULL);
#endif
};
/*---------------------------------------------------------------------
* class TABMAPToolBlock
*
* Class to handle Read/Write operation on .MAP Drawing Tool Blocks (Type 05)
*
* In addition to handling the I/O, this class also maintains the list
* of Tool definitions in memory.
*--------------------------------------------------------------------*/
class TABMAPToolBlock: public TABRawBinBlock
{
protected:
int m_numDataBytes; /* Excluding first 8 bytes header */
GInt32 m_nNextToolBlock;
int m_numBlocksInChain;
TABBinBlockManager *m_poBlockManagerRef;
public:
TABMAPToolBlock(TABAccess eAccessMode = TABRead);
~TABMAPToolBlock();
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_TOOL_BLOCK; };
void SetMAPBlockManagerRef(TABBinBlockManager *poBlockManager);
virtual int ReadBytes(int numBytes, GByte *pabyDstBuf);
virtual int WriteBytes(int nBytesToWrite, GByte *pBuf);
void SetNextToolBlock(GInt32 nNextCoordBlockAddress);
GBool EndOfChain();
int GetNumBlocksInChain() { return m_numBlocksInChain; };
int CheckAvailableSpace(int nToolType);
#ifdef DEBUG
virtual void Dump(FILE *fpOut = NULL);
#endif
};
/*=====================================================================
Classes to deal with .MAP files at the MapInfo object level
=====================================================================*/
/*---------------------------------------------------------------------
* class TABIDFile
*
* Class to handle Read/Write operation on .ID files... the .ID file
* contains an index to the objects in the .MAP file by object id.
*--------------------------------------------------------------------*/
class TABIDFile
{
private:
char *m_pszFname;
FILE *m_fp;
TABAccess m_eAccessMode;
TABRawBinBlock *m_poIDBlock;
int m_nBlockSize;
GInt32 m_nMaxId;
public:
TABIDFile();
~TABIDFile();
int Open(const char *pszFname, const char *pszAccess);
int Close();
GInt32 GetObjPtr(GInt32 nObjId);
int SetObjPtr(GInt32 nObjId, GInt32 nObjPtr);
GInt32 GetMaxObjId();
#ifdef DEBUG
void Dump(FILE *fpOut = NULL);
#endif
};
/*---------------------------------------------------------------------
* class TABMAPFile
*
* Class to handle Read/Write operation on .MAP files... this class hides
* all the dealings with blocks, indexes, etc.
* Use this class to deal with MapInfo objects directly.
*--------------------------------------------------------------------*/
class TABMAPFile
{
private:
int m_nMinTABVersion;
char *m_pszFname;
FILE *m_fp;
TABAccess m_eAccessMode;
TABBinBlockManager m_oBlockManager;
TABMAPHeaderBlock *m_poHeader;
// Members used to access objects using the spatial index
TABMAPIndexBlock *m_poSpIndex;
// Defaults to FALSE, i.e. optimized spatial index
GBool m_bQuickSpatialIndexMode;
// Member used to access objects using the object ids (.ID file)
TABIDFile *m_poIdIndex;
// Current object data block.
TABMAPObjectBlock *m_poCurObjBlock;
int m_nCurObjPtr;
int m_nCurObjType;
int m_nCurObjId;
TABMAPCoordBlock *m_poCurCoordBlock;
// Drawing Tool Def. table (takes care of all drawing tools in memory)
TABToolDefTable *m_poToolDefTable;
// Coordinates filter... default is MBR of the whole file
TABVertex m_sMinFilter;
TABVertex m_sMaxFilter;
GInt32 m_XMinFilter;
GInt32 m_YMinFilter;
GInt32 m_XMaxFilter;
GInt32 m_YMaxFilter;
int CommitObjAndCoordBlocks(GBool bDeleteObjects =FALSE);
int LoadObjAndCoordBlocks(GInt32 nBlockPtr);
TABMAPObjectBlock *SplitObjBlock(TABMAPObjHdr *poObjHdrToAdd,
int nSizeOfObjToAdd);
int MoveObjToBlock(TABMAPObjHdr *poObjHdr,
TABMAPCoordBlock *poSrcCoordBlock,
TABMAPObjectBlock *poDstObjBlock,
TABMAPCoordBlock **ppoDstCoordBlock);
int PrepareCoordBlock(int nObjType,
TABMAPObjectBlock *poObjBlock,
TABMAPCoordBlock **ppoCoordBlock);
int InitDrawingTools();
int CommitDrawingTools();
int CommitSpatialIndex();
// Stuff related to traversing spatial index.
TABMAPIndexBlock *m_poSpIndexLeaf;
int LoadNextMatchingObjectBlock(int bFirstObject);
TABRawBinBlock *PushBlock( int nFileOffset );
public:
TABMAPFile();
~TABMAPFile();
int Open(const char *pszFname, const char *pszAccess,
GBool bNoErrorMsg = FALSE );
int Close();
int SetQuickSpatialIndexMode(GBool bQuickSpatialIndexMode = TRUE);
int Int2Coordsys(GInt32 nX, GInt32 nY, double &dX, double &dY);
int Coordsys2Int(double dX, double dY, GInt32 &nX, GInt32 &nY,
GBool bIgnoreOveflow=FALSE);
int Int2CoordsysDist(GInt32 nX, GInt32 nY, double &dX, double &dY);
int Coordsys2IntDist(double dX, double dY, GInt32 &nX, GInt32 &nY);
void SetCoordFilter(TABVertex sMin, TABVertex sMax);
void GetCoordFilter(TABVertex &sMin, TABVertex &sMax);
void ResetCoordFilter();
int SetCoordsysBounds(double dXMin, double dYMin,
double dXMax, double dYMax);
GInt32 GetMaxObjId();
int MoveToObjId(int nObjId);
void UpdateMapHeaderInfo(GByte nObjType);
int PrepareNewObj(TABMAPObjHdr *poObjHdr);
int PrepareNewObjViaSpatialIndex(TABMAPObjHdr *poObjHdr);
int PrepareNewObjViaObjBlock(TABMAPObjHdr *poObjHdr);
int CommitNewObj(TABMAPObjHdr *poObjHdr);
void ResetReading();
int GetNextFeatureId( int nPrevId );
int GetCurObjType();
int GetCurObjId();
TABMAPObjectBlock *GetCurObjBlock();
TABMAPCoordBlock *GetCurCoordBlock();
TABMAPCoordBlock *GetCoordBlock(int nFileOffset);
TABMAPHeaderBlock *GetHeaderBlock();
TABIDFile *GetIDFileRef();
TABRawBinBlock *GetIndexObjectBlock(int nFileOffset);
int ReadPenDef(int nPenIndex, TABPenDef *psDef);
int ReadBrushDef(int nBrushIndex, TABBrushDef *psDef);
int ReadFontDef(int nFontIndex, TABFontDef *psDef);
int ReadSymbolDef(int nSymbolIndex, TABSymbolDef *psDef);
int WritePenDef(TABPenDef *psDef);
int WriteBrushDef(TABBrushDef *psDef);
int WriteFontDef(TABFontDef *psDef);
int WriteSymbolDef(TABSymbolDef *psDef);
int GetMinTABFileVersion();
#ifdef DEBUG
void Dump(FILE *fpOut = NULL);
void DumpSpatialIndexToMIF(TABMAPIndexBlock *poNode,
FILE *fpMIF, FILE *fpMID,
int nIndexInNode=-1,
int nParentId=-1,
int nCurDepth=0,
int nMaxDepth=-1);
#endif
};
/*---------------------------------------------------------------------
* class TABINDNode
*
* An index node in a .IND file.
*
* This class takes care of reading child nodes as necessary when looking
* for a given key value in the index tree.
*--------------------------------------------------------------------*/
class TABINDNode
{
private:
FILE *m_fp;
TABAccess m_eAccessMode;
TABINDNode *m_poCurChildNode;
TABINDNode *m_poParentNodeRef;
TABBinBlockManager *m_poBlockManagerRef;
int m_nSubTreeDepth;
int m_nKeyLength;
TABFieldType m_eFieldType;
GBool m_bUnique;
GInt32 m_nCurDataBlockPtr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -