📄 ogrfmelayercached.cpp
字号:
poFMEFeature->resetFeature(); poFMEFeature->setDimension( FME_TWO_D ); poFMEFeature->setGeometryType( FME_GEOM_LINE ); poFMEFeature->addCoordinate( oEnvelope.MinX, oEnvelope.MinY ); poFMEFeature->addCoordinate( oEnvelope.MaxX, oEnvelope.MaxY ); poIndex->queryEnvelope( *poFMEFeature ); } bQueryActive = TRUE; poDS->ReleaseSession();}/************************************************************************//* GetFeatureCount() *//************************************************************************/int OGRFMELayerCached::GetFeatureCount( int bForce ){ int nResult; poDS->AcquireSession(); if( m_poAttrQuery != NULL || poIndex == NULL ) { nResult = OGRLayer::GetFeatureCount( bForce ); } else { ResetReading(); nResult = poIndex->entries(); } poDS->ReleaseSession(); return nResult;}/************************************************************************//* GetExtent() *//************************************************************************/OGRErr OGRFMELayerCached::GetExtent( OGREnvelope *psExtent, int /* bForce */ ){ if( sExtents.MinX == 0.0 && sExtents.MaxX == 0.0 && sExtents.MinY == 0.0 && sExtents.MaxY == 0.0 ) return OGRERR_FAILURE; *psExtent = sExtents; return OGRERR_NONE;}/************************************************************************//* SerializeToXML() *//************************************************************************/CPLXMLNode *OGRFMELayerCached::SerializeToXML(){ CPLXMLNode *psLayer; char szGeomType[64]; psLayer = CPLCreateXMLNode( NULL, CXT_Element, "OGRLayer" ); /* -------------------------------------------------------------------- *//* Handle various layer values. *//* -------------------------------------------------------------------- */ CPLCreateXMLElementAndValue( psLayer, "Name", poFeatureDefn->GetName()); sprintf( szGeomType, "%d", (int) poFeatureDefn->GetGeomType() ); CPLCreateXMLElementAndValue( psLayer, "GeomType", szGeomType ); CPLCreateXMLElementAndValue( psLayer, "SpatialCacheName", pszIndexBase ); /* -------------------------------------------------------------------- *//* Handle spatial reference if available. *//* -------------------------------------------------------------------- */ if( GetSpatialRef() != NULL ) { char *pszWKT = NULL; OGRSpatialReference *poSRS = GetSpatialRef(); poSRS->exportToWkt( &pszWKT ); if( pszWKT != NULL ) { CPLCreateXMLElementAndValue( psLayer, "SRS", pszWKT ); CPLFree( pszWKT ); } }/* -------------------------------------------------------------------- *//* Handle extents if available. *//* -------------------------------------------------------------------- */ OGREnvelope sEnvelope; if( GetExtent( &sEnvelope, FALSE ) == OGRERR_NONE ) { char szExtent[512]; sprintf( szExtent, "%24.15E,%24.15E,%24.15E,%24.15E", sEnvelope.MinX, sEnvelope.MinY, sEnvelope.MaxX, sEnvelope.MaxY ); CPLCreateXMLElementAndValue( psLayer, "Extent", szExtent ); }/* -------------------------------------------------------------------- *//* Emit the field schemas. *//* -------------------------------------------------------------------- */ CPLXMLNode *psSchema = CPLCreateXMLNode( psLayer, CXT_Element, "Schema" ); for( int iField = 0; iField < poFeatureDefn->GetFieldCount(); iField++ ) { OGRFieldDefn *poFieldDef = poFeatureDefn->GetFieldDefn( iField ); const char *pszType; char szWidth[32], szPrecision[32]; CPLXMLNode *psXMLFD; sprintf( szWidth, "%d", poFieldDef->GetWidth() ); sprintf( szPrecision, "%d", poFieldDef->GetPrecision() ); if( poFieldDef->GetType() == OFTInteger ) pszType = "Integer"; else if( poFieldDef->GetType() == OFTIntegerList ) pszType = "IntegerList"; else if( poFieldDef->GetType() == OFTReal ) pszType = "Real"; else if( poFieldDef->GetType() == OFTRealList ) pszType = "RealList"; else if( poFieldDef->GetType() == OFTString ) pszType = "String"; else if( poFieldDef->GetType() == OFTStringList ) pszType = "StringList"; else if( poFieldDef->GetType() == OFTWideString ) pszType = "WideString"; else if( poFieldDef->GetType() == OFTWideStringList ) pszType = "WideStringList"; else if( poFieldDef->GetType() == OFTBinary ) pszType = "Binary"; else pszType = "Unsupported"; psXMLFD = CPLCreateXMLNode( psSchema, CXT_Element, "OGRFieldDefn" ); CPLCreateXMLElementAndValue( psXMLFD, "Name",poFieldDef->GetNameRef()); CPLCreateXMLElementAndValue( psXMLFD, "Type", pszType ); CPLCreateXMLElementAndValue( psXMLFD, "Width", szWidth ); CPLCreateXMLElementAndValue( psXMLFD, "Precision", szPrecision ); } return psLayer;}/************************************************************************//* InitializeFromXML() *//************************************************************************/int OGRFMELayerCached::InitializeFromXML( CPLXMLNode *psLayer ){/* -------------------------------------------------------------------- *//* Create the feature definition. *//* -------------------------------------------------------------------- */ poFeatureDefn = new OGRFeatureDefn( CPLGetXMLValue(psLayer,"Name","X") ); /* -------------------------------------------------------------------- *//* Set the geometry type, if available. *//* -------------------------------------------------------------------- */ if( CPLGetXMLNode( psLayer, "GeomType" ) != NULL ) poFeatureDefn->SetGeomType( (OGRwkbGeometryType) atoi(CPLGetXMLValue( psLayer, "GeomType", "0" )) );/* -------------------------------------------------------------------- *//* If we can extract extents, apply them to the layer. *//* -------------------------------------------------------------------- */ if( CPLGetXMLNode( psLayer, "Extent" ) != NULL ) { if( sscanf( CPLGetXMLValue( psLayer, "Extent", "" ), "%lf,%lf,%lf,%lf", &sExtents.MinX, &sExtents.MaxX, &sExtents.MinY, &sExtents.MaxY ) != 4 ) { memset( &sExtents, 0, sizeof(sExtents) ); } }/* -------------------------------------------------------------------- *//* Apply a SRS if found in the XML. *//* -------------------------------------------------------------------- */ if( CPLGetXMLNode( psLayer, "SRS" ) != NULL ) { char *pszSRS = (char *) CPLGetXMLValue( psLayer, "SRS", "" ); OGRSpatialReference oSRS; if( oSRS.importFromWkt( &pszSRS ) == OGRERR_NONE ) { if( poSpatialRef != NULL ) delete poSpatialRef; poSpatialRef = oSRS.Clone(); } }/* -------------------------------------------------------------------- *//* Apply the Schema. *//* -------------------------------------------------------------------- */ CPLXMLNode *psFieldDef; for( psFieldDef = CPLGetXMLNode( psLayer, "Schema.OGRFieldDefn" ); psFieldDef != NULL; psFieldDef = psFieldDef->psNext ) { const char *pszType; OGRFieldType eType; if( !EQUAL(psFieldDef->pszValue,"OGRFieldDefn") ) continue; pszType = CPLGetXMLValue( psFieldDef, "type", "String" ); if( EQUAL(pszType,"String") ) eType = OFTString; else if( EQUAL(pszType,"StringList") ) eType = OFTStringList; else if( EQUAL(pszType,"Integer") ) eType = OFTInteger; else if( EQUAL(pszType,"IntegerList") ) eType = OFTIntegerList; else if( EQUAL(pszType,"Real") ) eType = OFTReal; else if( EQUAL(pszType,"RealList") ) eType = OFTRealList; else if( EQUAL(pszType,"WideString") ) eType = OFTWideString; else if( EQUAL(pszType,"WideStringList") ) eType = OFTWideStringList; else if( EQUAL(pszType,"Binary") ) eType = OFTBinary; else eType = OFTString; OGRFieldDefn oField( CPLGetXMLValue( psFieldDef, "name", "default" ), eType ); oField.SetWidth( atoi(CPLGetXMLValue(psFieldDef,"width","0")) ); oField.SetPrecision( atoi(CPLGetXMLValue(psFieldDef,"precision","0"))); poFeatureDefn->AddFieldDefn( &oField ); }/* -------------------------------------------------------------------- *//* Ensure we have a working string and feature object *//* -------------------------------------------------------------------- */ poFMEFeature = poDS->GetFMESession()->createFeature(); return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -