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

📄 ogrdgndatasource.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
字号:
/****************************************************************************** * $Id: ogrdgndatasource.cpp,v 1.11 2004/08/17 21:00:21 warmerda Exp $ * * Project:  OpenGIS Simple Features Reference Implementation * Purpose:  Implements OGRPGDataSource class. * Author:   Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam (warmerdam@pobox.com) * * 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. ****************************************************************************** * * $Log: ogrdgndatasource.cpp,v $ * Revision 1.11  2004/08/17 21:00:21  warmerda * Fixed last fix so that short files aren't even passed to DGNTestOpen(). * * Revision 1.10  2004/08/17 20:56:48  warmerda * Keep track of how many bytes we get when reading info for testopen. * * Revision 1.9  2003/05/21 03:42:01  warmerda * Expanded tabs * * Revision 1.8  2003/05/12 18:48:57  warmerda * added preliminary 3D write support * * Revision 1.7  2002/11/12 19:46:12  warmerda * use default seed file if none given * * Revision 1.6  2002/11/11 20:34:22  warmerda * added create support * * Revision 1.5  2002/03/14 21:40:19  warmerda * pass update flag to DGNOpen * * Revision 1.4  2001/07/18 04:55:16  warmerda * added CPL_CSVID * * Revision 1.3  2001/03/18 16:54:39  warmerda * added use of DGNTestOpen, remove extention test * * Revision 1.2  2000/12/28 21:27:11  warmerda * updated email address * * Revision 1.1  2000/11/28 19:03:47  warmerda * New * */#include "ogr_dgn.h"#include "cpl_conv.h"#include "cpl_string.h"CPL_CVSID("$Id: ogrdgndatasource.cpp,v 1.11 2004/08/17 21:00:21 warmerda Exp $");/************************************************************************//*                         OGRDGNDataSource()                           *//************************************************************************/OGRDGNDataSource::OGRDGNDataSource(){    papoLayers = NULL;    nLayers = 0;    hDGN = NULL;    pszName = NULL;    papszOptions = NULL;}/************************************************************************//*                        ~OGRDGNDataSource()                           *//************************************************************************/OGRDGNDataSource::~OGRDGNDataSource(){    for( int i = 0; i < nLayers; i++ )        delete papoLayers[i];        CPLFree( papoLayers );    CPLFree( pszName );    CSLDestroy( papszOptions );    if( hDGN != NULL )        DGNClose( hDGN );}/************************************************************************//*                                Open()                                *//************************************************************************/int OGRDGNDataSource::Open( const char * pszNewName,                             int bTestOpen,                             int bUpdate ){    CPLAssert( nLayers == 0 );/* -------------------------------------------------------------------- *//*      For now we require files to have the .dgn or .DGN               *//*      extension.  Eventually we will implement a more                 *//*      sophisticated test to see if it is a dgn file.                  *//* -------------------------------------------------------------------- */    if( bTestOpen )    {        FILE    *fp;        GByte   abyHeader[512];        int     nHeaderBytes = 0;        fp = VSIFOpen( pszNewName, "rb" );        if( fp == NULL )            return FALSE;        nHeaderBytes = (int) VSIFRead( abyHeader, 1, sizeof(abyHeader), fp );        VSIFClose( fp );        if( nHeaderBytes < 512 )            return FALSE;        if( !DGNTestOpen( abyHeader, nHeaderBytes ) )            return FALSE;    }/* -------------------------------------------------------------------- *//*      Try to open the file as a DGN file.                             *//* -------------------------------------------------------------------- */    hDGN = DGNOpen( pszNewName, bUpdate );    if( hDGN == NULL )    {        if( !bTestOpen )            CPLError( CE_Failure, CPLE_AppDefined,                       "Unable to open %s as a Microstation .dgn file.\n",                       pszNewName );        return FALSE;    }/* -------------------------------------------------------------------- *//*      Create the layer object.                                        *//* -------------------------------------------------------------------- */    OGRDGNLayer *poLayer;    poLayer = new OGRDGNLayer( "elements", hDGN, bUpdate );    pszName = CPLStrdup( pszNewName );/* -------------------------------------------------------------------- *//*      Add layer to data source layer list.                            *//* -------------------------------------------------------------------- */    papoLayers = (OGRDGNLayer **)        CPLRealloc( papoLayers,  sizeof(OGRDGNLayer *) * (nLayers+1) );    papoLayers[nLayers++] = poLayer;        return TRUE;}/************************************************************************//*                           TestCapability()                           *//************************************************************************/int OGRDGNDataSource::TestCapability( const char * pszCap ){    if( EQUAL(pszCap,ODsCCreateLayer) )        return TRUE;    else        return FALSE;}/************************************************************************//*                              GetLayer()                              *//************************************************************************/OGRLayer *OGRDGNDataSource::GetLayer( int iLayer ){    if( iLayer < 0 || iLayer >= nLayers )        return NULL;    else        return papoLayers[iLayer];}/************************************************************************//*                             PreCreate()                              *//*                                                                      *//*      Called by OGRDGNDriver::Create() method to setup a stub         *//*      OGRDataSource object without the associated file created        *//*      yet.  It will be created by the CreateLayer() call.             *//************************************************************************/int OGRDGNDataSource::PreCreate( const char *pszFilename,                                  char **papszOptions ){    this->papszOptions = CSLDuplicate( papszOptions );    pszName = CPLStrdup( pszFilename );    return TRUE;}/************************************************************************//*                            CreateLayer()                             *//************************************************************************/OGRLayer *OGRDGNDataSource::CreateLayer( const char *pszLayerName,                                          OGRSpatialReference *poSRS,                                          OGRwkbGeometryType eGeomType,                                          char **papszExtraOptions ){    const char *pszSeed, *pszMasterUnit = "m", *pszSubUnit = "cm";    const char *pszValue;    int nUORPerSU=100, nSUPerMU=1;    int nCreationFlags = 0, b3DRequested;    double dfOriginX = -21474836.0,  /* default origin centered on zero */           dfOriginY = -21474836.0,  /* with two decimals of precision */           dfOriginZ = -21474836.0;/* -------------------------------------------------------------------- *//*      Ensure only one layer gets created.                             *//* -------------------------------------------------------------------- */    if( nLayers > 0 )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "DGN driver only supports one layer will all the elements in it." );        return NULL;    }/* -------------------------------------------------------------------- *//*      If the coordinate system is geographic, we should use a         *//*      localized default origin and resolution.                        *//* -------------------------------------------------------------------- */    if( poSRS != NULL && poSRS->IsGeographic() )    {        dfOriginX = -200.0;        dfOriginY = -200.0;                pszMasterUnit = "d";        pszSubUnit = "s";        nSUPerMU = 3600;        nUORPerSU = 1000;    }/* -------------------------------------------------------------------- *//*      Parse out various creation options.                             *//* -------------------------------------------------------------------- */    CSLInsertStrings( papszOptions, 0, papszExtraOptions );    b3DRequested = CSLFetchBoolean( papszOptions, "3D",                                     (((int) eGeomType) & wkb25DBit) );    pszSeed = CSLFetchNameValue( papszOptions, "SEED" );    if( pszSeed )        nCreationFlags |= DGNCF_USE_SEED_ORIGIN | DGNCF_USE_SEED_UNITS;    else if( b3DRequested )        pszSeed = CPLFindFile( "gdal", "seed_3d.dgn" );    else        pszSeed = CPLFindFile( "gdal", "seed_2d.dgn" );    if( pszSeed == NULL )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "No seed file provided, and unable to find seed_2d.dgn." );        return NULL;    }        if( CSLFetchBoolean( papszOptions, "COPY_WHOLE_SEED_FILE", TRUE ) )        nCreationFlags |= DGNCF_COPY_WHOLE_SEED_FILE;    if( CSLFetchBoolean( papszOptions, "COPY_SEED_FILE_COLOR_TABLE", TRUE ) )        nCreationFlags |= DGNCF_COPY_SEED_FILE_COLOR_TABLE;        pszValue = CSLFetchNameValue( papszOptions, "MASTER_UNIT_NAME" );    if( pszValue != NULL )    {        nCreationFlags &= ~DGNCF_USE_SEED_UNITS;        pszMasterUnit = pszValue;    }        pszValue = CSLFetchNameValue( papszOptions, "SUB_UNIT_NAME" );    if( pszValue != NULL )    {        nCreationFlags &= ~DGNCF_USE_SEED_UNITS;        pszSubUnit = pszValue;    }    pszValue = CSLFetchNameValue( papszOptions, "SUB_UNITS_PER_MASTER_UNIT" );    if( pszValue != NULL )    {        nCreationFlags &= ~DGNCF_USE_SEED_UNITS;        nSUPerMU = atoi(pszValue);    }    pszValue = CSLFetchNameValue( papszOptions, "UOR_PER_SUB_UNIT" );    if( pszValue != NULL )    {        nCreationFlags &= ~DGNCF_USE_SEED_UNITS;        nUORPerSU = atoi(pszValue);    }    pszValue = CSLFetchNameValue( papszOptions, "ORIGIN" );    if( pszValue != NULL )    {        char **papszTuple = CSLTokenizeStringComplex( pszValue, " ,",                                                       FALSE, FALSE );        nCreationFlags &= ~DGNCF_USE_SEED_ORIGIN;        if( CSLCount(papszTuple) == 3 )        {            dfOriginX = atof(papszTuple[0]);            dfOriginY = atof(papszTuple[1]);            dfOriginZ = atof(papszTuple[2]);        }        else if( CSLCount(papszTuple) == 2 )        {            dfOriginX = atof(papszTuple[0]);            dfOriginY = atof(papszTuple[1]);            dfOriginZ = 0.0;        }        else        {            CPLError( CE_Failure, CPLE_AppDefined,                       "ORIGIN is not a valid 2d or 3d tuple.\n"                      "Separate tuple values with comma." );            return FALSE;        }    }/* -------------------------------------------------------------------- *//*      Try creating the base file.                                     *//* -------------------------------------------------------------------- */    hDGN = DGNCreate( pszName, pszSeed, nCreationFlags,                       dfOriginX, dfOriginY, dfOriginZ,                       nSUPerMU, nUORPerSU, pszMasterUnit, pszSubUnit );    if( hDGN == NULL )        return NULL;/* -------------------------------------------------------------------- *//*      Create the layer object.                                        *//* -------------------------------------------------------------------- */    OGRDGNLayer *poLayer;    poLayer = new OGRDGNLayer( pszLayerName, hDGN, TRUE );/* -------------------------------------------------------------------- *//*      Add layer to data source layer list.                            *//* -------------------------------------------------------------------- */    papoLayers = (OGRDGNLayer **)        CPLRealloc( papoLayers,  sizeof(OGRDGNLayer *) * (nLayers+1) );    papoLayers[nLayers++] = poLayer;        return poLayer;}

⌨️ 快捷键说明

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