Skip to content

Commit

Permalink
CSV layer: when the .csvt indicates WKT and in default KEEP_GEOM_COLU…
Browse files Browse the repository at this point in the history
…MNS=YES mode, prefix the geometry field name with 'geom_'
  • Loading branch information
rouault committed Feb 16, 2022
1 parent 8930419 commit d60e711
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 11 deletions.
15 changes: 8 additions & 7 deletions autotest/ogr/ogr_csv.py
Original file line number Diff line number Diff line change
Expand Up @@ -1507,7 +1507,7 @@ def test_ogr_csv_38():

ds = ogr.Open('/vsimem/ogr_csv_38.csv')
lyr = ds.GetLayer(0)
assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetName() == 'mygeom'
assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetName() == 'geom_mygeom'
assert lyr.GetLayerDefn().GetGeomFieldDefn(0).GetSpatialRef().ExportToWkt().find('4326') >= 0
f = lyr.GetNextFeature()
if f.GetGeometryRef().ExportToWkt() != 'POINT (2 49)':
Expand Down Expand Up @@ -1630,7 +1630,8 @@ def test_ogr_csv_42():

def test_ogr_csv_43():

ds = ogr.GetDriverByName('CSV').CreateDataSource('/vsimem/ogr_csv_43.csv')
filename = '/vsimem/ogr_csv_43.csv'
ds = ogr.GetDriverByName('CSV').CreateDataSource(filename)
lyr = ds.CreateLayer('ogr_csv_43', options=['GEOMETRY=AS_WKT', 'CREATE_CSVT=YES'])
lyr.CreateField(ogr.FieldDefn('id', ogr.OFTInteger))
f = ogr.Feature(lyr.GetLayerDefn())
Expand Down Expand Up @@ -1689,7 +1690,7 @@ def test_ogr_csv_43():

ds = None

ds = ogr.Open('/vsimem/ogr_csv_43.csv', update=1)
ds = ogr.Open(filename, update=1)
lyr = ds.GetLayer(0)
f = lyr.GetFeature(2)
if f['id'] != 2 or f['foo'] != 'baz' or f.GetGeometryRef().ExportToWkt() != 'POINT (3 50)':
Expand Down Expand Up @@ -1724,7 +1725,7 @@ def test_ogr_csv_43():
f = None
ds = None

ds = ogr.Open('/vsimem/ogr_csv_43.csv', update=1)
ds = ogr.Open(filename, update=1)
lyr = ds.GetLayer(0)
f = lyr.GetFeature(2)
if f['id'] != 3:
Expand Down Expand Up @@ -1790,7 +1791,7 @@ def test_ogr_csv_43():
f = None
ds = None

ds = ogr.Open('/vsimem/ogr_csv_43.csv', update=1)
ds = ogr.Open(filename, update=1)
lyr = ds.GetLayer(0)
f = lyr.GetFeature(2)
if f['WKT'] != 'POINT (1 2)' or f['_WKT_2'] != 'POINT (3 4)':
Expand All @@ -1803,8 +1804,8 @@ def test_ogr_csv_43():
assert lyr.DeleteFeature(2) == ogr.OGRERR_NON_EXISTING_FEATURE
ds = None

gdal.Unlink('/vsimem/ogr_csv_43.csv')
gdal.Unlink('/vsimem/ogr_csv_43.csvt')
gdal.Unlink(filename)
gdal.Unlink(filename + 't')

###############################################################################
# Test seeking back while creating
Expand Down
9 changes: 6 additions & 3 deletions ogr/ogrsf_frmts/csv/ogrcsvdatasource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ OGRErr OGRCSVEditableLayerSynchronizer::EditableSyncToDisk(
if( m_poCSVLayer->GetGeometryFormat() == OGR_CSV_GEOM_AS_WKT )
poCSVTmpLayer->SetWriteGeometry(wkbNone, OGR_CSV_GEOM_AS_WKT, nullptr);

const bool bKeepGeomColmuns = CPLFetchBool(m_papszOpenOptions, "KEEP_GEOM_COLUMNS", true);

OGRErr eErr = OGRERR_NONE;
OGRFeatureDefn *poEditableFDefn = poEditableLayer->GetLayerDefn();
for( int i = 0; eErr == OGRERR_NONE && i < poEditableFDefn->GetFieldCount();
Expand All @@ -121,8 +123,9 @@ OGRErr OGRCSVEditableLayerSynchronizer::EditableSyncToDisk(
int iGeomFieldIdx = 0;
if( (EQUAL(oFieldDefn.GetNameRef(), "WKT") &&
(iGeomFieldIdx = poEditableFDefn->GetGeomFieldIndex("")) >= 0) ||
(iGeomFieldIdx = poEditableFDefn->GetGeomFieldIndex(
oFieldDefn.GetNameRef())) >= 0 )
(bKeepGeomColmuns &&
(iGeomFieldIdx = poEditableFDefn->GetGeomFieldIndex(
(std::string("geom_") + oFieldDefn.GetNameRef()).c_str())) >= 0) )
{
OGRGeomFieldDefn oGeomFieldDefn(
poEditableFDefn->GetGeomFieldDefn(iGeomFieldIdx));
Expand All @@ -137,7 +140,7 @@ OGRErr OGRCSVEditableLayerSynchronizer::EditableSyncToDisk(
const bool bHasXY = !m_poCSVLayer->GetXField().empty() &&
!m_poCSVLayer->GetYField().empty();
const bool bHasZ = !m_poCSVLayer->GetZField().empty();
if( bHasXY && !CPLFetchBool(m_papszOpenOptions, "KEEP_GEOM_COLUMNS", true) )
if( bHasXY && !bKeepGeomColmuns )
{
if( poCSVTmpLayer->GetLayerDefn()->GetFieldIndex(
m_poCSVLayer->GetXField()) < 0 )
Expand Down
6 changes: 5 additions & 1 deletion ogr/ogrsf_frmts/csv/ogrcsvlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -483,7 +483,11 @@ void OGRCSVLayer::BuildFeatureDefn( const char *pszNfdcGeomField,

eGeometryFormat = OGR_CSV_GEOM_AS_WKT;
panGeomFieldIndex[iField] = poFeatureDefn->GetGeomFieldCount();
OGRGeomFieldDefn oGeomFieldDefn(oField.GetNameRef(),
std::string osGeomColName;
if( bKeepGeomColumns )
osGeomColName += "geom_";
osGeomColName += oField.GetNameRef();
OGRGeomFieldDefn oGeomFieldDefn(osGeomColName.c_str(),
wkbUnknown);
poFeatureDefn->AddGeomFieldDefn(&oGeomFieldDefn);
continue;
Expand Down

0 comments on commit d60e711

Please sign in to comment.