ogrili2datasource.cpp

来自「支持各种栅格图像和矢量图像读取的库」· C++ 代码 · 共 286 行

CPP
286
字号
/****************************************************************************** * $Id: ogrili2datasource.cpp 10646 2007-01-18 02:38:10Z warmerdam $ * * Project:  Interlis 2 Translator * Purpose:  Implements OGRILI2DataSource class. * Author:   Markus Schnider, Sourcepole AG * ****************************************************************************** * Copyright (c) 2004, Pirmin Kalberer, Sourcepole AG * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/#include "ogr_ili2.h"#include "cpl_conv.h"#include "cpl_string.h"#include "ili2reader.h"#include "iomhelper.h"using namespace std;CPL_CVSID("$Id: ogrili2datasource.cpp 10646 2007-01-18 02:38:10Z warmerdam $");/************************************************************************//*                         OGRILI2DataSource()                         *//************************************************************************/OGRILI2DataSource::OGRILI2DataSource(){    pszName = NULL;    poReader = NULL;    fpTransfer = NULL;    basket = NULL;}/************************************************************************//*                        ~OGRILI2DataSource()                         *//************************************************************************/OGRILI2DataSource::~OGRILI2DataSource(){    if (basket) iom_releasebasket(basket);    if (fpTransfer)    {        // write file      iom_save(fpTransfer);        // clean up      iom_close(fpTransfer);        iom_end();      }    CPLFree( pszName );}/************************************************************************//*                                Open()                                *//************************************************************************/int OGRILI2DataSource::Open( const char * pszNewName, int bTestOpen ){    FILE        *fp;    char        szHeader[1000];    char **modelFilenames = NULL;    char **filenames = CSLTokenizeString2( pszNewName, ",", 0 );    pszName = CPLStrdup( filenames[0] );    if( CSLCount(filenames) > 1 )        modelFilenames = &filenames[1];    CSLDestroy( filenames );/* -------------------------------------------------------------------- *//*      Open the source file.                                           *//* -------------------------------------------------------------------- */    fp = VSIFOpen( pszName, "r" );    if( fp == NULL )    {        if( !bTestOpen )            CPLError( CE_Failure, CPLE_OpenFailed,                       "Failed to open ILI2 file `%s'.",                       pszNewName );        return FALSE;    }/* -------------------------------------------------------------------- *//*      If we aren't sure it is ILI2, load a header chunk and check      *//*      for signs it is ILI2                                             *//* -------------------------------------------------------------------- */    if( bTestOpen )    {        VSIFRead( szHeader, 1, sizeof(szHeader), fp );        szHeader[sizeof(szHeader)-1] = '\0';        if( szHeader[0] != '<'             && strstr(szHeader,"interlis.ch/INTERLIS2") == NULL )        { // "www.interlis.ch/INTERLIS2.2"            VSIFClose( fp );            return FALSE;        }    }    /* -------------------------------------------------------------------- *//*      We assume now that it is ILI2.  Close and instantiate a          *//*      ILI2Reader on it.                                                *//* -------------------------------------------------------------------- */    VSIFClose( fp );        poReader = CreateILI2Reader();    if( poReader == NULL )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "File %s appears to be ILI2 but the ILI2 reader can't\n"                  "be instantiated, likely because Xerces support wasn't\n"                  "configured in.",                   pszNewName );        return FALSE;    }    if (modelFilenames)        poReader->ReadModel( modelFilenames );    if( getenv( "ARC_DEGREES" ) != NULL ) {      //No better way to pass arguments to the reader (it could even be an -lco arg)      poReader->SetArcDegrees( atof( getenv("ARC_DEGREES") ) );    }    poReader->SetSourceFile( pszName );    poReader->SaveClasses( pszName );    listLayer = poReader->GetLayers();    return TRUE;}/************************************************************************//*                               Create()                               *//************************************************************************/int OGRILI2DataSource::Create( const char *pszFilename,                               char **papszOptions ){    char **filenames = CSLTokenizeString2( pszFilename, ",", 0 );    pszName = filenames[0];    pszModelFilename = (CSLCount(filenames)>1) ? filenames[1] : NULL;    if( pszModelFilename == NULL )    {        CPLError( CE_Warning, CPLE_OpenFailed,                   "Model file '%s' (%s) not found.",                   pszModelFilename, pszFilename, VSIStrerror( errno ) );        return FALSE;    }	iom_init();	// set error listener to a iom provided one, that just 	// dumps all errors to stderr	iom_seterrlistener(iom_stderrlistener);	// compile ili model    char *iliFiles[1] = {(char *)pszModelFilename};	IOM_BASKET model=iom_compileIli(1,iliFiles);	if(!model){        CPLError( CE_Warning, CPLE_OpenFailed,                   "iom_compileIli .",                   pszName, VSIStrerror( errno ) );		iom_end();        return FALSE;	}	// open new file	fpTransfer=iom_open(pszName,IOM_CREATE | IOM_DONTREAD,0);	if(!fpTransfer){        CPLError( CE_Warning, CPLE_OpenFailed,                   "Failed to open %s.",                   pszName );        return FALSE;	}	// set model of new file	iom_setmodel(fpTransfer,model);	iom_setheadsender(fpTransfer, pszModelFilename);	iom_setheadcomment(fpTransfer,"Created by OGR");    // create new basket    static char basketname[512];    basketname[0] = '\0';    const char* val = GetAttrObjName(model, "iom04.metamodel.DataModel");    if (val)    {      strcat(basketname, val);      strcat(basketname, ".");      val = GetAttrObjName(model, "iom04.metamodel.Topic");      if (val) strcat(basketname, val);    }    else    {      strcat(basketname, "Basket");    }    basket=iom_newbasket(fpTransfer);    iom_setbaskettag(basket, basketname);    iom_setbasketoid(basket, "0");    return TRUE;}/************************************************************************//*                            CreateLayer()                             *//************************************************************************/OGRLayer *OGRILI2DataSource::CreateLayer( const char * pszLayerName,                               OGRSpatialReference *poSRS,                               OGRwkbGeometryType eType,                               char ** papszOptions ){    OGRILI2Layer *poLayer = new OGRILI2Layer(CPLStrdup(pszLayerName), poSRS, TRUE, eType, this);    return poLayer;}/************************************************************************//*                           TestCapability()                           *//************************************************************************/int OGRILI2DataSource::TestCapability( const char * pszCap ){    if( EQUAL(pszCap,ODsCCreateLayer) )        return TRUE;    else        return FALSE;}/************************************************************************//*                              GetLayer()                              *//************************************************************************/OGRLayer *OGRILI2DataSource::GetLayer( int iLayer ){  list<OGRLayer *>::const_iterator layerIt = listLayer.begin();  int i = 0;  while (i < iLayer && layerIt != listLayer.end()) {    i++;    layerIt++;  }    if (i == iLayer) {    OGRILI2Layer *tmpLayer = (OGRILI2Layer *)*layerIt;    return tmpLayer;  } else    return NULL;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?