ogrkmldatasource.cpp

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

CPP
295
字号
/****************************************************************************** * $Id: ogrkmldatasource.cpp 10646 2007-01-18 02:38:10Z warmerdam $ * * Project:  KML Driver * Purpose:  Implementation of OGRKMLDataSource class. * Author:   Christopher Condit, condit@sdsc.edu * ****************************************************************************** * Copyright (c) 2006, Christopher Condit * * 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_kml.h"#include "cpl_conv.h"#include "cpl_string.h"#include "cpl_error.h"/************************************************************************//*                         OGRKMLDataSource()                         *//************************************************************************/OGRKMLDataSource::OGRKMLDataSource(){    pszName = NULL;    pszNameField = NULL;    papoLayers = NULL;    nLayers = 0;        fpOutput = NULL;    papszCreateOptions = NULL;}/************************************************************************//*                        ~OGRKMLDataSource()                         *//************************************************************************/OGRKMLDataSource::~OGRKMLDataSource(){    if( fpOutput != NULL )    {        VSIFPrintf( fpOutput, "%s",                     "</Folder></Document></kml>\n" );                if( fpOutput != stdout )            VSIFClose( fpOutput );    }    CSLDestroy( papszCreateOptions );    CPLFree( pszName );    CPLFree( pszNameField );    for( int i = 0; i < nLayers; i++ )    {        delete papoLayers[i];    }        CPLFree( papoLayers );    }/************************************************************************//*                                Open()                                *//************************************************************************/int OGRKMLDataSource::Open( const char * pszNewName, int bTestOpen ){    FILE        *fp;    char        szHeader[1000];		    CPLAssert( NULL != pszNewName );/* -------------------------------------------------------------------- *//*      Open the source file.                                           *//* -------------------------------------------------------------------- */    fp = VSIFOpen( pszNewName, "r" );    if( fp == NULL )    {        if( !bTestOpen )            CPLError( CE_Failure, CPLE_OpenFailed,                       "Failed to open KML file `%s'.",                       pszNewName );        return FALSE;    }/* -------------------------------------------------------------------- *//*      If we aren't sure it is KML, load a header chunk and check      *//*      for signs it is KML                                             *//* -------------------------------------------------------------------- */    if( bTestOpen )    {        VSIFRead( szHeader, 1, sizeof(szHeader), fp );        szHeader[sizeof(szHeader)-1] = '\0';			        if( szHeader[0] != '<'             || strstr(szHeader, "http://earth.google.com/kml/2.0") == NULL )        {			            VSIFClose( fp );            return FALSE;        }    }    	VSIFClose( fp );		CPLError( CE_Failure, CPLE_AppDefined,               "Reading KML files is not currently supported\n");    return TRUE;	}/************************************************************************//*                         TranslateKMLSchema()                         *//************************************************************************/OGRKMLLayer *OGRKMLDataSource::TranslateKMLSchema( KMLFeatureClass *poClass ){    CPLAssert( NULL != poClass );    OGRKMLLayer *poLayer;    poLayer = new OGRKMLLayer( poClass->GetName(), NULL, FALSE,                                wkbUnknown, this );    return poLayer;}/************************************************************************//*                               Create()                               *//************************************************************************/int OGRKMLDataSource::Create( const char *pszFilename,                               char **papszOptions ){    CPLAssert( NULL != pszFilename );    if( fpOutput != NULL )    {        CPLAssert( FALSE );        return FALSE;    }    pszNameField = CPLStrdup(CSLFetchNameValue(papszOptions, "NameField"));    CPLDebug("KML", "Using the field '%s' for name element", pszNameField);    /* -------------------------------------------------------------------- *//*      Create the output file.                                         *//* -------------------------------------------------------------------- */    pszName = CPLStrdup( pszFilename );        if( EQUAL(pszFilename,"stdout") )        fpOutput = stdout;    else        fpOutput = VSIFOpen( pszFilename, "wt+" );    if( fpOutput == NULL )    {        CPLError( CE_Failure, CPLE_OpenFailed,                   "Failed to create KML file %s.",                   pszFilename );        return FALSE;    }/* -------------------------------------------------------------------- *//*      Write out "standard" header.                                    *//* -------------------------------------------------------------------- */    VSIFPrintf( fpOutput, "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" );	    nSchemaInsertLocation = VSIFTell( fpOutput );        VSIFPrintf( fpOutput, "<kml xmlns=\"http://earth.google.com/kml/2.0\">\n<Document>" );    return TRUE;}/************************************************************************//*                            CreateLayer()                             *//************************************************************************/OGRLayer *OGRKMLDataSource::CreateLayer( const char * pszLayerName,                               OGRSpatialReference *poSRS,                               OGRwkbGeometryType eType,                               char ** papszOptions ){    CPLAssert( NULL != pszLayerName);/* -------------------------------------------------------------------- *//*      Verify we are in update mode.                                   *//* -------------------------------------------------------------------- */    if( fpOutput == NULL )    {        CPLError( CE_Failure, CPLE_NoWriteAccess,                  "Data source %s opened for read access.\n"                  "New layer %s cannot be created.\n",                  pszName, pszLayerName );        return NULL;    }/* -------------------------------------------------------------------- *//*      Close the previous layer (if there is one open)         *//* -------------------------------------------------------------------- */    if (GetLayerCount() > 0)        VSIFPrintf( fpOutput, "</Folder>\n");    /* -------------------------------------------------------------------- *//*      Ensure name is safe as an element name.                         *//* -------------------------------------------------------------------- */    char *pszCleanLayerName = CPLStrdup( pszLayerName );    CPLCleanXMLElementName( pszCleanLayerName );    if( strcmp(pszCleanLayerName, pszLayerName) != 0 )    {        CPLError( CE_Warning, CPLE_AppDefined,                   "Layer name '%s' adjusted to '%s' for XML validity.",                  pszLayerName, pszCleanLayerName );    }    VSIFPrintf( fpOutput, "<Folder><name>%s</name>\n", pszCleanLayerName);    /* -------------------------------------------------------------------- *//*      Create the layer object.                                        *//* -------------------------------------------------------------------- */    OGRKMLLayer *poLayer;    poLayer = new OGRKMLLayer( pszCleanLayerName, poSRS, TRUE, eType, this );    CPLFree( pszCleanLayerName );/* -------------------------------------------------------------------- *//*      Add layer to data source layer list.                            *//* -------------------------------------------------------------------- */    papoLayers = (OGRKMLLayer **)        CPLRealloc( papoLayers,  sizeof(OGRKMLLayer *) * (nLayers+1) );        papoLayers[nLayers++] = poLayer;    return poLayer;}/************************************************************************//*                           TestCapability()                           *//************************************************************************/int OGRKMLDataSource::TestCapability( const char * pszCap ){    if( EQUAL(pszCap,ODsCCreateLayer) )        return TRUE;    else        return FALSE;}/************************************************************************//*                              GetLayer()                              *//************************************************************************/OGRLayer *OGRKMLDataSource::GetLayer( int iLayer ){    if( iLayer < 0 || iLayer >= nLayers )        return NULL;    else        return papoLayers[iLayer];}/************************************************************************//*                            GrowExtents()                             *//************************************************************************/void OGRKMLDataSource::GrowExtents( OGREnvelope *psGeomBounds ){    CPLAssert( NULL != psGeomBounds );    sBoundingRect.Merge( *psGeomBounds );}/************************************************************************//*                            InsertHeader()                            *//*                                                                      *//*      This method is used to update boundedby info for a              *//*      dataset, and insert schema descriptions depending on            *//*      selection options in effect.                                    *//************************************************************************/void OGRKMLDataSource::InsertHeader(){            return;}

⌨️ 快捷键说明

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