Skip to content

Commit a046e03

Browse files
committed
GMLAS: add support for gml:TimeInstantType
Refs #13120
1 parent a3eeadd commit a046e03

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

autotest/ogr/ogr_gmlas.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3534,3 +3534,35 @@ def test_ogr_gmlas_citygml_lod2_no_schema_location():
35343534
pytest.skip(f"cannot open {url}")
35353535

35363536
assert ds.GetLayerCount() == 1537
3537+
3538+
3539+
###############################################################################
3540+
3541+
3542+
@pytest.mark.require_curl()
3543+
def test_ogr_gmlas_datetime(tmp_vsimem):
3544+
3545+
ds = ogr.Open("GMLAS:data/gml/datetime.gml")
3546+
lyr = ds.GetLayer("test")
3547+
f = lyr.GetNextFeature()
3548+
lyr_defn = lyr.GetLayerDefn()
3549+
assert (
3550+
lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex("time")).GetType() == ogr.OFTTime
3551+
)
3552+
assert f["time"] == "23:59:60"
3553+
assert (
3554+
lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex("date")).GetType() == ogr.OFTDate
3555+
)
3556+
assert f["date"] == "9999/12/31"
3557+
assert (
3558+
lyr_defn.GetFieldDefn(lyr_defn.GetFieldIndex("datetime")).GetType()
3559+
== ogr.OFTDateTime
3560+
)
3561+
assert f["datetime"] == "9999/12/31 23:59:60.999"
3562+
assert (
3563+
lyr_defn.GetFieldDefn(
3564+
lyr_defn.GetFieldIndex("dtintimeposition_timeposition")
3565+
).GetType()
3566+
== ogr.OFTDateTime
3567+
)
3568+
assert f["dtintimeposition_timeposition"] == "9999/12/31 23:59:60.999"

ogr/ogrsf_frmts/gmlas/ogr_gmlas_consts.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ STRING_CONST(szXS_GYEAR, "gYear");
268268
STRING_CONST(szXS_GYEAR_MONTH, "gYearMonth");
269269
STRING_CONST(szXS_TIME, "time");
270270
STRING_CONST(szXS_DATETIME, "dateTime");
271+
STRING_CONST(szXS_TIME_INSTANT_TYPE, "TimeInstantType");
271272
STRING_CONST(szXS_ANY_URI, "anyURI");
272273
STRING_CONST(szXS_ANY_TYPE, "anyType");
273274
STRING_CONST(szXS_ANY_SIMPLE_TYPE, "anySimpleType");

ogr/ogrsf_frmts/gmlas/ogrgmlasschemaanalyzer.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3344,9 +3344,19 @@ bool GMLASSchemaAnalyzer::ExploreModelGroup(
33443344

33453345
const std::vector<GMLASField> &osNestedClassFields =
33463346
oNestedClass.GetFields();
3347+
const bool bIsTimeInstantType =
3348+
transcode(poTypeDef->getName()) ==
3349+
szXS_TIME_INSTANT_TYPE;
33473350
for (size_t j = 0; j < osNestedClassFields.size(); j++)
33483351
{
33493352
GMLASField oField(osNestedClassFields[j]);
3353+
if (bIsTimeInstantType &&
3354+
oField.GetType() == GMLAS_FT_ANYSIMPLETYPE &&
3355+
oField.GetName() == "timePosition")
3356+
{
3357+
oField.SetType(GMLAS_FT_DATETIME,
3358+
szXS_DATETIME);
3359+
}
33503360
oField.SetName(osPrefixedEltName + "_" +
33513361
oField.GetName());
33523362
if (nMinOccurs == 0 ||
@@ -3356,6 +3366,7 @@ bool GMLASSchemaAnalyzer::ExploreModelGroup(
33563366
oField.SetMinOccurs(0);
33573367
oField.SetNotNullable(false);
33583368
}
3369+
33593370
aoFields.push_back(std::move(oField));
33603371
}
33613372

0 commit comments

Comments
 (0)