⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gmlreader.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        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 + -