Skip to content

Commit bd6d1f6

Browse files
authored
Merge pull request #3312 from mloskot/ml/geopackage-fix-undefined-srs-id-writing
GeoPackage: Fix handling of invalid SRS ID when writing
2 parents ac646f8 + 69aebed commit bd6d1f6

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

autotest/ogr/ogr_gpkg.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1601,6 +1601,79 @@ def test_ogr_gpkg_srs_non_consistent_with_official_definition():
16011601
gdal.Unlink('/vsimem/ogr_gpkg_20.gpkg')
16021602

16031603

1604+
def test_ogr_gpkg_write_srs_undefined_geographic():
1605+
1606+
gdal.Unlink('tmp/ogr_gpkg_srs_undefined_geographic.gpkg')
1607+
1608+
gpkg_ds = gdaltest.gpkg_dr.CreateDataSource('tmp/ogr_gpkg_srs_undefined_geographic.gpkg')
1609+
assert gpkg_ds is not None
1610+
1611+
# Check initial default SRS entries in gpkg_spatial_ref_sys
1612+
sql_lyr = gpkg_ds.ExecuteSQL("SELECT COUNT(*) FROM gpkg_spatial_ref_sys")
1613+
gpkg_spatial_ref_sys_total = sql_lyr.GetNextFeature().GetField(0)
1614+
assert gpkg_spatial_ref_sys_total == 3 # entries with SRS IDs: -1, 0, 4326
1615+
gpkg_ds.ReleaseResultSet(sql_lyr)
1616+
1617+
srs= osr.SpatialReference()
1618+
srs.SetFromUserInput('GEOGCS["Undefined geographic SRS",DATUM["unknown",SPHEROID["unknown",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST]]')
1619+
lyr = gpkg_ds.CreateLayer('srs_test_geographic_layer', geom_type=ogr.wkbPoint, srs=srs)
1620+
srs_wkt = lyr.GetSpatialRef().ExportToWkt()
1621+
assert srs_wkt.find('Undefined geographic SRS') >= 0, srs_wkt
1622+
assert lyr.GetSpatialRef().IsGeographic()
1623+
1624+
gpkg_ds = None
1625+
gpkg_ds = ogr.Open('tmp/ogr_gpkg_srs_undefined_geographic.gpkg')
1626+
1627+
# Check no new SRS entries have been inserted into gpkg_spatial_ref_sys
1628+
sql_lyr = gpkg_ds.ExecuteSQL("SELECT COUNT(*) FROM gpkg_spatial_ref_sys")
1629+
assert gpkg_spatial_ref_sys_total == sql_lyr.GetNextFeature().GetField(0)
1630+
gpkg_ds.ReleaseResultSet(sql_lyr)
1631+
1632+
lyr = gpkg_ds.GetLayer(0)
1633+
srs_wkt = lyr.GetSpatialRef().ExportToWkt()
1634+
assert srs_wkt.find('Undefined geographic SRS') >= 0, srs_wkt
1635+
assert lyr.GetSpatialRef().IsGeographic()
1636+
1637+
gpkg_ds = None
1638+
gdal.Unlink('tmp/ogr_gpkg_srs_undefined_geographic.gpkg')
1639+
1640+
1641+
def test_ogr_gpkg_write_srs_undefined_cartesian():
1642+
1643+
gdal.Unlink('tmp/ogr_gpkg_srs_cartesian.gpkg')
1644+
1645+
gpkg_ds = gdaltest.gpkg_dr.CreateDataSource('tmp/ogr_gpkg_srs_cartesian.gpkg')
1646+
assert gpkg_ds is not None
1647+
1648+
# Check initial default SRS entries in gpkg_spatial_ref_sys
1649+
sql_lyr = gpkg_ds.ExecuteSQL("SELECT COUNT(*) FROM gpkg_spatial_ref_sys")
1650+
gpkg_spatial_ref_sys_total = sql_lyr.GetNextFeature().GetField(0)
1651+
assert gpkg_spatial_ref_sys_total == 3 # SRS with IDs: -1, 0, 4326
1652+
gpkg_ds.ReleaseResultSet(sql_lyr)
1653+
1654+
srs= osr.SpatialReference()
1655+
srs.SetFromUserInput('LOCAL_CS["Undefined cartesian SRS"]')
1656+
lyr = gpkg_ds.CreateLayer('srs_test_cartesian_layer', geom_type=ogr.wkbPoint, srs=srs)
1657+
srs_wkt = lyr.GetSpatialRef().ExportToWkt()
1658+
assert srs_wkt.find('Undefined cartesian SRS') >= 0
1659+
assert lyr.GetSpatialRef().IsLocal()
1660+
1661+
gpkg_ds = None
1662+
gpkg_ds = ogr.Open('tmp/ogr_gpkg_srs_cartesian.gpkg')
1663+
1664+
# Check no new SRS entries have been inserted into gpkg_spatial_ref_sys
1665+
sql_lyr = gpkg_ds.ExecuteSQL("SELECT COUNT(*) FROM gpkg_spatial_ref_sys")
1666+
assert gpkg_spatial_ref_sys_total == sql_lyr.GetNextFeature().GetField(0)
1667+
gpkg_ds.ReleaseResultSet(sql_lyr)
1668+
1669+
lyr = gpkg_ds.GetLayer(0)
1670+
srs_wkt = lyr.GetSpatialRef().ExportToWkt()
1671+
assert srs_wkt.find('Undefined cartesian SRS') >= 0, srs_wkt
1672+
assert lyr.GetSpatialRef().IsLocal()
1673+
1674+
gpkg_ds = None
1675+
gdal.Unlink('tmp/ogr_gpkg_srs_cartesian.gpkg')
1676+
16041677
###############################################################################
16051678
# Test maximum width of text fields
16061679

gdal/ogr/ogrsf_frmts/gpkg/ogrgeopackagedatasource.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ OGRSpatialReference* GDALGeoPackageDataset::GetSpatialRef(int iSrsId,
351351
OGRSpatialReference *poSpatialRef = new OGRSpatialReference();
352352
poSpatialRef->SetAxisMappingStrategy( OAMS_TRADITIONAL_GIS_ORDER );
353353

354+
// See corresponding tests in GDALGeoPackageDataset::GetSrsId
354355
if( iSrsId == 0)
355356
{
356357
poSpatialRef->SetGeogCS("Undefined geographic SRS",
@@ -575,6 +576,20 @@ int GDALGeoPackageDataset::GetSrsId(const OGRSpatialReference& oSRS)
575576
{
576577
std::unique_ptr<OGRSpatialReference> poSRS(oSRS.Clone());
577578

579+
if (poSRS->IsGeographic() || poSRS->IsLocal())
580+
{
581+
// See corresponding tests in GDALGeoPackageDataset::GetSpatialRef
582+
const char* pszName = poSRS->GetName();
583+
if ( pszName != nullptr && strlen(pszName) > 0 )
584+
{
585+
if (EQUAL(pszName, "Undefined geographic SRS"))
586+
return 0;
587+
588+
if (EQUAL(pszName, "Undefined cartesian SRS"))
589+
return -1;
590+
}
591+
}
592+
578593
const char* pszAuthorityName = poSRS->GetAuthorityName( nullptr );
579594

580595
if ( pszAuthorityName == nullptr || strlen(pszAuthorityName) == 0 )

0 commit comments

Comments
 (0)