📄 ogr2ogr.cpp
字号:
" -sql statement: Execute given SQL statement and save result.\n"
" -skipfailures: skip features or layers that fail to convert\n"
" -spat xmin ymin xmax ymax: spatial query extents\n"
" -dsco NAME=VALUE: Dataset creation option (format specific)\n"
" -lco NAME=VALUE: Layer creation option (format specific)\n"
" -nln name: Assign an alternate name to the new layer\n"
" -nlt type: Force a geometry type for new layer. One of NONE, GEOMETRY,\n"
" POINT, LINESTRING, POLYGON, GEOMETRYCOLLECTION, MULTIPOINT, MULTILINE,\n"
" MULTIPOLYGON, or MULTILINESTRING. Add \"25D\" for 3D layers.\n"
" Default is type of source layer.\n" );
printf(" -a_srs srs_def: Assign an output SRS\n"
" -t_srs srs_def: Reproject/transform to this SRS on output\n"
" -s_srs srs_def: Override source SRS\n"
"\n"
" Srs_def can be a full WKT definition (hard to escape properly),\n"
" or a well known definition (ie. EPSG:4326) or a file with a WKT\n"
" definition.\n" );
exit( 1 );
}
/************************************************************************/
/* TranslateLayer() */
/************************************************************************/
static int TranslateLayer( OGRDataSource *poSrcDS,
OGRLayer * poSrcLayer,
OGRDataSource *poDstDS,
char **papszLCO,
const char *pszNewLayerName,
int bTransform,
OGRSpatialReference *poOutputSRS,
OGRSpatialReference *poSourceSRS,
char **papszSelFields,
int bAppend, int eGType )
{
OGRLayer *poDstLayer;
OGRFeatureDefn *poFDefn;
OGRErr eErr;
int bForceToPolygon = FALSE;
int bForceToMultiPolygon = FALSE;
if( pszNewLayerName == NULL )
pszNewLayerName = poSrcLayer->GetLayerDefn()->GetName();
if( wkbFlatten(eGType) == wkbPolygon )
bForceToPolygon = TRUE;
else if( wkbFlatten(eGType) == wkbMultiPolygon )
bForceToMultiPolygon = TRUE;
/* -------------------------------------------------------------------- */
/* Setup coordinate transformation if we need it. */
/* -------------------------------------------------------------------- */
OGRCoordinateTransformation *poCT = NULL;
if( bTransform )
{
if( poSourceSRS == NULL )
poSourceSRS = poSrcLayer->GetSpatialRef();
if( poSourceSRS == NULL )
{
printf( "Can't transform coordinates, source layer has no\n"
"coordinate system. Use -s_srs to set one.\n" );
exit( 1 );
}
poCT = OGRCreateCoordinateTransformation( poSourceSRS, poOutputSRS );
if( poCT == NULL )
{
char *pszWKT = NULL;
printf("Failed to create coordinate transformation between the\n"
"following coordinate systems. This may be because they\n"
"are not transformable, or because projection services\n"
"(PROJ.4 DLL/.so) could not be loaded.\n" );
poSrcLayer->GetSpatialRef()->exportToPrettyWkt( &pszWKT, FALSE );
printf( "Source:\n%s\n", pszWKT );
poOutputSRS->exportToPrettyWkt( &pszWKT, FALSE );
printf( "Target:\n%s\n", pszWKT );
exit( 1 );
}
}
/* -------------------------------------------------------------------- */
/* Get other info. */
/* -------------------------------------------------------------------- */
poFDefn = poSrcLayer->GetLayerDefn();
if( poOutputSRS == NULL )
poOutputSRS = poSrcLayer->GetSpatialRef();
/* -------------------------------------------------------------------- */
/* Create the layer. */
/* -------------------------------------------------------------------- */
if( !bAppend )
{
if( eGType == -2 )
eGType = poFDefn->GetGeomType();
CPLAssert( poDstDS->TestCapability( ODsCCreateLayer ) );
CPLErrorReset();
poDstLayer = poDstDS->CreateLayer( pszNewLayerName, poOutputSRS,
(OGRwkbGeometryType) eGType,
papszLCO );
if( poDstLayer == NULL )
return FALSE;
}
/* -------------------------------------------------------------------- */
/* Or find existing layer to append to. */
/* -------------------------------------------------------------------- */
else
{
poDstLayer = NULL;
for( int iLayer = 0; iLayer < poDstDS->GetLayerCount(); iLayer++ )
{
OGRLayer *poLayer = poDstDS->GetLayer(iLayer);
if( poLayer != NULL
&& EQUAL(poLayer->GetLayerDefn()->GetName(),pszNewLayerName) )
{
poDstLayer = poLayer;
break;
}
}
if( poDstLayer == NULL )
{
printf( "FAILED: To find existing layer `%s' on output dataset\n"
" to append new features to.\n",
pszNewLayerName );
return FALSE;
}
}
/* -------------------------------------------------------------------- */
/* Add fields. Default to copy all field. */
/* If only a subset of all fields requested, then output only */
/* the selected fields, and in the order that they were */
/* selected. */
/* -------------------------------------------------------------------- */
int iField;
if (papszSelFields && !bAppend )
{
for( iField=0; papszSelFields[iField] != NULL; iField++)
{
int iSrcField = poFDefn->GetFieldIndex(papszSelFields[iField]);
if (iSrcField >= 0)
poDstLayer->CreateField( poFDefn->GetFieldDefn(iSrcField) );
else
{
printf( "Field '%s' not found in source layer.\n",
papszSelFields[iField] );
if( !bSkipFailures )
return FALSE;
}
}
}
else if( !bAppend )
{
for( iField = 0; iField < poFDefn->GetFieldCount(); iField++ )
poDstLayer->CreateField( poFDefn->GetFieldDefn(iField) );
}
/* -------------------------------------------------------------------- */
/* Transfer features. */
/* -------------------------------------------------------------------- */
OGRFeature *poFeature;
int nFeaturesInTransaction = 0;
poSrcLayer->ResetReading();
if( nGroupTransactions )
poDstLayer->StartTransaction();
while( TRUE )
{
OGRFeature *poDstFeature = NULL;
if( nFIDToFetch != OGRNullFID )
{
// Only fetch feature on first pass.
if( nFeaturesInTransaction == 0 )
poFeature = poSrcLayer->GetFeature(nFIDToFetch);
else
poFeature = NULL;
}
else
poFeature = poSrcLayer->GetNextFeature();
if( poFeature == NULL )
break;
if( ++nFeaturesInTransaction == nGroupTransactions )
{
poDstLayer->CommitTransaction();
poDstLayer->StartTransaction();
nFeaturesInTransaction = 0;
}
CPLErrorReset();
poDstFeature = OGRFeature::CreateFeature( poDstLayer->GetLayerDefn() );
if( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE )
{
if( nGroupTransactions )
poDstLayer->CommitTransaction();
CPLError( CE_Failure, CPLE_AppDefined,
"Unable to translate feature %d from layer %s.\n",
poFeature->GetFID(), poFDefn->GetName() );
OGRFeature::DestroyFeature( poFeature );
OGRFeature::DestroyFeature( poDstFeature );
return FALSE;
}
if( bPreserveFID )
poDstFeature->SetFID( poFeature->GetFID() );
if( poCT && poDstFeature->GetGeometryRef() != NULL )
{
eErr = poDstFeature->GetGeometryRef()->transform( poCT );
if( eErr != OGRERR_NONE )
{
if( nGroupTransactions )
poDstLayer->CommitTransaction();
printf( "Failed to transform feature %d.\n",
(int) poFeature->GetFID() );
if( !bSkipFailures )
{
OGRFeature::DestroyFeature( poFeature );
OGRFeature::DestroyFeature( poDstFeature );
return FALSE;
}
}
}
if( poDstFeature->GetGeometryRef() != NULL && bForceToPolygon )
{
poDstFeature->SetGeometryDirectly(
OGRGeometryFactory::forceToPolygon(
poDstFeature->StealGeometry() ) );
}
if( poDstFeature->GetGeometryRef() != NULL && bForceToMultiPolygon )
{
poDstFeature->SetGeometryDirectly(
OGRGeometryFactory::forceToMultiPolygon(
poDstFeature->StealGeometry() ) );
}
OGRFeature::DestroyFeature( poFeature );
CPLErrorReset();
if( poDstLayer->CreateFeature( poDstFeature ) != OGRERR_NONE
&& !bSkipFailures )
{
if( nGroupTransactions )
poDstLayer->RollbackTransaction();
OGRFeature::DestroyFeature( poDstFeature );
return FALSE;
}
OGRFeature::DestroyFeature( poDstFeature );
}
if( nGroupTransactions )
poDstLayer->CommitTransaction();
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -