📄 ogr2ogr.cpp
字号:
/****************************************************************************** * $Id: ogr2ogr.cpp,v 1.2 2001/01/22 16:03:59 warmerda Exp $ * * Project: OpenGIS Simple Features Reference Implementation * Purpose: Simple client for translating between formats. * Author: Frank Warmerdam, warmerda@home.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * 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: ogr2ogr.cpp,v $ * Revision 1.2 2001/01/22 16:03:59 warmerda * expanded tabs * * Revision 1.1 2000/01/26 18:18:35 warmerda * New * * Revision 1.2 1999/11/18 19:02:19 warmerda * expanded tabs * * Revision 1.1 1999/11/04 21:07:53 warmerda * New * */#include "ogrsf_frmts.h"#include "cpl_conv.h"#include "cpl_string.h"static void Usage();static int TranslateLayer( OGRDataSource *poSrcDS, OGRLayer * poSrcLayer, OGRDataSource *poDstDS );CPL_C_STARTvoid RegisterOGRTAB();CPL_C_END/************************************************************************//* main() *//************************************************************************/int main( int nArgc, char ** papszArgv ){ const char *pszFormat = "ESRI Shapefile"; const char *pszDataSource = NULL; const char *pszDestDataSource = NULL; char **papszLayers = NULL; /* -------------------------------------------------------------------- *//* Register format(s). *//* -------------------------------------------------------------------- */ RegisterOGRTAB();/* -------------------------------------------------------------------- *//* Processing command line arguments. *//* -------------------------------------------------------------------- */ for( int iArg = 1; iArg < nArgc; iArg++ ) { if( EQUAL(papszArgv[iArg],"-f") && iArg < nArgc-1 ) { pszFormat = papszArgv[++iArg]; } else if( papszArgv[iArg][0] == '-' ) { Usage(); } else if( pszDestDataSource == NULL ) pszDestDataSource = papszArgv[iArg]; else if( pszDataSource == NULL ) pszDataSource = papszArgv[iArg]; else papszLayers = CSLAddString( papszLayers, papszArgv[iArg] ); } if( pszDataSource == NULL ) Usage();/* -------------------------------------------------------------------- *//* Open data source. *//* -------------------------------------------------------------------- */ OGRDataSource *poDS; poDS = OGRSFDriverRegistrar::Open( pszDataSource, FALSE );/* -------------------------------------------------------------------- *//* Report failure *//* -------------------------------------------------------------------- */ if( poDS == NULL ) { OGRSFDriverRegistrar *poR = OGRSFDriverRegistrar::GetRegistrar(); printf( "FAILURE:\n" "Unable to open datasource `%s' with the following drivers.\n", pszDataSource ); for( int iDriver = 0; iDriver < poR->GetDriverCount(); iDriver++ ) { printf( " -> %s\n", poR->GetDriver(iDriver)->GetName() ); } exit( 1 ); }/* -------------------------------------------------------------------- *//* Find the output driver. *//* -------------------------------------------------------------------- */ OGRSFDriverRegistrar *poR = OGRSFDriverRegistrar::GetRegistrar(); OGRSFDriver *poDriver = NULL; int iDriver; for( iDriver = 0; iDriver < poR->GetDriverCount() && poDriver == NULL; iDriver++ ) { if( EQUAL(poR->GetDriver(iDriver)->GetName(),pszFormat) ) { poDriver = poR->GetDriver(iDriver); } } if( poDriver == NULL ) { printf( "Unable to find driver `%s'.\n", pszFormat ); printf( "The following drivers are available:\n" ); for( iDriver = 0; iDriver < poR->GetDriverCount(); iDriver++ ) { printf( " -> `%s'\n", poR->GetDriver(iDriver)->GetName() ); } exit( 1 ); } if( !poDriver->TestCapability( ODrCCreateDataSource ) ) { printf( "%s driver does not support data source creation.\n", pszFormat ); exit( 1 ); }/* -------------------------------------------------------------------- *//* Create the output data source. *//* -------------------------------------------------------------------- */ OGRDataSource *poODS; poODS = poDriver->CreateDataSource( pszDestDataSource ); if( poODS == NULL ) exit( 1 );/* -------------------------------------------------------------------- *//* Process each data source layer. *//* -------------------------------------------------------------------- */ for( int iLayer = 0; iLayer < poDS->GetLayerCount(); iLayer++ ) { OGRLayer *poLayer = poDS->GetLayer(iLayer); if( poLayer == NULL ) { printf( "FAILURE: Couldn't fetch advertised layer %d!\n", iLayer ); exit( 1 ); } if( CSLCount(papszLayers) == 0 || CSLFindString( papszLayers, poLayer->GetLayerDefn()->GetName() ) != -1 ) { if( !TranslateLayer( poDS, poLayer, poODS ) ) exit( 1 ); } }/* -------------------------------------------------------------------- *//* Close down. *//* -------------------------------------------------------------------- */ delete poODS; delete poDS;#ifdef DBMALLOC malloc_dump(1);#endif return 0;}/************************************************************************//* Usage() *//************************************************************************/static void Usage(){ printf( "Usage: ogr2ogr [-f format_name] dst_datasource_name\n" " src_datasource_name [layer [layer ...]]\n"); exit( 1 );}/************************************************************************//* TranslateLayer() *//************************************************************************/static int TranslateLayer( OGRDataSource *poSrcDS, OGRLayer * poSrcLayer, OGRDataSource *poDstDS ){ OGRLayer *poDstLayer; OGRFeatureDefn *poFDefn; /* -------------------------------------------------------------------- *//* Create the layer. *//* -------------------------------------------------------------------- */ CPLAssert( poDstDS->TestCapability( ODsCCreateLayer ) ); poFDefn = poSrcLayer->GetLayerDefn(); poDstLayer = poDstDS->CreateLayer( poSrcLayer->GetLayerDefn()->GetName(), poSrcLayer->GetSpatialRef(), poFDefn->GetGeomType(), NULL ); if( poDstLayer == NULL ) return FALSE;/* -------------------------------------------------------------------- *//* Add fields. *//* -------------------------------------------------------------------- */ int iField; for( iField = 0; iField < poFDefn->GetFieldCount(); iField++ ) { if( poDstLayer->CreateField( poFDefn->GetFieldDefn(iField) ) != OGRERR_NONE ) return FALSE; }/* -------------------------------------------------------------------- *//* Transfer features. *//* -------------------------------------------------------------------- */ OGRFeature *poFeature; poSrcLayer->ResetReading(); while( (poFeature = poSrcLayer->GetNextFeature()) != NULL ) { OGRFeature *poDstFeature; poDstFeature = new OGRFeature( poDstLayer->GetLayerDefn() ); if( poDstFeature->SetFrom( poFeature ) != OGRERR_NONE ) { delete poFeature; CPLError( CE_Failure, CPLE_AppDefined, "Unable to translate feature %d from layer %s.\n", poFeature->GetFID(), poFDefn->GetName() ); return FALSE; } delete poFeature; if( poDstLayer->CreateFeature( poDstFeature ) != OGRERR_NONE ) { delete poDstFeature; return FALSE; } delete poDstFeature; } return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -