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