Skip to content

Commit 2cdade2

Browse files
authored
Merge pull request #13514 from rouault/fix_13512
gdal vector buffer: automatically set output geometry field type to MultiPolygon
2 parents 94d0b23 + d4e74ff commit 2cdade2

File tree

2 files changed

+49
-16
lines changed

2 files changed

+49
-16
lines changed

apps/gdalalg_vector_buffer.cpp

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,18 @@ class GDALVectorBufferAlgorithmLayer final
7272
GDALVectorBufferAlgorithmLayer(
7373
OGRLayer &oSrcLayer, const GDALVectorBufferAlgorithm::Options &opts)
7474
: GDALVectorGeomOneToOneAlgorithmLayer<GDALVectorBufferAlgorithm>(
75-
oSrcLayer, opts)
75+
oSrcLayer, opts),
76+
m_poFeatureDefn(oSrcLayer.GetLayerDefn()->Clone())
7677
{
78+
m_poFeatureDefn->Reference();
79+
for (int i = 0; i < m_poFeatureDefn->GetGeomFieldCount(); ++i)
80+
{
81+
if (IsSelectedGeomField(i))
82+
{
83+
m_poFeatureDefn->GetGeomFieldDefn(i)->SetType(wkbMultiPolygon);
84+
}
85+
}
86+
7787
m_aosBufferOptions.SetNameValue("ENDCAP_STYLE",
7888
opts.m_endCapStyle.c_str());
7989
m_aosBufferOptions.SetNameValue("JOIN_STYLE", opts.m_joinStyle.c_str());
@@ -85,6 +95,16 @@ class GDALVectorBufferAlgorithmLayer final
8595
m_opts.m_side != "both" ? "YES" : "NO");
8696
}
8797

98+
~GDALVectorBufferAlgorithmLayer() override
99+
{
100+
m_poFeatureDefn->Release();
101+
}
102+
103+
const OGRFeatureDefn *GetLayerDefn() const override
104+
{
105+
return m_poFeatureDefn;
106+
}
107+
88108
protected:
89109
using GDALVectorGeomOneToOneAlgorithmLayer::TranslateFeature;
90110

@@ -93,6 +113,9 @@ class GDALVectorBufferAlgorithmLayer final
93113

94114
private:
95115
CPLStringList m_aosBufferOptions{};
116+
OGRFeatureDefn *const m_poFeatureDefn;
117+
118+
CPL_DISALLOW_COPY_ASSIGN(GDALVectorBufferAlgorithmLayer)
96119
};
97120

98121
/************************************************************************/
@@ -102,7 +125,7 @@ class GDALVectorBufferAlgorithmLayer final
102125
std::unique_ptr<OGRFeature> GDALVectorBufferAlgorithmLayer::TranslateFeature(
103126
std::unique_ptr<OGRFeature> poSrcFeature) const
104127
{
105-
const int nGeomFieldCount = poSrcFeature->GetGeomFieldCount();
128+
const int nGeomFieldCount = m_poFeatureDefn->GetGeomFieldCount();
106129
for (int i = 0; i < nGeomFieldCount; ++i)
107130
{
108131
if (IsSelectedGeomField(i))
@@ -114,15 +137,22 @@ std::unique_ptr<OGRFeature> GDALVectorBufferAlgorithmLayer::TranslateFeature(
114137
m_aosBufferOptions.List()));
115138
if (poGeom)
116139
{
117-
poGeom->assignSpatialReference(m_srcLayer.GetLayerDefn()
118-
->GetGeomFieldDefn(i)
119-
->GetSpatialRef());
120-
poSrcFeature->SetGeomField(i, std::move(poGeom));
140+
const auto poGeomFielDefn =
141+
m_poFeatureDefn->GetGeomFieldDefn(i);
142+
poGeom.reset(OGRGeometryFactory::forceTo(
143+
poGeom.release(), poGeomFielDefn->GetType()));
144+
if (poGeom)
145+
{
146+
poGeom->assignSpatialReference(
147+
poGeomFielDefn->GetSpatialRef());
148+
poSrcFeature->SetGeomField(i, std::move(poGeom));
149+
}
121150
}
122151
}
123152
}
124153
}
125154

155+
poSrcFeature->SetFDefnUnsafe(m_poFeatureDefn);
126156
return poSrcFeature;
127157
}
128158

autotest/utilities/test_gdalalg_vector_buffer.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,37 +29,37 @@ def get_alg():
2929
(
3030
"POINT (0 0)",
3131
{"distance": 1},
32-
"POLYGON ((1 0,0.98078528040323 -0.195090322016128,0.923879532511287 -0.38268343236509,0.831469612302545 -0.555570233019602,0.707106781186548 -0.707106781186547,0.555570233019602 -0.831469612302545,0.38268343236509 -0.923879532511287,0.195090322016128 -0.98078528040323,0 -1,-0.195090322016128 -0.98078528040323,-0.38268343236509 -0.923879532511287,-0.555570233019602 -0.831469612302545,-0.707106781186547 -0.707106781186548,-0.831469612302545 -0.555570233019602,-0.923879532511287 -0.38268343236509,-0.98078528040323 -0.195090322016129,-1 0,-0.98078528040323 0.195090322016128,-0.923879532511287 0.38268343236509,-0.831469612302545 0.555570233019602,-0.707106781186548 0.707106781186547,-0.555570233019602 0.831469612302545,-0.38268343236509 0.923879532511287,-0.195090322016129 0.98078528040323,0 1,0.195090322016128 0.98078528040323,0.38268343236509 0.923879532511287,0.555570233019602 0.831469612302545,0.707106781186547 0.707106781186548,0.831469612302545 0.555570233019602,0.923879532511287 0.38268343236509,0.98078528040323 0.195090322016129,1 0))",
32+
"MULTIPOLYGON (((1 0,0.98078528040323 -0.195090322016128,0.923879532511287 -0.38268343236509,0.831469612302545 -0.555570233019602,0.707106781186548 -0.707106781186547,0.555570233019602 -0.831469612302545,0.38268343236509 -0.923879532511287,0.195090322016128 -0.98078528040323,0 -1,-0.195090322016128 -0.98078528040323,-0.38268343236509 -0.923879532511287,-0.555570233019602 -0.831469612302545,-0.707106781186547 -0.707106781186548,-0.831469612302545 -0.555570233019602,-0.923879532511287 -0.38268343236509,-0.98078528040323 -0.195090322016129,-1 0,-0.98078528040323 0.195090322016128,-0.923879532511287 0.38268343236509,-0.831469612302545 0.555570233019602,-0.707106781186548 0.707106781186547,-0.555570233019602 0.831469612302545,-0.38268343236509 0.923879532511287,-0.195090322016129 0.98078528040323,0 1,0.195090322016128 0.98078528040323,0.38268343236509 0.923879532511287,0.555570233019602 0.831469612302545,0.707106781186547 0.707106781186548,0.831469612302545 0.555570233019602,0.923879532511287 0.38268343236509,0.98078528040323 0.195090322016129,1 0)))",
3333
),
3434
(
3535
"POINT (0 0)",
3636
{"distance": 1, "quadrant-segments": 2},
37-
"POLYGON ((1 0,0.707106781186548 -0.707106781186547,0 -1,-0.707106781186547 -0.707106781186548,-1 0,-0.707106781186548 0.707106781186547,0 1,0.707106781186547 0.707106781186548,1 0))",
37+
"MULTIPOLYGON (((1 0,0.707106781186548 -0.707106781186547,0 -1,-0.707106781186547 -0.707106781186548,-1 0,-0.707106781186548 0.707106781186547,0 1,0.707106781186547 0.707106781186548,1 0)))",
3838
),
3939
(
4040
"POINT (0 0)",
4141
{"distance": 1, "endcap-style": "square"},
42-
"POLYGON ((1 1,1 -1,-1 -1,-1 1,1 1))",
42+
"MULTIPOLYGON (((1 1,1 -1,-1 -1,-1 1,1 1)))",
4343
),
4444
(
4545
"LINESTRING (0 0,1 0,0 0.5)",
4646
{"distance": 1, "join-style": "mitre"},
47-
"POLYGON ((-0.963907618884737 0.250728515642601,-0.992147591195 0.374927391943886,-0.997484208812642 0.570889020090679,-0.964488067681204 0.764126422950408,-0.894427190999916 0.947213595499958,-0.789993978969049 1.11311460037472,-0.655201741360129 1.25545395499571,-0.495230468272109 1.36876163778967,-0.316227766016838 1.44868329805051,-0.125072608056114 1.492147591195,0.070889020090679 1.49748420881264,0.264126422950408 1.4644880676812,0.447213595499958 1.39442719099992,5.23606797749979 -1,0 -1,-0.195090322016129 -0.98078528040323,-0.38268343236509 -0.923879532511287,-0.555570233019602 -0.831469612302545,-0.707106781186548 -0.707106781186547,-0.831469612302545 -0.555570233019602,-0.923879532511287 -0.38268343236509,-0.98078528040323 -0.195090322016128,-1 0,-0.98078528040323 0.195090322016129,-0.963907618884737 0.250728515642601))",
47+
"MULTIPOLYGON (((-0.963907618884737 0.250728515642601,-0.992147591195 0.374927391943886,-0.997484208812642 0.570889020090679,-0.964488067681204 0.764126422950408,-0.894427190999916 0.947213595499958,-0.789993978969049 1.11311460037472,-0.655201741360129 1.25545395499571,-0.495230468272109 1.36876163778967,-0.316227766016838 1.44868329805051,-0.125072608056114 1.492147591195,0.070889020090679 1.49748420881264,0.264126422950408 1.4644880676812,0.447213595499958 1.39442719099992,5.23606797749979 -1,0 -1,-0.195090322016129 -0.98078528040323,-0.38268343236509 -0.923879532511287,-0.555570233019602 -0.831469612302545,-0.707106781186548 -0.707106781186547,-0.831469612302545 -0.555570233019602,-0.923879532511287 -0.38268343236509,-0.98078528040323 -0.195090322016128,-1 0,-0.98078528040323 0.195090322016129,-0.963907618884737 0.250728515642601)))",
4848
),
4949
(
5050
"LINESTRING (0 0,1 0,0 0.5)",
5151
{"distance": 1, "join-style": "mitre", "mitre-limit": 1},
52-
"POLYGON ((-0.963907618884737 0.250728515642601,-0.992147591195 0.374927391943886,-0.997484208812642 0.570889020090679,-0.964488067681204 0.764126422950408,-0.894427190999916 0.947213595499958,-0.789993978969049 1.11311460037472,-0.655201741360129 1.25545395499571,-0.495230468272109 1.36876163778967,-0.316227766016838 1.44868329805051,-0.125072608056114 1.492147591195,0.070889020090679 1.49748420881264,0.264126422950408 1.4644880676812,0.447213595499958 1.39442719099992,2.15507965968923 0.540494158905278,1.79141831924623 -1,0 -1,-0.195090322016129 -0.98078528040323,-0.38268343236509 -0.923879532511287,-0.555570233019602 -0.831469612302545,-0.707106781186548 -0.707106781186547,-0.831469612302545 -0.555570233019602,-0.923879532511287 -0.38268343236509,-0.98078528040323 -0.195090322016128,-1 0,-0.98078528040323 0.195090322016129,-0.963907618884737 0.250728515642601))",
52+
"MULTIPOLYGON (((-0.963907618884737 0.250728515642601,-0.992147591195 0.374927391943886,-0.997484208812642 0.570889020090679,-0.964488067681204 0.764126422950408,-0.894427190999916 0.947213595499958,-0.789993978969049 1.11311460037472,-0.655201741360129 1.25545395499571,-0.495230468272109 1.36876163778967,-0.316227766016838 1.44868329805051,-0.125072608056114 1.492147591195,0.070889020090679 1.49748420881264,0.264126422950408 1.4644880676812,0.447213595499958 1.39442719099992,2.15507965968923 0.540494158905278,1.79141831924623 -1,0 -1,-0.195090322016129 -0.98078528040323,-0.38268343236509 -0.923879532511287,-0.555570233019602 -0.831469612302545,-0.707106781186548 -0.707106781186547,-0.831469612302545 -0.555570233019602,-0.923879532511287 -0.38268343236509,-0.98078528040323 -0.195090322016128,-1 0,-0.98078528040323 0.195090322016129,-0.963907618884737 0.250728515642601)))",
5353
),
5454
(
5555
"LINESTRING (0 0,1 0)",
5656
{"distance": 1, "side": "left"},
57-
"POLYGON ((1 0,0 0,0 1,1 1,1 0))",
57+
"MULTIPOLYGON (((1 0,0 0,0 1,1 1,1 0)))",
5858
),
5959
(
60-
"LINESTRING (0 0,1 0)",
60+
"MULTILINESTRING ((0 0,1 0))",
6161
{"distance": 1, "side": "right"},
62-
"POLYGON ((0 0,1 0,1 -1,0 -1,0 0))",
62+
"MULTIPOLYGON (((0 0,1 0,1 -1,0 -1,0 0)))",
6363
),
6464
],
6565
ids=[
@@ -78,10 +78,11 @@ def test_gdalalg_vector_buffer(input_wkt, options, output_wkt):
7878
src_ds = gdal.GetDriverByName("MEM").Create("", 0, 0, 0, gdal.GDT_Unknown)
7979
srs = osr.SpatialReference()
8080
srs.ImportFromEPSG(32631)
81-
src_lyr = src_ds.CreateLayer("the_layer", srs=srs)
81+
geom = ogr.CreateGeometryFromWkt(input_wkt)
82+
src_lyr = src_ds.CreateLayer("the_layer", srs=srs, geom_type=geom.GetGeometryType())
8283

8384
f = ogr.Feature(src_lyr.GetLayerDefn())
84-
f.SetGeometry(ogr.CreateGeometryFromWkt(input_wkt))
85+
f.SetGeometry(geom)
8586
src_lyr.CreateFeature(f)
8687

8788
f = ogr.Feature(src_lyr.GetLayerDefn())
@@ -99,6 +100,8 @@ def test_gdalalg_vector_buffer(input_wkt, options, output_wkt):
99100
out_ds = alg["output"].GetDataset()
100101
out_lyr = out_ds.GetLayer(0)
101102
out_f = out_lyr.GetNextFeature()
103+
assert out_lyr.GetLayerDefn().IsSame(out_f.GetDefnRef())
104+
assert out_lyr.GetGeomType() == out_f.GetGeometryRef().GetGeometryType()
102105
# print(out_f.GetGeometryRef().ExportToIsoWkt())
103106
ogrtest.check_feature_geometry(out_f, output_wkt)
104107
assert (

0 commit comments

Comments
 (0)