LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/openfilegdb - filegdb_coordprec_read.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 25 25 100.0 %
Date: 2025-02-20 10:14:44 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  OpenGIS Simple Features Reference Implementation
       4             :  * Purpose:  Implements Open FileGDB OGR driver.
       5             :  * Author:   Even Rouault, <even dot rouault at spatialys.com>
       6             :  *
       7             :  ******************************************************************************
       8             :  * Copyright (c) 2024, Even Rouault <even dot rouault at spatialys.com>
       9             :  *
      10             :  * SPDX-License-Identifier: MIT
      11             :  ****************************************************************************/
      12             : 
      13             : #ifndef FILEGDB_COORDPREC_READ_H
      14             : #define FILEGDB_COORDPREC_READ_H
      15             : 
      16             : #include "cpl_minixml.h"
      17             : 
      18             : #include "ogr_geomcoordinateprecision.h"
      19             : 
      20             : /*************************************************************************/
      21             : /*                      GDBGridSettingsToOGR()                           */
      22             : /*************************************************************************/
      23             : 
      24             : /** Fill OGRGeomCoordinatePrecision from XML "psSpatialReference" node.
      25             :  */
      26             : static OGRGeomCoordinatePrecision
      27        2875 : GDBGridSettingsToOGR(const CPLXMLNode *psSpatialReference)
      28             : {
      29        2875 :     OGRGeomCoordinatePrecision oCoordPrec;
      30             :     const char *pszXYScale =
      31        2875 :         CPLGetXMLValue(psSpatialReference, "XYScale", nullptr);
      32        2875 :     if (pszXYScale && CPLAtof(pszXYScale) > 0)
      33             :     {
      34        2875 :         oCoordPrec.dfXYResolution = 1.0 / CPLAtof(pszXYScale);
      35             :     }
      36             :     const char *pszZScale =
      37        2875 :         CPLGetXMLValue(psSpatialReference, "ZScale", nullptr);
      38        2875 :     if (pszZScale && CPLAtof(pszZScale) > 0)
      39             :     {
      40        2873 :         oCoordPrec.dfZResolution = 1.0 / CPLAtof(pszZScale);
      41             :     }
      42             :     const char *pszMScale =
      43        2875 :         CPLGetXMLValue(psSpatialReference, "MScale", nullptr);
      44        2875 :     if (pszMScale && CPLAtof(pszMScale) > 0)
      45             :     {
      46         390 :         oCoordPrec.dfMResolution = 1.0 / CPLAtof(pszMScale);
      47             :     }
      48             : 
      49        5750 :     CPLStringList aosSpecificOptions;
      50       35030 :     for (const CPLXMLNode *psChild = psSpatialReference->psChild; psChild;
      51       32155 :          psChild = psChild->psNext)
      52             :     {
      53       32155 :         if (psChild->eType == CXT_Element &&
      54             :             // The 3 below values are only generated by the FileGDB SDK
      55       29280 :             !EQUAL(psChild->pszValue, "WKID") &&
      56       26802 :             !EQUAL(psChild->pszValue, "LatestWKID") &&
      57       26685 :             !EQUAL(psChild->pszValue, "WKT"))
      58             :         {
      59       24216 :             const char *pszValue = CPLGetXMLValue(psChild, "", "");
      60       24216 :             if (CPLGetValueType(pszValue) == CPL_VALUE_REAL)
      61        6236 :                 pszValue = CPLSPrintf("%.15g", CPLAtof(pszValue));
      62       24216 :             aosSpecificOptions.SetNameValue(psChild->pszValue, pszValue);
      63             :         }
      64             :     }
      65        5750 :     oCoordPrec.oFormatSpecificOptions["FileGeodatabase"] =
      66        5750 :         std::move(aosSpecificOptions);
      67        5750 :     return oCoordPrec;
      68             : }
      69             : 
      70             : #endif /* FILEGDB_COORDPREC_READ_H */

Generated by: LCOV version 1.14