📄 tabfile.cpp
字号:
// tabfile.cpp: implementation of the TABFile class.////////////////////////////////////////////////////////////////////////#include "tabfile.h"#include "ugk_errhandle.h"#include "ugk_memopr.h"#include "ugk_string.h"#include "tabpoint.h"#include "tabfontpoint.h"#include "tabcustompoint.h"#include "tabpolyline.h"#include "tabarc.h"#include "tabregion.h"#include "tabrectangle.h"#include "tabellipse.h"#include "tabtext.h"#include "tabmultipoint.h"/********************************************************************** * TABFile::TABFile() * * Constructor. **********************************************************************/TABFile::TABFile(){ m_eAccessMode = TABRead; m_pszFname = NULL; m_papszTABFile = NULL; m_nVersion = 300; m_pszCharset = NULL; m_eTableType = TABTableNative; m_poMAPFile = NULL; m_poDATFile = NULL; m_poINDFile = NULL; m_poDefn = NULL; m_poCurFeature = NULL; m_nCurFeatureId = 0; m_nLastFeatureId = 0; m_panIndexNo = NULL; bUseSpatialTraversal = FALSE;}/********************************************************************** * TABFile::~TABFile() * * Destructor. **********************************************************************/TABFile::~TABFile(){ Close();}/************************************************************************//* GetFeatureCount() *//************************************************************************/int TABFile::GetFeatureCount (int bForce){ if( m_poFilterGeom != NULL) return UGKLayer::GetFeatureCount( bForce ); else return m_nLastFeatureId;}/************************************************************************//* ResetReading() *//************************************************************************/void TABFile::ResetReading(){ m_nCurFeatureId = 0; if( m_poMAPFile != NULL ) m_poMAPFile->ResetReading();/* -------------------------------------------------------------------- *//* Decide whether to operate in spatial traversal mode or not, *//* and ensure the current spatial filter is applied to the map *//* file object. *//* -------------------------------------------------------------------- */ if( m_poMAPFile ) { bUseSpatialTraversal = FALSE; m_poMAPFile->ResetCoordFilter(); if( m_poFilterGeom != NULL ) { UGKEnvelope sEnvelope; TABVertex sMin, sMax; TABMAPHeaderBlock *poHeader; poHeader = m_poMAPFile->GetHeaderBlock(); m_poFilterGeom->getEnvelope( &sEnvelope ); m_poMAPFile->GetCoordFilter( sMin, sMax ); if( sEnvelope.MinX > sMin.x || sEnvelope.MinY > sMin.y || sEnvelope.MaxX < sMax.x || sEnvelope.MaxY < sMax.y ) { bUseSpatialTraversal = TRUE; sMin.x = sEnvelope.MinX; sMin.y = sEnvelope.MinY; sMax.x = sEnvelope.MaxX; sMax.y = sEnvelope.MaxY; m_poMAPFile->SetCoordFilter( sMin, sMax ); } } }}/********************************************************************** * TABFile::Open() * * Open a .TAB dataset and the associated files, and initialize the * structures to be ready to read features from (or write to) it. * * Supported access modes are "r" (read-only) and "w" (create new dataset). * * Set bTestOpenNoError=TRUE to silently return -1 with no error message * if the file cannot be opened. This is intended to be used in the * context of a TestOpen() function. The default value is FALSE which * means that an error is reported if the file cannot be opened. * * Note that dataset extents will have to be set using SetBounds() before * any feature can be written to a newly created dataset. * * In read mode, a valid dataset must have at least a .TAB and a .DAT file. * The .MAP and .ID files are optional and if they do not exist then * all features will be returned with NONE geometry. * * Returns 0 on success, -1 on error. **********************************************************************/int TABFile::Open(const char *pszFname, const char *pszAccess, UGKBool bTestOpenNoError /*=FALSE*/ ){ char *pszTmpFname = NULL; int nFnameLen = 0; UGKErrorReset(); if (m_poMAPFile) { UGKError(ET_Failure, UGKErr_AssertionFailed, "Open() failed: object already contains an open file"); return -1; } /*----------------------------------------------------------------- * Validate access mode *----------------------------------------------------------------*/ if (EQUALN(pszAccess, "r", 1)) { m_eAccessMode = TABRead; pszAccess = "rb"; } else if (EQUALN(pszAccess, "w", 1)) { m_eAccessMode = TABWrite; pszAccess = "wb"; } else { if (!bTestOpenNoError) UGKError(ET_Failure, UGKErr_FileIO, "Open() failed: access mode \"%s\" not supported", pszAccess); else UGKErrorReset(); return -1; } /*----------------------------------------------------------------- * Make sure filename has a .TAB extension... *----------------------------------------------------------------*/ m_pszFname = UGKStrdup(pszFname);//复制字符串,返回指向新字符串的指针 nFnameLen = strlen(m_pszFname); if (nFnameLen > 4 && (strcmp(m_pszFname+nFnameLen-4, ".TAB")==0 || strcmp(m_pszFname+nFnameLen-4, ".MAP")==0 || strcmp(m_pszFname+nFnameLen-4, ".DAT")==0 ) ) strcpy(m_pszFname+nFnameLen-4, ".TAB");//将扩展名改为.TAB else if (nFnameLen > 4 && (EQUAL(m_pszFname+nFnameLen-4, ".tab") || EQUAL(m_pszFname+nFnameLen-4, ".map") || EQUAL(m_pszFname+nFnameLen-4, ".dat") ) ) strcpy(m_pszFname+nFnameLen-4, ".tab"); //将扩展名改为.tab else { if (!bTestOpenNoError) UGKError(ET_Failure, UGKErr_FileIO, "Open() failed for %s: invalid filename extension", m_pszFname); else UGKErrorReset(); UGK_Free(m_pszFname); return -1; } pszTmpFname = UGKStrdup(m_pszFname);//复制字符串,返回指向新字符串的指针#ifndef WIN32APP /*----------------------------------------------------------------- * On Unix, make sure extension uses the right cases * We do it even for write access because if a file with the same * extension already exists we want to overwrite it. *----------------------------------------------------------------*/ TABAdjustFilenameExtension(m_pszFname);#endif /*----------------------------------------------------------------- * Handle .TAB file... depends on access mode. *----------------------------------------------------------------*/ if (m_eAccessMode == TABRead) { /*------------------------------------------------------------- * Open .TAB file... since it's a small text file, we will just load * it as a stringlist in memory. *------------------------------------------------------------*/ // 读TAB文件 $zgq m_papszTABFile = LoadFileToList(m_pszFname); if (m_papszTABFile == NULL) { if (!bTestOpenNoError) { UGKError(ET_Failure, UGKErr_FileIO, "Failed opening %s.", m_pszFname); } UGK_Free(m_pszFname); m_pszFname = NULL; FreeStrList(m_papszTABFile); m_papszTABFile = NULL; UGK_Free( pszTmpFname ); return -1; } /*------------------------------------------------------------- * Do a first pass on the TAB header to establish the type of * dataset we have (NATIVE, DBF, etc.)... and also to know if * it is a supported type. *------------------------------------------------------------*/ if ( ParseTABFileFirstPass(bTestOpenNoError) != 0 )//$zgq { // No need to produce an error... it's already been done if // necessary... just cleanup and exit. UGK_Free(m_pszFname); m_pszFname = NULL; FreeStrList(m_papszTABFile); m_papszTABFile = NULL; UGK_Free( pszTmpFname ); return -1; } } else { /*------------------------------------------------------------- * In Write access mode, the .TAB file will be written during the * Close() call... we will just set some defaults here. *------------------------------------------------------------*/ m_nVersion = 300; m_pszCharset = UGKStrdup("Neutral"); m_eTableType = TABTableNative; /*------------------------------------------------------------- * Do initial setup of feature definition. *------------------------------------------------------------*/ char *pszFeatureClassName = TABGetBasename(m_pszFname); m_poDefn = new UGKFeatureDefn(pszFeatureClassName); m_poDefn->Reference(); UGK_Free(pszFeatureClassName); } /*----------------------------------------------------------------- * Open .DAT file (or .DBF) *----------------------------------------------------------------*/ if (nFnameLen > 4 && strcmp(pszTmpFname+nFnameLen-4, ".TAB")==0) { if (m_eTableType == TABTableDBF) strcpy(pszTmpFname+nFnameLen-4, ".DBF"); else // Default is NATIVE strcpy(pszTmpFname+nFnameLen-4, ".DAT"); } else { if (m_eTableType == TABTableDBF) strcpy(pszTmpFname+nFnameLen-4, ".dbf"); else // Default is NATIVE strcpy(pszTmpFname+nFnameLen-4, ".dat"); }#ifndef WIN32APP TABAdjustFilenameExtension(pszTmpFname);#endif m_poDATFile = new TABDATFile; if ( m_poDATFile->Open(pszTmpFname, pszAccess, m_eTableType) != 0) { // Open Failed... an error has already been reported, just return. UGK_Free(pszTmpFname); Close(); if (bTestOpenNoError) UGKErrorReset(); return -1; } m_nLastFeatureId = m_poDATFile->GetNumRecords(); /*----------------------------------------------------------------- * Parse .TAB file field defs and build FeatureDefn (only in read access) *----------------------------------------------------------------*/ if (m_eAccessMode == TABRead && ParseTABFileFields() != 0)//$zgq { // Failed... an error has already been reported, just return. UGK_Free(pszTmpFname); Close(); if (bTestOpenNoError) UGKErrorReset(); return -1; } /*----------------------------------------------------------------- * Open .MAP (and .ID) file * Note that the .MAP and .ID files are optional. Failure to open them * is not an error... it simply means that all features will be returned * with NONE geometry. *----------------------------------------------------------------*/ if (nFnameLen > 4 && strcmp(pszTmpFname+nFnameLen-4, ".DAT")==0) strcpy(pszTmpFname+nFnameLen-4, ".MAP"); else strcpy(pszTmpFname+nFnameLen-4, ".map");#ifndef WIN32APP TABAdjustFilenameExtension(pszTmpFname);#endif m_poMAPFile = new TABMAPFile; if (m_eAccessMode == TABRead)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -