?? ogrogdilayer.cpp
字號:
int nNameLen; char chSavedChar; /* parse out the next attribute value */ if( !ecs_FindElement( pszAttrList, &pszFieldStart, &pszAttrList, &nNameLen, NULL ) ) { nNameLen = 0; pszFieldStart = pszAttrList; } /* Skip any trailing white space (for string constants). */ if( nNameLen > 0 && pszFieldStart[nNameLen-1] == ' ' ) nNameLen--; /* skip leading white space */ while( pszFieldStart[0] == ' ' && nNameLen > 0 ) { pszFieldStart++; nNameLen--; } /* zero terminate the single field value, but save the */ /* character we overwrote, so we can restore it when done. */ chSavedChar = pszFieldStart[nNameLen]; pszFieldStart[nNameLen] = '\0'; /* OGR takes care of all field type conversions for us! */ poFeature->SetField(iField, pszFieldStart); pszFieldStart[nNameLen] = chSavedChar; }/* -------------------------------------------------------------------- *//* Apply the text associated with text features if appropriate. *//* -------------------------------------------------------------------- */ if( m_eFamily == Text ) { poFeature->SetField( "text", ECSGEOM(psResult).text.desc ); }/* -------------------------------------------------------------------- *//* Do we need to apply an attribute test? *//* -------------------------------------------------------------------- */ if( (m_poAttrQuery != NULL && !m_poAttrQuery->Evaluate( poFeature ) ) || (m_poFilterGeom != NULL && !FilterGeometry( poFeature->GetGeometryRef() ) ) ) { delete poFeature; goto TryAgain; } return poFeature;}/************************************************************************//* GetFeature() *//************************************************************************/OGRFeature *OGROGDILayer::GetFeature( long nFeatureId ){ ecs_Result *psResult; if (m_nTotalShapeCount != -1 && nFeatureId > m_nTotalShapeCount) return NULL; if (m_iNextShapeId > nFeatureId ) ResetReading(); while(m_iNextShapeId != nFeatureId) { psResult = cln_GetNextObject(m_nClientID); if (ECSSUCCESS(psResult)) m_iNextShapeId++; else { // We probably reached EOF... keep track of shape count. m_nTotalShapeCount = m_iNextShapeId; return NULL; } } // OK, we're ready to read the requested feature... return GetNextFeature();}/************************************************************************//* GetFeatureCount() *//* *//* If a spatial filter is in effect, we turn control over to *//* the generic counter. Otherwise we return the total count. *//* Eventually we should consider implementing a more efficient *//* way of counting features matching a spatial query. *//************************************************************************/int OGROGDILayer::GetFeatureCount( int bForce ){ if( m_nTotalShapeCount == -1) { m_nTotalShapeCount = OGRLayer::GetFeatureCount( bForce ); } return m_nTotalShapeCount;}/************************************************************************//* TestCapability() *//************************************************************************/int OGROGDILayer::TestCapability( const char * pszCap ){/* -------------------------------------------------------------------- *//* Hummm... what are the proper capabilities... *//* Does OGDI have any idea of capabilities??? *//* For now just return FALSE for everything. *//* -------------------------------------------------------------------- */#ifdef __TODO__ if( EQUAL(pszCap,OLCRandomRead) ) return TRUE; else if( EQUAL(pszCap,OLCFastFeatureCount) ) return m_poFilterGeom == NULL; else if( EQUAL(pszCap,OLCFastSpatialFilter) ) return FALSE; else return FALSE;#endif return FALSE;}/************************************************************************//* BuildFeatureDefn() *//* *//* (private) Initializes the schema in m_poFeatureDefn *//************************************************************************/void OGROGDILayer::BuildFeatureDefn(){ ecs_Result *psResult; ecs_ObjAttributeFormat *oaf; int i, numFields; const char *pszGeomName; OGRwkbGeometryType eLayerGeomType;/* -------------------------------------------------------------------- *//* Feature Defn name will be "<OGDILyrName>_<FeatureFamily>" *//* -------------------------------------------------------------------- */ switch(m_eFamily) { case Point: pszGeomName = "point"; eLayerGeomType = wkbPoint; break; case Line: pszGeomName = "line"; eLayerGeomType = wkbLineString; break; case Area: pszGeomName = "area"; eLayerGeomType = wkbPolygon; break; case Text: pszGeomName = "text"; eLayerGeomType = wkbPoint; break; default: pszGeomName = "unknown"; eLayerGeomType = wkbUnknown; break; } m_poFeatureDefn = new OGRFeatureDefn(CPLSPrintf("%s_%s", m_pszOGDILayerName, pszGeomName )); m_poFeatureDefn->SetGeomType(eLayerGeomType); m_poFeatureDefn->Reference();/* -------------------------------------------------------------------- *//* Fetch schema from OGDI server and map to OGR types *//* -------------------------------------------------------------------- */ psResult = cln_GetAttributesFormat( m_nClientID ); if( ECSERROR( psResult ) ) { CPLError(CE_Failure, CPLE_AppDefined, "ECSERROR: %s\n", psResult->message); return; } oaf = &(ECSRESULT(psResult).oaf); numFields = oaf->oa.oa_len; for( i = 0; i < numFields; i++ ) { OGRFieldDefn oField("", OFTInteger); oField.SetName( oaf->oa.oa_val[i].name ); oField.SetPrecision( 0 ); switch( oaf->oa.oa_val[i].type ) { case Decimal: case Smallint: case Integer: oField.SetType( OFTInteger ); if( oaf->oa.oa_val[i].lenght > 0 ) oField.SetWidth( oaf->oa.oa_val[i].lenght ); else oField.SetWidth( 11 ); break; case Numeric: case Real: case Float: case Double: oField.SetType( OFTReal ); if( oaf->oa.oa_val[i].lenght > 0 ) { oField.SetWidth( oaf->oa.oa_val[i].lenght ); oField.SetPrecision( oaf->oa.oa_val[i].precision ); } else { oField.SetWidth( 18 ); oField.SetPrecision( 7 ); } break; case Char: case Varchar: case Longvarchar: default: oField.SetType( OFTString ); if( oaf->oa.oa_val[i].lenght > 0 ) oField.SetWidth( oaf->oa.oa_val[i].lenght ); else oField.SetWidth( 64 ); break; } m_poFeatureDefn->AddFieldDefn( &oField ); }/* -------------------------------------------------------------------- *//* Add a text attribute for text objects. *//* -------------------------------------------------------------------- */ if( m_eFamily == Text ) { OGRFieldDefn oField("text", OFTString); m_poFeatureDefn->AddFieldDefn( &oField ); } }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -