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 */