@@ -47,11 +47,7 @@ GDALVectorCreateAlgorithm::GDALVectorCreateAlgorithm(bool standaloneStep)
4747 // Note: this is required despite SetAddDefaultArguments(false)
4848 .SetAddUpsertArgument(false )
4949 .SetAddSkipErrorsArgument(false )
50- .SetAddAppendLayerArgument(false )
51-
52- ),
53- m_crs(), m_geometryType(), m_geometryFieldName(" geom" ),
54- m_schemaJsonOrPath(), m_fieldDefinitions(), m_fieldStrDefinitions()
50+ .SetAddAppendLayerArgument(false ))
5551{
5652
5753 AddVectorInputArgs (false );
@@ -63,16 +59,17 @@ GDALVectorCreateAlgorithm::GDALVectorCreateAlgorithm(bool standaloneStep)
6359 auto &geomFieldNameArg =
6460 AddArg (" geometry-field" , 0 ,
6561 _ (" Name of the geometry field to create (if supported by the "
66- " output "
67- " format)" ),
62+ " output format)" ),
6863 &m_geometryFieldName)
6964 .SetMetaVar (" GEOMETRY-FIELD" )
70- .SetDefault (" geom " );
65+ .SetDefault (m_geometryFieldName );
7166
7267 AddArg (" crs" , 0 , _ (" Set CRS" ), &m_crs)
7368 .AddHiddenAlias (" srs" )
7469 .SetIsCRSArg (/* noneAllowed=*/ false );
7570
71+ AddArg (" fid" , 0 , _ (" FID column name" ), &m_fidColumnName);
72+
7673 constexpr auto inputMutexGroup = " like-schema-field" ;
7774
7875 // Apply mutex to GDAL_ARG_NAME_INPUT
@@ -104,19 +101,12 @@ GDALVectorCreateAlgorithm::GDALVectorCreateAlgorithm(bool standaloneStep)
104101 ((!m_geometryFieldName.empty () &&
105102 geomFieldNameArg.IsExplicitlySet ()) ||
106103 !m_geometryType.empty () || !m_fieldDefinitions.empty () ||
107- !m_crs.empty ()))
104+ !m_crs.empty () || !m_fidColumnName. empty () ))
108105 {
109106 ReportError (CE_Failure, CPLE_AppDefined,
110107 " When --schema or --like is specified, "
111- " --geometry-field, --geometry-type, "
112- " --field and --crs options must not be specified." );
113- return false ;
114- }
115- if (!m_geometryType.empty () && m_crs.empty ())
116- {
117- ReportError (CE_Failure, CPLE_AppDefined,
118- " When --geometry-type is specified, --crs must "
119- " also be specified" );
108+ " --geometry-field, --geometry-type, --field, "
109+ " --crs and --fid options must not be specified." );
120110 return false ;
121111 }
122112 return true ;
@@ -131,8 +121,9 @@ bool GDALVectorCreateAlgorithm::RunStep(GDALPipelineStepRunContext &)
131121{
132122
133123 const std::string &datasetName = m_outputDataset.GetName ();
134- auto outputLayerName =
135- m_outputLayerName.empty () ? datasetName : m_outputLayerName;
124+ const std::string outputLayerName =
125+ m_outputLayerName.empty () ? CPLGetBasenameSafe (datasetName.c_str ())
126+ : m_outputLayerName;
136127
137128 std::unique_ptr<GDALDataset> poDstDS;
138129 poDstDS.reset (GDALDataset::Open (datasetName.c_str (),
@@ -265,13 +256,6 @@ bool GDALVectorCreateAlgorithm::RunStep(GDALPipelineStepRunContext &)
265256 return false ;
266257 }
267258
268- if (EQUAL (poDstDriver->GetDescription (), " ESRI Shapefile" ) &&
269- EQUAL (CPLGetExtensionSafe (poDstDS->GetDescription ()).c_str (), " shp" ) &&
270- poDstDS->GetLayerCount () <= 1 )
271- {
272- outputLayerName = CPLGetBasenameSafe (outputLayerName.c_str ());
273- }
274-
275259 // An OGR_SCHEMA has been provided
276260 if (!oSchemaOverride.GetLayerOverrides ().empty ())
277261 {
@@ -353,6 +337,7 @@ bool GDALVectorCreateAlgorithm::RunStep(GDALPipelineStepRunContext &)
353337 : userSpecifiedNewName;
354338
355339 if (!CreateLayer (poDstDS.get (), outputLayerNewName,
340+ oLayerOverride.GetFIDColumnName (),
356341 oLayerOverride.GetFieldDefinitions (),
357342 oLayerOverride.GetGeomFieldDefinitions ()))
358343 {
@@ -370,7 +355,8 @@ bool GDALVectorCreateAlgorithm::RunStep(GDALPipelineStepRunContext &)
370355 {
371356 const OGRwkbGeometryType eDstType =
372357 OGRFromOGCGeomType (m_geometryType.c_str ());
373- if (eDstType == wkbUnknown)
358+ if (eDstType == wkbUnknown &&
359+ !STARTS_WITH_CI (m_geometryType.c_str (), " GEOMETRY" ))
374360 {
375361 ReportError (CE_Failure, CPLE_AppDefined,
376362 " Unsupported geometry type: '%s'." ,
@@ -403,16 +389,8 @@ bool GDALVectorCreateAlgorithm::RunStep(GDALPipelineStepRunContext &)
403389 }
404390 }
405391
406- if (EQUAL (poDstDriver->GetDescription (), " ESRI Shapefile" ) &&
407- EQUAL (CPLGetExtensionSafe (poDstDS->GetDescription ()).c_str (),
408- " shp" ) &&
409- poDstDS->GetLayerCount () <= 1 )
410- {
411- outputLayerName = CPLGetBasenameSafe (poDstDS->GetDescription ());
412- }
413-
414- if (!CreateLayer (poDstDS.get (), outputLayerName, GetOutputFields (),
415- geometryFieldDefinitions))
392+ if (!CreateLayer (poDstDS.get (), outputLayerName, m_fidColumnName,
393+ GetOutputFields (), geometryFieldDefinitions))
416394 {
417395 ReportError (CE_Failure, CPLE_AppDefined,
418396 " Cannot create layer '%s'." , outputLayerName.c_str ());
@@ -452,6 +430,7 @@ std::vector<OGRFieldDefn> GDALVectorCreateAlgorithm::GetOutputFields() const
452430/* ***********************************************************************/
453431bool GDALVectorCreateAlgorithm::CreateLayer (
454432 GDALDataset *poDstDS, const std::string &layerName,
433+ const std::string &fidColumnName,
455434 const std::vector<OGRFieldDefn> &fieldDefinitions,
456435 const std::vector<OGRGeomFieldDefn> &geometryFieldDefinitions) const
457436{
@@ -517,10 +496,19 @@ bool GDALVectorCreateAlgorithm::CreateLayer(
517496
518497 if (!poDstLayer)
519498 {
520-
521- poDstLayer = poDstDS->CreateLayer (
522- layerName.c_str (), poGeomFieldDefn.get (),
523- CPLStringList (GetLayerCreationOptions ()).List ());
499+ CPLStringList aosCreationOptions (GetLayerCreationOptions ());
500+ if (aosCreationOptions.FetchNameValue (" FID" ) == nullptr &&
501+ !fidColumnName.empty ())
502+ {
503+ auto poDstDriver = poDstDS->GetDriver ();
504+ if (poDstDriver && poDstDriver->HasLayerCreationOption (" FID" ))
505+ {
506+ aosCreationOptions.SetNameValue (" FID" , fidColumnName.c_str ());
507+ }
508+ }
509+ poDstLayer =
510+ poDstDS->CreateLayer (layerName.c_str (), poGeomFieldDefn.get (),
511+ aosCreationOptions.List ());
524512 }
525513
526514 if (!poDstLayer)
0 commit comments