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

📄 ogrfeature.cpp

📁 用于读取TAB、MIF、SHP文件的类
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/************************************************************************//*                        OGR_F_GetRawFieldRef()                        *//************************************************************************//** * Fetch an handle to the internal field value given the index.   * * This function is the same as the C++ method OGRFeature::GetRawFieldRef(). * * @param hFeat handle to the feature on which field is found. * @param iField the field to fetch, from 0 to GetFieldCount()-1. * * @return the returned handle is to an internal data structure, and should * not be freed, or modified.  */OGRField *OGR_F_GetRawFieldRef( OGRFeatureH hFeat, int iField ){    return ((OGRFeature *)hFeat)->GetRawFieldRef( iField );}/************************************************************************//*                         GetFieldAsInteger()                          *//************************************************************************//** * Fetch field value as integer. * * OFTString features will be translated using atoi().  OFTReal fields * will be cast to integer.   Other field types, or errors will result in * a return value of zero. * * This method is the same as the C function OGR_F_GetFieldAsInteger(). * * @param iField the field to fetch, from 0 to GetFieldCount()-1. * * @return the field value. */int OGRFeature::GetFieldAsInteger( int iField ){    int iSpecialField = iField - poDefn->GetFieldCount();    if (iSpecialField >= 0)    {    // special field value accessors        switch (iSpecialField)        {        case SPF_FID:            return GetFID();        default:            return 0;        }    }        OGRFieldDefn        *poFDefn = poDefn->GetFieldDefn( iField );        CPLAssert( poFDefn != NULL || iField == -1 );    if( poFDefn == NULL )        return 0;        if( !IsFieldSet(iField) )        return 0;        if( poFDefn->GetType() == OFTInteger )        return pauFields[iField].Integer;    else if( poFDefn->GetType() == OFTReal )        return (int) pauFields[iField].Real;    else if( poFDefn->GetType() == OFTString )    {        if( pauFields[iField].String == NULL )            return 0;        else            return atoi(pauFields[iField].String);    }    else        return 0;}/************************************************************************//*                      OGR_F_GetFieldAsInteger()                       *//************************************************************************//** * Fetch field value as integer. * * OFTString features will be translated using atoi().  OFTReal fields * will be cast to integer.   Other field types, or errors will result in * a return value of zero. * * This function is the same as the C++ method OGRFeature::GetFieldAsInteger(). * * @param hFeat handle to the feature that owned the field. * @param iField the field to fetch, from 0 to GetFieldCount()-1. * * @return the field value. */int OGR_F_GetFieldAsInteger( OGRFeatureH hFeat, int iField ){    return ((OGRFeature *)hFeat)->GetFieldAsInteger(iField);}/************************************************************************//*                          GetFieldAsDouble()                          *//************************************************************************//** * Fetch field value as a double. * * OFTString features will be translated using atof().  OFTInteger fields * will be cast to double.   Other field types, or errors will result in * a return value of zero. * * This method is the same as the C function OGR_F_GetFieldAsDouble(). * * @param iField the field to fetch, from 0 to GetFieldCount()-1. * * @return the field value. */double OGRFeature::GetFieldAsDouble( int iField ){    int iSpecialField = iField - poDefn->GetFieldCount();    if (iSpecialField >= 0)    {    // special field value accessors        switch (iSpecialField)        {        case SPF_FID:            return GetFID();        default:            return 0.0;        }    }        OGRFieldDefn        *poFDefn = poDefn->GetFieldDefn( iField );        CPLAssert( poFDefn != NULL || iField == -1 );    if( poFDefn == NULL )        return 0.0;    if( !IsFieldSet(iField) )        return 0.0;        if( poFDefn->GetType() == OFTReal )        return pauFields[iField].Real;    else if( poFDefn->GetType() == OFTInteger )        return pauFields[iField].Integer;    else if( poFDefn->GetType() == OFTString )    {        if( pauFields[iField].String == NULL )            return 0;        else            return atof(pauFields[iField].String);    }    else        return 0.0;}/************************************************************************//*                       OGR_F_GetFieldAsDouble()                       *//************************************************************************//** * Fetch field value as a double. * * OFTString features will be translated using atof().  OFTInteger fields * will be cast to double.   Other field types, or errors will result in * a return value of zero. * * This function is the same as the C++ method OGRFeature::GetFieldAsDouble(). * * @param hFeat handle to the feature that owned the field. * @param iField the field to fetch, from 0 to GetFieldCount()-1. * * @return the field value. */double OGR_F_GetFieldAsDouble( OGRFeatureH hFeat, int iField ){    return ((OGRFeature *)hFeat)->GetFieldAsDouble(iField);}/************************************************************************//*                          GetFieldAsString()                          *//************************************************************************//** * Fetch field value as a string. * * OFTReal and OFTInteger fields will be translated to string using * sprintf(), but not necessarily using the established formatting rules. * Other field types, or errors will result in a return value of zero. * * This method is the same as the C function OGR_F_GetFieldAsString(). * * @param iField the field to fetch, from 0 to GetFieldCount()-1. * * @return the field value.  This string is internal, and should not be * modified, or freed.  It's lifetime may be very brief.  */const char *OGRFeature::GetFieldAsString( int iField ){#define TEMP_BUFFER_SIZE 80    char         szTempBuffer[TEMP_BUFFER_SIZE];    CPLFree(m_pszTmpFieldValue);    m_pszTmpFieldValue = NULL;                int iSpecialField = iField - poDefn->GetFieldCount();    if (iSpecialField >= 0)    {    // special field value accessors        switch (iSpecialField)        {        case SPF_FID:            snprintf( szTempBuffer, TEMP_BUFFER_SIZE, "%ld", GetFID() );            return m_pszTmpFieldValue = CPLStrdup( szTempBuffer );        case SPF_OGR_GEOMETRY:            return poGeometry->getGeometryName();        case SPF_OGR_STYLE:            return GetStyleString();        case SPF_OGR_GEOM_WKT:            {                if (poGeometry->exportToWkt( &m_pszTmpFieldValue ) == OGRERR_NONE )                    return m_pszTmpFieldValue;                else                    return "";            }        default:            return "";        }    }        OGRFieldDefn        *poFDefn = poDefn->GetFieldDefn( iField );        CPLAssert( poFDefn != NULL || iField == -1 );    if( poFDefn == NULL )        return "";        if( !IsFieldSet(iField) )        return "";        if( poFDefn->GetType() == OFTString )    {        if( pauFields[iField].String == NULL )            return "";        else            return pauFields[iField].String;    }    else if( poFDefn->GetType() == OFTInteger )    {        snprintf( szTempBuffer, TEMP_BUFFER_SIZE,                  "%d", pauFields[iField].Integer );        return m_pszTmpFieldValue = CPLStrdup( szTempBuffer );    }    else if( poFDefn->GetType() == OFTReal )    {        char    szFormat[64];        if( poFDefn->GetWidth() != 0 )        {            snprintf( szFormat, TEMP_BUFFER_SIZE, "%%%d.%df",                     poFDefn->GetWidth(), poFDefn->GetPrecision() );        }        else            strcpy( szFormat, "%.15g" );                snprintf( szTempBuffer, TEMP_BUFFER_SIZE,                  szFormat, pauFields[iField].Real );                return m_pszTmpFieldValue = CPLStrdup( szTempBuffer );    }    else if( poFDefn->GetType() == OFTDateTime )    {        snprintf( szTempBuffer, TEMP_BUFFER_SIZE,                  "%04d/%02d/%02d %2d:%02d:%02d",                   pauFields[iField].Date.Year,                  pauFields[iField].Date.Month,                  pauFields[iField].Date.Day,                  pauFields[iField].Date.Hour,                  pauFields[iField].Date.Minute,                  pauFields[iField].Date.Second );                if( pauFields[iField].Date.TZFlag > 1 )        {            int nOffset = (pauFields[iField].Date.TZFlag - 100) * 15;            int nHours = (int) (nOffset / 60);  // round towards zero            int nMinutes = ABS(nOffset - nHours * 60);            if( nOffset < 0 )            {                strcat( szTempBuffer, "-" );                nHours = ABS(nHours);            }            else                strcat( szTempBuffer, "+" );            if( nMinutes == 0 )                snprintf( szTempBuffer+strlen(szTempBuffer),                          TEMP_BUFFER_SIZE, "%02d", nHours );            else                snprintf( szTempBuffer+strlen(szTempBuffer),                          TEMP_BUFFER_SIZE, "%02d%02d", nHours, nMinutes );        }        return m_pszTmpFieldValue = CPLStrdup( szTempBuffer );    }    else if( poFDefn->GetType() == OFTDate )    {        snprintf( szTempBuffer, TEMP_BUFFER_SIZE, "%04d/%02d/%02d",                 pauFields[iField].Date.Year,                 pauFields[iField].Date.Month,                 pauFields[iField].Date.Day );        return m_pszTmpFieldValue = CPLStrdup( szTempBuffer );    }    else if( poFDefn->GetType() == OFTTime )    {        snprintf( szTempBuffer, TEMP_BUFFER_SIZE, "%2d:%02d:%02d",                  pauFields[iField].Date.Hour,                 pauFields[iField].Date.Minute,                 pauFields[iField].Date.Second );                return m_pszTmpFieldValue = CPLStrdup( szTempBuffer );    }    else if( poFDefn->GetType() == OFTIntegerList )    {        char    szItem[32];        int     i, nCount = pauFields[iField].IntegerList.nCount;        snprintf( szTempBuffer, TEMP_BUFFER_SIZE, "(%d:", nCount );        for( i = 0; i < nCount; i++ )        {            snprintf( szItem, TEMP_BUFFER_SIZE, "%d",                      pauFields[iField].IntegerList.paList[i] );            if( strlen(szTempBuffer) + strlen(szItem) + 6                > sizeof(szTempBuffer) )            {                break;            }                        if( i > 0 )                strcat( szTempBuffer, "," );                        strcat( szTempBuffer, szItem );        }        if( i < nCount )            strcat( szTempBuffer, ",...)" );        else            strcat( szTempBuffer, ")" );                return m_pszTmpFieldValue = CPLStrdup( szTempBuffer );    }    else if( poFDefn->GetType() == OFTRealList )    {        char    szItem[40];        char    szFormat[64];        int     i, nCount = pauFields[iField].RealList.nCount;        if( poFDefn->GetWidth() != 0 )        {            snprintf( szFormat, TEMP_BUFFER_SIZE, "%%%d.%df",                      poFDefn->GetWidth(), poFDefn->GetPrecision() );        }        else            strcpy( szFormat, "%.16g" );                snprintf( szTempBuffer, TEMP_BUFFER_SIZE, "(%d:", nCount );        for( i = 0; i < nCount; i++ )        {            snprintf( szItem, TEMP_BUFFER_SIZE, szFormat,                      pauFields[iField].RealList.paList[i] );            if( strlen(szTempBuffer) + strlen(szItem) + 6                > sizeof(szTempBuffer) )            {                break;            }                        if( i > 0 )                strcat( szTempBuffer, "," );                        strcat( szTempBuffer, szItem );        }        if( i < nCount )            strcat( szTempBuffer, ",...)" );        else            strcat( szTempBuffer, ")" );                return m_pszTmpFieldValue = CPLStrdup( szTempBuffer );    }    else if( poFDefn->GetType() == OFTStringList )    {        int     i, nCount = pauFields[iField].StringList.nCount;        snprintf( szTempBuffer, TEMP_BUFFER_SIZE, "(%d:", nCount );        for( i = 0; i < nCount; i++ )        {            const char  *pszItem = pauFields[iField].StringList.paList[i];            

⌨️ 快捷键说明

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