📄 gmlreader.cpp
字号:
return FALSE; if( m_poState->m_nPathLength > 0 ) return FALSE; GMLFeatureClass *poClass = m_poState->m_poFeature->GetClass(); if( !poClass->IsSchemaLocked() ) return TRUE; for( int i = 0; i < poClass->GetPropertyCount(); i++ ) if( EQUAL(poClass->GetProperty(i)->GetSrcElement(),pszElement) ) return TRUE; return FALSE;}/************************************************************************//* PopState() *//************************************************************************/void GMLReader::PopState(){ if( m_poState != NULL ) { if( m_poState->m_poFeature != NULL && m_poCompleteFeature == NULL ) { m_poCompleteFeature = m_poState->m_poFeature; m_poState->m_poFeature = NULL; } GMLReadState *poParent; poParent = m_poState->m_poParentState; delete m_poState; m_poState = poParent; }}/************************************************************************//* PushState() *//************************************************************************/void GMLReader::PushState( GMLReadState *poState ){ poState->m_poParentState = m_poState; m_poState = poState;}/************************************************************************//* GetClass() *//************************************************************************/GMLFeatureClass *GMLReader::GetClass( int iClass ) const{ if( iClass < 0 || iClass >= m_nClassCount ) return NULL; else return m_papoClass[iClass];}/************************************************************************//* GetClass() *//************************************************************************/GMLFeatureClass *GMLReader::GetClass( const char *pszName ) const{ for( int iClass = 0; iClass < m_nClassCount; iClass++ ) { if( EQUAL(GetClass(iClass)->GetName(),pszName) ) return GetClass(iClass); } return NULL;}/************************************************************************//* AddClass() *//************************************************************************/int GMLReader::AddClass( GMLFeatureClass *poNewClass ){ CPLAssert( GetClass( poNewClass->GetName() ) == NULL ); m_nClassCount++; m_papoClass = (GMLFeatureClass **) CPLRealloc( m_papoClass, sizeof(void*) * m_nClassCount ); m_papoClass[m_nClassCount-1] = poNewClass; return m_nClassCount-1;}/************************************************************************//* ClearClasses() *//************************************************************************/void GMLReader::ClearClasses(){ for( int i = 0; i < m_nClassCount; i++ ) delete m_papoClass[i]; CPLFree( m_papoClass ); m_nClassCount = 0; m_papoClass = NULL;}/************************************************************************//* SetFeatureProperty() *//* *//* Set the property value on the current feature, adding the *//* property name to the GMLFeatureClass if required. *//* Eventually this function may also "refine" the property *//* type based on what is encountered. *//************************************************************************/void GMLReader::SetFeatureProperty( const char *pszElement, const char *pszValue ){ GMLFeature *poFeature = GetState()->m_poFeature; CPLAssert( poFeature != NULL );/* -------------------------------------------------------------------- *//* Does this property exist in the feature class? If not, add *//* it. *//* -------------------------------------------------------------------- */ GMLFeatureClass *poClass = poFeature->GetClass(); int iProperty; for( iProperty=0; iProperty < poClass->GetPropertyCount(); iProperty++ ) { if( EQUAL(poClass->GetProperty( iProperty )->GetSrcElement(), pszElement ) ) break; } if( iProperty == poClass->GetPropertyCount() ) { if( poClass->IsSchemaLocked() ) { CPLDebug("GML","Encountered property missing from class schema."); return; } GMLPropertyDefn *poPDefn = new GMLPropertyDefn(pszElement,pszElement); if( EQUAL(CPLGetConfigOption( "GML_FIELDTYPES", ""), "ALWAYS_STRING") ) poPDefn->SetType( GMLPT_String ); poClass->AddProperty( poPDefn ); }/* -------------------------------------------------------------------- *//* Set the property *//* -------------------------------------------------------------------- */ poFeature->SetProperty( iProperty, pszValue );/* -------------------------------------------------------------------- *//* Do we need to update the property type? *//* -------------------------------------------------------------------- */ if( !poClass->IsSchemaLocked() ) poClass->GetProperty( iProperty )->AnalysePropertyValue(pszValue);}/************************************************************************//* LoadClasses() *//************************************************************************/int GMLReader::LoadClasses( const char *pszFile ){ // Add logic later to determine reasonable default schema file. if( pszFile == NULL ) return FALSE;/* -------------------------------------------------------------------- *//* Load the raw XML file. *//* -------------------------------------------------------------------- */ FILE *fp; int nLength; char *pszWholeText; fp = VSIFOpen( pszFile, "rb" ); if( fp == NULL ) { CPLError( CE_Failure, CPLE_OpenFailed, "Failed to open file %s.", pszFile ); return FALSE; } VSIFSeek( fp, 0, SEEK_END ); nLength = VSIFTell( fp ); VSIFSeek( fp, 0, SEEK_SET ); pszWholeText = (char *) VSIMalloc(nLength+1); if( pszWholeText == NULL ) { CPLError( CE_Failure, CPLE_AppDefined, "Failed to allocate %d byte buffer for %s,\n" "is this really a GMLFeatureClassList file?", nLength, pszFile ); VSIFClose( fp ); return FALSE; } if( VSIFRead( pszWholeText, nLength, 1, fp ) != 1 ) { VSIFree( pszWholeText ); VSIFClose( fp ); CPLError( CE_Failure, CPLE_AppDefined, "Read failed on %s.", pszFile ); return FALSE; } pszWholeText[nLength] = '\0'; VSIFClose( fp ); if( strstr( pszWholeText, "<GMLFeatureClassList>" ) == NULL ) { VSIFree( pszWholeText ); CPLError( CE_Failure, CPLE_AppDefined, "File %s does not contain a GMLFeatureClassList tree.", pszFile ); return FALSE; }/* -------------------------------------------------------------------- *//* Convert to XML parse tree. *//* -------------------------------------------------------------------- */ CPLXMLNode *psRoot; psRoot = CPLParseXMLString( pszWholeText ); VSIFree( pszWholeText ); // We assume parser will report errors via CPL. if( psRoot == NULL ) return FALSE; if( psRoot->eType != CXT_Element || !EQUAL(psRoot->pszValue,"GMLFeatureClassList") ) { CPLDestroyXMLNode(psRoot); CPLError( CE_Failure, CPLE_AppDefined, "File %s is not a GMLFeatureClassList document.", pszFile ); return FALSE; }/* -------------------------------------------------------------------- *//* Extract feature classes for all definitions found. *//* -------------------------------------------------------------------- */ CPLXMLNode *psThis; for( psThis = psRoot->psChild; psThis != NULL; psThis = psThis->psNext ) { if( psThis->eType == CXT_Element && EQUAL(psThis->pszValue,"GMLFeatureClass") ) { GMLFeatureClass *poClass; poClass = new GMLFeatureClass(); if( !poClass->InitializeFromXML( psThis ) ) { delete poClass; CPLDestroyXMLNode( psRoot ); return FALSE; } poClass->SetSchemaLocked( TRUE ); AddClass( poClass ); } } CPLDestroyXMLNode( psRoot ); SetClassListLocked( TRUE ); return TRUE;}/************************************************************************//* SaveClasses() *//************************************************************************/int GMLReader::SaveClasses( const char *pszFile ){ // Add logic later to determine reasonable default schema file. if( pszFile == NULL ) return FALSE;/* -------------------------------------------------------------------- *//* Create in memory schema tree. *//* -------------------------------------------------------------------- */ CPLXMLNode *psRoot; psRoot = CPLCreateXMLNode( NULL, CXT_Element, "GMLFeatureClassList" ); for( int iClass = 0; iClass < GetClassCount(); iClass++ ) { GMLFeatureClass *poClass = GetClass( iClass ); CPLAddXMLChild( psRoot, poClass->SerializeToXML() ); }/* -------------------------------------------------------------------- *//* Serialize to disk. *//* -------------------------------------------------------------------- */ FILE *fp; int bSuccess = TRUE; char *pszWholeText = CPLSerializeXMLTree( psRoot ); CPLDestroyXMLNode( psRoot ); fp = VSIFOpen( pszFile, "wb" ); if( fp == NULL ) bSuccess = FALSE; else if( VSIFWrite( pszWholeText, strlen(pszWholeText), 1, fp ) != 1 ) bSuccess = FALSE; else VSIFClose( fp ); CPLFree( pszWholeText ); return bSuccess;}/************************************************************************//* PrescanForSchema() *//* *//* For now we use a pretty dumb approach of just doing a normal *//* scan of the whole file, building up the schema information. *//* Eventually we hope to do a more efficient scan when just *//* looking for schema information. *//************************************************************************/int GMLReader::PrescanForSchema( int bGetExtents ){ GMLFeature *poFeature; if( m_pszFilename == NULL ) return FALSE; SetClassListLocked( FALSE ); ClearClasses(); if( !SetupParser() ) return FALSE; while( (poFeature = NextFeature()) != NULL ) { GMLFeatureClass *poClass = poFeature->GetClass(); if( poClass->GetFeatureCount() == -1 ) poClass->SetFeatureCount( 1 ); else poClass->SetFeatureCount( poClass->GetFeatureCount() + 1 );#ifdef SUPPORT_GEOMETRY if( bGetExtents ) { OGRGeometry *poGeometry = NULL; if( poFeature->GetGeometry() != NULL && strlen(poFeature->GetGeometry()) != 0 ) { poGeometry = OGRGeometryFactory::createFromGML( poFeature->GetGeometry() ); } if( poGeometry != NULL ) { double dfXMin, dfXMax, dfYMin, dfYMax; OGREnvelope sEnvelope; poGeometry->getEnvelope( &sEnvelope ); delete poGeometry; if( poClass->GetExtents(&dfXMin, &dfXMax, &dfYMin, &dfYMax) ) { dfXMin = MIN(dfXMin,sEnvelope.MinX); dfXMax = MAX(dfXMax,sEnvelope.MaxX); dfYMin = MIN(dfYMin,sEnvelope.MinY); dfYMax = MAX(dfYMax,sEnvelope.MaxY); } else { dfXMin = sEnvelope.MinX; dfXMax = sEnvelope.MaxX; dfYMin = sEnvelope.MinY; dfYMax = sEnvelope.MaxY; } poClass->SetExtents( dfXMin, dfXMax, dfYMin, dfYMax ); }#endif /* def SUPPORT_GEOMETRY */ } delete poFeature; } CleanupParser(); return GetClassCount() > 0;}/************************************************************************//* ResetReading() *//************************************************************************/void GMLReader::ResetReading(){ CleanupParser();}#endif /* HAVE_XERCES == 1 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -