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: 2024-11-21 22:18:42 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        3141 : GDBGridSettingsToOGR(const CPLXMLNode *psSpatialReference)
      28             : {
      29        3141 :     OGRGeomCoordinatePrecision oCoordPrec;
      30             :     const char *pszXYScale =
      31        3141 :         CPLGetXMLValue(psSpatialReference, "XYScale", nullptr);
      32        3141 :     if (pszXYScale && CPLAtof(pszXYScale) > 0)
      33             :     {
      34        3141 :         oCoordPrec.dfXYResolution = 1.0 / CPLAtof(pszXYScale);
      35             :     }
      36             :     const char *pszZScale =
      37        3141 :         CPLGetXMLValue(psSpatialReference, "ZScale", nullptr);
      38        3141 :     if (pszZScale && CPLAtof(pszZScale) > 0)
      39             :     {
      40        3139 :         oCoordPrec.dfZResolution = 1.0 / CPLAtof(pszZScale);
      41             :     }
      42             :     const char *pszMScale =
      43        3141 :         CPLGetXMLValue(psSpatialReference, "MScale", nullptr);
      44        3141 :     if (pszMScale && CPLAtof(pszMScale) > 0)
      45             :     {
      46         656 :         oCoordPrec.dfMResolution = 1.0 / CPLAtof(pszMScale);
      47             :     }
      48             : 
      49        6282 :     CPLStringList aosSpecificOptions;
      50       38992 :     for (const CPLXMLNode *psChild = psSpatialReference->psChild; psChild;
      51       35851 :          psChild = psChild->psNext)
      52             :     {
      53       35851 :         if (psChild->eType == CXT_Element &&
      54             :             // The 3 below values are only generated by the FileGDB SDK
      55       32710 :             !EQUAL(psChild->pszValue, "WKID") &&
      56       29973 :             !EQUAL(psChild->pszValue, "LatestWKID") &&
      57       29863 :             !EQUAL(psChild->pszValue, "WKT"))
      58             :         {
      59       27142 :             const char *pszValue = CPLGetXMLValue(psChild, "", "");
      60       27142 :             if (CPLGetValueType(pszValue) == CPL_VALUE_REAL)
      61        7042 :                 pszValue = CPLSPrintf("%.15g", CPLAtof(pszValue));
      62       27142 :             aosSpecificOptions.SetNameValue(psChild->pszValue, pszValue);
      63             :         }
      64             :     }
      65        6282 :     oCoordPrec.oFormatSpecificOptions["FileGeodatabase"] =
      66        6282 :         std::move(aosSpecificOptions);
      67        6282 :     return oCoordPrec;
      68             : }
      69             : 
      70             : #endif /* FILEGDB_COORDPREC_READ_H */

Generated by: LCOV version 1.14