Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsderivativefilter.cpp - description 3 : : ----------------------- 4 : : begin : August 7th, 2009 5 : : copyright : (C) 2009 by Marco Hugentobler 6 : : email : marco dot hugentobler at karto dot baug dot ethz dot ch 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #include "qgsderivativefilter.h" 19 : : 20 : 0 : QgsDerivativeFilter::QgsDerivativeFilter( const QString &inputFile, const QString &outputFile, const QString &outputFormat ) 21 : 0 : : QgsNineCellFilter( inputFile, outputFile, outputFormat ) 22 : 0 : { 23 : : 24 : 0 : } 25 : : 26 : 0 : float QgsDerivativeFilter::calcFirstDerX( float *x11, float *x21, float *x31, float *x12, float *x22, float *x32, float *x13, float *x23, float *x33 ) 27 : : { 28 : : //the basic formula would be simple, but we need to test for nodata values... 29 : : //return (( (*x31 - *x11) + 2 * (*x32 - *x12) + (*x33 - *x13) ) / (8 * mCellSizeX)); 30 : : 31 : 0 : int weight = 0; 32 : 0 : double sum = 0; 33 : : 34 : : //first row 35 : 0 : if ( *x31 != mInputNodataValue && *x11 != mInputNodataValue ) //the normal case 36 : : { 37 : 0 : sum += ( *x31 - *x11 ); 38 : 0 : weight += 2; 39 : 0 : } 40 : 0 : else if ( *x31 == mInputNodataValue && *x11 != mInputNodataValue && *x21 != mInputNodataValue ) //probably 3x3 window is at the border 41 : : { 42 : 0 : sum += ( *x21 - *x11 ); 43 : 0 : weight += 1; 44 : 0 : } 45 : 0 : else if ( *x11 == mInputNodataValue && *x31 != mInputNodataValue && *x21 != mInputNodataValue ) //probably 3x3 window is at the border 46 : : { 47 : 0 : sum += ( *x31 - *x21 ); 48 : 0 : weight += 1; 49 : 0 : } 50 : : 51 : : //second row 52 : 0 : if ( *x32 != mInputNodataValue && *x12 != mInputNodataValue ) //the normal case 53 : : { 54 : 0 : sum += 2 * ( *x32 - *x12 ); 55 : 0 : weight += 4; 56 : 0 : } 57 : 0 : else if ( *x32 == mInputNodataValue && *x12 != mInputNodataValue && *x22 != mInputNodataValue ) 58 : : { 59 : 0 : sum += 2 * ( *x22 - *x12 ); 60 : 0 : weight += 2; 61 : 0 : } 62 : 0 : else if ( *x12 == mInputNodataValue && *x32 != mInputNodataValue && *x22 != mInputNodataValue ) 63 : : { 64 : 0 : sum += 2 * ( *x32 - *x22 ); 65 : 0 : weight += 2; 66 : 0 : } 67 : : 68 : : //third row 69 : 0 : if ( *x33 != mInputNodataValue && *x13 != mInputNodataValue ) //the normal case 70 : : { 71 : 0 : sum += ( *x33 - *x13 ); 72 : 0 : weight += 2; 73 : 0 : } 74 : 0 : else if ( *x33 == mInputNodataValue && *x13 != mInputNodataValue && *x23 != mInputNodataValue ) 75 : : { 76 : 0 : sum += ( *x23 - *x13 ); 77 : 0 : weight += 1; 78 : 0 : } 79 : 0 : else if ( *x13 == mInputNodataValue && *x33 != mInputNodataValue && *x23 != mInputNodataValue ) 80 : : { 81 : 0 : sum += ( *x33 - *x23 ); 82 : 0 : weight += 1; 83 : 0 : } 84 : : 85 : 0 : if ( weight == 0 ) 86 : : { 87 : 0 : return mOutputNodataValue; 88 : : } 89 : : 90 : 0 : return sum / ( weight * mCellSizeX ) * mZFactor; 91 : 0 : } 92 : : 93 : 0 : float QgsDerivativeFilter::calcFirstDerY( float *x11, float *x21, float *x31, float *x12, float *x22, float *x32, float *x13, float *x23, float *x33 ) 94 : : { 95 : : //the basic formula would be simple, but we need to test for nodata values... 96 : : //return (((*x11 - *x13) + 2 * (*x21 - *x23) + (*x31 - *x33)) / ( 8 * mCellSizeY)); 97 : : 98 : 0 : double sum = 0; 99 : 0 : int weight = 0; 100 : : 101 : : //first row 102 : 0 : if ( *x11 != mInputNodataValue && *x13 != mInputNodataValue ) //normal case 103 : : { 104 : 0 : sum += ( *x11 - *x13 ); 105 : 0 : weight += 2; 106 : 0 : } 107 : 0 : else if ( *x11 == mInputNodataValue && *x13 != mInputNodataValue && *x12 != mInputNodataValue ) 108 : : { 109 : 0 : sum += ( *x12 - *x13 ); 110 : 0 : weight += 1; 111 : 0 : } 112 : 0 : else if ( *x31 == mInputNodataValue && *x11 != mInputNodataValue && *x12 != mInputNodataValue ) 113 : : { 114 : 0 : sum += ( *x11 - *x12 ); 115 : 0 : weight += 1; 116 : 0 : } 117 : : 118 : : //second row 119 : 0 : if ( *x21 != mInputNodataValue && *x23 != mInputNodataValue ) 120 : : { 121 : 0 : sum += 2 * ( *x21 - *x23 ); 122 : 0 : weight += 4; 123 : 0 : } 124 : 0 : else if ( *x21 == mInputNodataValue && *x23 != mInputNodataValue && *x22 != mInputNodataValue ) 125 : : { 126 : 0 : sum += 2 * ( *x22 - *x23 ); 127 : 0 : weight += 2; 128 : 0 : } 129 : 0 : else if ( *x23 == mInputNodataValue && *x21 != mInputNodataValue && *x22 != mInputNodataValue ) 130 : : { 131 : 0 : sum += 2 * ( *x21 - *x22 ); 132 : 0 : weight += 2; 133 : 0 : } 134 : : 135 : : //third row 136 : 0 : if ( *x31 != mInputNodataValue && *x33 != mInputNodataValue ) 137 : : { 138 : 0 : sum += ( *x31 - *x33 ); 139 : 0 : weight += 2; 140 : 0 : } 141 : 0 : else if ( *x31 == mInputNodataValue && *x33 != mInputNodataValue && *x32 != mInputNodataValue ) 142 : : { 143 : 0 : sum += ( *x32 - *x33 ); 144 : 0 : weight += 1; 145 : 0 : } 146 : 0 : else if ( *x33 == mInputNodataValue && *x31 != mInputNodataValue && *x32 != mInputNodataValue ) 147 : : { 148 : 0 : sum += ( *x31 - *x32 ); 149 : 0 : weight += 1; 150 : 0 : } 151 : : 152 : 0 : if ( weight == 0 ) 153 : : { 154 : 0 : return mOutputNodataValue; 155 : : } 156 : : 157 : 0 : return sum / ( weight * mCellSizeY ) * mZFactor; 158 : 0 : } 159 : : 160 : : 161 : : 162 : : 163 : :