📄 ogrfeature.cpp
字号:
/************************************************************************//* 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 + -