📄 ogrfeature.cpp
字号:
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:
if( poGeometry )
return poGeometry->getGeometryName();
else
return "";
case SPF_OGR_STYLE:
if( GetStyleString() == NULL )
return "";
else
return GetStyleString();
case SPF_OGR_GEOM_WKT:
{
if( poGeometry == NULL )
return "";
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];
if( strlen(szTempBuffer) + strlen(pszItem) + 6
> sizeof(szTempBuffer) )
{
break;
}
if( i > 0 )
strcat( szTempBuffer, "," );
strcat( szTempBuffer, pszItem );
}
if( i < nCount )
strcat( szTempBuffer, ",...)" );
else
strcat( szTempBuffer, ")" );
return m_pszTmpFieldValue = CPLStrdup( szTempBuffer );
}
else if( poFDefn->GetType() == OFTBinary )
{
int nCount = pauFields[iField].Binary.nCount;
char *pszHex;
if( nCount > (int) sizeof(szTempBuffer) / 2 - 4 )
nCount = sizeof(szTempBuffer) / 2 - 4;
pszHex = CPLBinaryToHex( nCount, pauFields[iField].Binary.paData );
memcpy( szTempBuffer, pszHex, 2 * nCount );
szTempBuffer[nCount*2] = '\0';
if( nCount < pauFields[iField].Binary.nCount )
strcat( szTempBuffer, "..." );
CPLFree( pszHex );
return m_pszTmpFieldValue = CPLStrdup( szTempBuffer );
}
else
return "";
#undef TEMP_BUFFER_SIZE
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -