Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: PCRaster Integration 4 : * Purpose: PCRaster driver support declarations. 5 : * Author: Kor de Jong, Oliver Schmitz 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) PCRaster owners 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #ifndef INCLUDED_PCRASTERUTIL 14 : #define INCLUDED_PCRASTERUTIL 15 : 16 : #include "csf.h" 17 : #include "gdal_priv.h" 18 : #include "pcrtypes.h" 19 : 20 : GDALDataType cellRepresentation2GDALType(CSF_CR cellRepresentation); 21 : 22 : CSF_VS string2ValueScale(const std::string &string); 23 : 24 : std::string valueScale2String(CSF_VS valueScale); 25 : 26 : std::string cellRepresentation2String(CSF_CR cellRepresentation); 27 : 28 : CSF_VS GDALType2ValueScale(GDALDataType type); 29 : 30 : /* 31 : CSF_CR string2PCRasterCellRepresentation( 32 : const std::string& string); 33 : */ 34 : 35 : CSF_CR GDALType2CellRepresentation(GDALDataType type, bool exact); 36 : 37 : void *createBuffer(size_t size, CSF_CR type); 38 : 39 : void deleteBuffer(void *buffer, CSF_CR type); 40 : 41 : bool isContinuous(CSF_VS valueScale); 42 : 43 : double missingValue(CSF_CR type); 44 : 45 : void alterFromStdMV(void *buffer, size_t size, CSF_CR cellRepresentation, 46 : double missingValue); 47 : 48 : void alterToStdMV(void *buffer, size_t size, CSF_CR cellRepresentation, 49 : double missingValue); 50 : 51 : MAP *mapOpen(std::string const &filename, MOPEN_PERM mode); 52 : 53 : CSF_VS fitValueScale(CSF_VS valueScale, CSF_CR cellRepresentation); 54 : 55 : void castValuesToBooleanRange(void *buffer, size_t size, 56 : CSF_CR cellRepresentation); 57 : 58 : void castValuesToDirectionRange(void *buffer, size_t size); 59 : 60 : void castValuesToLddRange(void *buffer, size_t size); 61 : 62 : template <typename T> struct CastToBooleanRange 63 : { 64 0 : void operator()(T &value) const 65 : { 66 0 : if (!pcr::isMV(value)) 67 : { 68 0 : if (value != 0) 69 : { 70 0 : value = T(value > T(0)); 71 : } 72 : else 73 : { 74 0 : pcr::setMV(value); 75 : } 76 : } 77 0 : } 78 : }; 79 : 80 : template <> struct CastToBooleanRange<UINT1> 81 : { 82 100 : void operator()(UINT1 &value) const 83 : { 84 100 : if (!pcr::isMV(value)) 85 : { 86 0 : value = UINT1(value > UINT1(0)); 87 : } 88 100 : } 89 : }; 90 : 91 : template <> struct CastToBooleanRange<UINT2> 92 : { 93 0 : void operator()(UINT2 &value) const 94 : { 95 0 : if (!pcr::isMV(value)) 96 : { 97 0 : value = UINT2(value > UINT2(0)); 98 : } 99 0 : } 100 : }; 101 : 102 : template <> struct CastToBooleanRange<UINT4> 103 : { 104 0 : void operator()(UINT4 &value) const 105 : { 106 0 : if (!pcr::isMV(value)) 107 : { 108 0 : value = UINT4(value > UINT4(0)); 109 : } 110 0 : } 111 : }; 112 : 113 : struct CastToDirection 114 : { 115 0 : void operator()(REAL4 &value) const 116 : { 117 0 : REAL4 factor = static_cast<REAL4>(M_PI / 180.0); 118 0 : if (!pcr::isMV(value)) 119 : { 120 0 : value = REAL4(value * factor); 121 : } 122 0 : } 123 : }; 124 : 125 : struct CastToLdd 126 : { 127 0 : void operator()(UINT1 &value) const 128 : { 129 0 : if (!pcr::isMV(value)) 130 : { 131 0 : if ((value < 1) || (value > 9)) 132 : { 133 0 : CPLError(CE_Warning, CPLE_IllegalArg, 134 : "PCRaster driver: incorrect LDD value used, assigned " 135 : "MV instead"); 136 0 : pcr::setMV(value); 137 : } 138 : else 139 : { 140 0 : value = UINT1(value); 141 : } 142 : } 143 0 : } 144 : }; 145 : 146 : #endif // INCLUDED_PCRASTERUTIL