⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tabfile.cpp

📁 linux下一款GIS程序源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// 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 + -