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

📄 ogrreclayer.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
字号:
/****************************************************************************** * $Id: ogrreclayer.cpp,v 1.6 2005/02/02 20:54:27 fwarmerdam Exp $ * * Project:  EPIInfo .REC Reader * Purpose:  Implements OGRRECLayer class. * Author:   Frank Warmerdam <warmerdam@pobox.com> * ****************************************************************************** * Copyright (c) 2003, Frank Warmerdam <warmerdam@pobox.com> * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: ogrreclayer.cpp,v $ * Revision 1.6  2005/02/02 20:54:27  fwarmerdam * track m_nFeaturesRead * * Revision 1.5  2003/07/11 13:28:20  warmerda * use external RECGetField * * Revision 1.4  2003/02/17 15:19:04  warmerda * Fixed support for deleted records. * * Revision 1.3  2003/02/04 21:40:38  warmerda * Fixed handling of Cntl-Z. * * Revision 1.2  2003/02/04 20:42:45  warmerda * skip zero length fields, improve type handling * * Revision 1.1  2003/02/03 21:11:35  warmerda * New * */#include "ogr_rec.h"#include "cpl_conv.h"#include "cpl_string.h"CPL_CVSID("$Id: ogrreclayer.cpp,v 1.6 2005/02/02 20:54:27 fwarmerdam Exp $");/************************************************************************//*                            OGRRECLayer()                             *//*                                                                      *//*      Note that the OGRRECLayer assumes ownership of the passed       *//*      file pointer.                                                   *//************************************************************************/OGRRECLayer::OGRRECLayer( const char *pszLayerNameIn,                           FILE * fp, int nFieldCountIn ){    fpREC = fp;    bIsValid = FALSE;    nStartOfData = 0;    nNextFID = 1;    poFeatureDefn = new OGRFeatureDefn( pszLayerNameIn );    nFieldCount = 0;    panFieldOffset = (int *) CPLCalloc(sizeof(int),nFieldCountIn);    panFieldWidth = (int *) CPLCalloc(sizeof(int),nFieldCountIn);/* -------------------------------------------------------------------- *//*      Read field definition lines.                                    *//* -------------------------------------------------------------------- */    int         iField;    for( nFieldCount=0, iField = 0; iField < nFieldCountIn; iField++ )    {        const char *pszLine = CPLReadLine( fp );        int         nTypeCode;        OGRFieldType eFType = OFTString;        if( pszLine == NULL )            return;        if( strlen(pszLine) < 44 )            return;        // Extract field width.         panFieldWidth[nFieldCount] = atoi( RECGetField( pszLine, 37, 4 ) );        // Is this an real, integer or string field?  Default to string.        nTypeCode = atoi(RECGetField(pszLine,33,4));        if( nTypeCode == 12 )            eFType = OFTInteger;        else if( nTypeCode > 100 && nTypeCode < 120 )        {            eFType = OFTReal;        }        else if( nTypeCode == 0 || nTypeCode == 6 || nTypeCode == 102 )        {            if( panFieldWidth[nFieldCount] < 3 )                eFType = OFTInteger;            else                eFType = OFTReal;        }        else            eFType = OFTString;        OGRFieldDefn oField( RECGetField( pszLine, 2, 10 ), eFType );        // Establish field offset.         if( nFieldCount > 0 )            panFieldOffset[nFieldCount]                = panFieldOffset[nFieldCount-1] + panFieldWidth[nFieldCount-1];        if( nTypeCode > 100 && nTypeCode < 120 )        {            oField.SetWidth( panFieldWidth[nFieldCount] );            oField.SetPrecision( nTypeCode - 100 );        }        else if( eFType == OFTReal )        {            oField.SetWidth( panFieldWidth[nFieldCount]*2 );            oField.SetPrecision( panFieldWidth[nFieldCount]-1 );        }        else            oField.SetWidth( panFieldWidth[nFieldCount] );        // Skip fields that are only screen labels.        if( panFieldWidth[nFieldCount] == 0 )            continue;        poFeatureDefn->AddFieldDefn( &oField );        nFieldCount++;    }    nRecordLength = panFieldOffset[nFieldCount-1]+panFieldWidth[nFieldCount-1];    bIsValid = TRUE;    nStartOfData = VSIFTell( fp );}/************************************************************************//*                           ~OGRRECLayer()                           *//************************************************************************/OGRRECLayer::~OGRRECLayer(){    if( m_nFeaturesRead > 0 && poFeatureDefn != NULL )    {        CPLDebug( "REC", "%d features read on layer '%s'.",                  (int) m_nFeaturesRead,                   poFeatureDefn->GetName() );    }    delete poFeatureDefn;    CPLFree( panFieldOffset );    CPLFree( panFieldWidth );}/************************************************************************//*                            ResetReading()                            *//************************************************************************/void OGRRECLayer::ResetReading(){    VSIFSeek( fpREC, nStartOfData, SEEK_SET );    nNextFID = 1;}/************************************************************************//*                      GetNextUnfilteredFeature()                      *//************************************************************************/OGRFeature * OGRRECLayer::GetNextUnfilteredFeature(){/* -------------------------------------------------------------------- *//*      Read and assemble the source data record.                       *//* -------------------------------------------------------------------- */    int        nDataLen = 0;    char       *pszRecord = (char *) CPLMalloc(nRecordLength + 2 );    while( nDataLen < nRecordLength )    {        const char *pszLine = CPLReadLine( fpREC );        int         iSegLen;        if( pszLine == NULL )        {            CPLFree( pszRecord );            return NULL;        }        if( *pszLine == 26 /* Cntl-Z - DOS EOF */ )        {            CPLFree( pszRecord );            return NULL;        }        // If the end-of-line markers is '?' the record is deleted.        iSegLen = strlen(pszLine);        if( pszLine[iSegLen-1] == '?' )        {            pszRecord[0] = '\0';            nDataLen = 0;            continue;        }        // Strip off end-of-line '!' marker.         if( pszLine[iSegLen-1] != '!'             && pszLine[iSegLen-1] != '^' )        {            CPLError( CE_Failure, CPLE_AppDefined,                       "Apparent corrupt data line .. record FID=%d",                       nNextFID );            CPLFree( pszRecord );            return NULL;        }        iSegLen--;        if( nDataLen + iSegLen > nRecordLength )        {            CPLError( CE_Failure, CPLE_AppDefined,                       "Too much data for record %d.",                       nNextFID );            CPLFree( pszRecord );            return NULL;        }        strncpy( pszRecord+nDataLen, pszLine, iSegLen );        pszRecord[nDataLen+iSegLen] = '\0';        nDataLen += iSegLen;    }/* -------------------------------------------------------------------- *//*      Create the OGR feature.                                         *//* -------------------------------------------------------------------- */    OGRFeature *poFeature;    poFeature = new OGRFeature( poFeatureDefn );/* -------------------------------------------------------------------- *//*      Set attributes for any indicated attribute records.             *//* -------------------------------------------------------------------- */    int         iAttr;        for( iAttr = 0; iAttr < nFieldCount; iAttr++)    {        const char *pszFieldText =             RECGetField( pszRecord,                          panFieldOffset[iAttr] + 1,                         panFieldWidth[iAttr] );        if( strlen(pszFieldText) != 0 )            poFeature->SetField( iAttr, pszFieldText );    }    /* -------------------------------------------------------------------- *//*      Translate the record id.                                        *//* -------------------------------------------------------------------- */    poFeature->SetFID( nNextFID++ );    m_nFeaturesRead++;    return poFeature;}/************************************************************************//*                           GetNextFeature()                           *//************************************************************************/OGRFeature *OGRRECLayer::GetNextFeature(){    OGRFeature  *poFeature = NULL;    /* -------------------------------------------------------------------- *//*      Read features till we find one that satisfies our current       *//*      spatial criteria.                                               *//* -------------------------------------------------------------------- */    while( TRUE )    {        poFeature = GetNextUnfilteredFeature();        if( poFeature == NULL )            break;        if( m_poAttrQuery == NULL || m_poAttrQuery->Evaluate( poFeature ) )            break;        delete poFeature;    }    return poFeature;}/************************************************************************//*                           TestCapability()                           *//************************************************************************/int OGRRECLayer::TestCapability( const char * pszCap ){    return FALSE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -