[QGIS Commit] r14892 - in trunk/qgis/src: analysis/raster app ui
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Sat Dec 11 16:43:46 EST 2010
Author: mhugent
Date: 2010-12-11 13:43:46 -0800 (Sat, 11 Dec 2010)
New Revision: 14892
Modified:
trunk/qgis/src/analysis/raster/qgsrastercalclexer.ll
trunk/qgis/src/analysis/raster/qgsrastercalcnode.cpp
trunk/qgis/src/analysis/raster/qgsrastercalcnode.h
trunk/qgis/src/analysis/raster/qgsrastercalcparser.yy
trunk/qgis/src/analysis/raster/qgsrastermatrix.cpp
trunk/qgis/src/analysis/raster/qgsrastermatrix.h
trunk/qgis/src/app/qgsrastercalcdialog.cpp
trunk/qgis/src/app/qgsrastercalcdialog.h
trunk/qgis/src/ui/qgsrastercalcdialogbase.ui
Log:
[FEATURE]: AND and OR operator for raster calculator
Modified: trunk/qgis/src/analysis/raster/qgsrastercalclexer.ll
===================================================================
--- trunk/qgis/src/analysis/raster/qgsrastercalclexer.ll 2010-12-11 20:37:14 UTC (rev 14891)
+++ trunk/qgis/src/analysis/raster/qgsrastercalclexer.ll 2010-12-11 21:43:46 UTC (rev 14892)
@@ -58,6 +58,8 @@
"acos" { rasterlval.op = QgsRasterCalcNode::opACOS; return FUNCTION;}
"atan" { rasterlval.op = QgsRasterCalcNode::opATAN; return FUNCTION;}
+"AND" { return AND; }
+"OR" { return OR; }
"!=" { return NE; }
"<=" { return LE; }
">=" { return GE; }
Modified: trunk/qgis/src/analysis/raster/qgsrastercalcnode.cpp
===================================================================
--- trunk/qgis/src/analysis/raster/qgsrastercalcnode.cpp 2010-12-11 20:37:14 UTC (rev 14891)
+++ trunk/qgis/src/analysis/raster/qgsrastercalcnode.cpp 2010-12-11 21:43:46 UTC (rev 14892)
@@ -19,11 +19,11 @@
QgsRasterCalcNode::~QgsRasterCalcNode()
{
- if( mLeft )
+ if ( mLeft )
{
delete mLeft;
}
- if( mRight )
+ if ( mRight )
{
delete mRight;
}
@@ -34,10 +34,10 @@
//if type is raster ref: return a copy of the corresponding matrix
//if type is operator, call the proper matrix operations
- if( mType == tRasterRef )
+ if ( mType == tRasterRef )
{
QMap<QString, QgsRasterMatrix*>::iterator it = rasterData.find( mRasterName );
- if( it == rasterData.end() )
+ if ( it == rasterData.end() )
{
return false;
}
@@ -48,20 +48,20 @@
result.setData(( *it )->nColumns(), ( *it )->nRows(), data, ( *it )->nodataValue() );
return true;
}
- else if( mType == tOperator )
+ else if ( mType == tOperator )
{
QgsRasterMatrix leftMatrix, rightMatrix;
QgsRasterMatrix resultMatrix;
- if( !mLeft || !mLeft->calculate( rasterData, leftMatrix ) )
+ if ( !mLeft || !mLeft->calculate( rasterData, leftMatrix ) )
{
return false;
}
- if( mRight && !mRight->calculate( rasterData, rightMatrix ) )
+ if ( mRight && !mRight->calculate( rasterData, rightMatrix ) )
{
return false;
}
- switch( mOperator )
+ switch ( mOperator )
{
case opPLUS:
leftMatrix.add( rightMatrix );
@@ -96,6 +96,12 @@
case opLE:
leftMatrix.lesserEqual( rightMatrix );
break;
+ case opAND:
+ leftMatrix.logicalAnd( rightMatrix );
+ break;
+ case opOR:
+ leftMatrix.logicalOr( rightMatrix );
+ break;
case opSQRT:
leftMatrix.squareRoot();
break;
@@ -125,7 +131,7 @@
result.setData( newNColumns, newNRows, leftMatrix.takeData(), leftMatrix.nodataValue() );
return true;
}
- else if( mType == tNumber )
+ else if ( mType == tNumber )
{
float* data = new float[1];
data[0] = mNumber;
Modified: trunk/qgis/src/analysis/raster/qgsrastercalcnode.h
===================================================================
--- trunk/qgis/src/analysis/raster/qgsrastercalcnode.h 2010-12-11 20:37:14 UTC (rev 14891)
+++ trunk/qgis/src/analysis/raster/qgsrastercalcnode.h 2010-12-11 21:43:46 UTC (rev 14892)
@@ -55,6 +55,8 @@
opLT, // <
opGE, // >=
opLE, // <=
+ opAND,
+ opOR
};
QgsRasterCalcNode();
Modified: trunk/qgis/src/analysis/raster/qgsrastercalcparser.yy
===================================================================
--- trunk/qgis/src/analysis/raster/qgsrastercalcparser.yy 2010-12-11 20:37:14 UTC (rev 14891)
+++ trunk/qgis/src/analysis/raster/qgsrastercalcparser.yy 2010-12-11 21:43:46 UTC (rev 14892)
@@ -55,6 +55,8 @@
%type <node> root
%type <node> raster_exp
+%left AND
+%left OR
%left NE
%left GE
%left LE
@@ -71,6 +73,8 @@
raster_exp:
FUNCTION '(' raster_exp ')' { $$ = new QgsRasterCalcNode($1, $3, 0); joinTmpNodes($$, $3, 0);}
+ | raster_exp AND raster_exp { $$ = new QgsRasterCalcNode( QgsRasterCalcNode::opAND, $1, $3 ); joinTmpNodes($$,$1,$3); }
+ | raster_exp OR raster_exp { $$ = new QgsRasterCalcNode( QgsRasterCalcNode::opOR, $1, $3 ); joinTmpNodes($$,$1,$3); }
| raster_exp '=' raster_exp { $$ = new QgsRasterCalcNode( QgsRasterCalcNode::opEQ, $1, $3 ); joinTmpNodes($$,$1,$3); }
| raster_exp NE raster_exp { $$ = new QgsRasterCalcNode( QgsRasterCalcNode::opNE, $1, $3 ); joinTmpNodes($$,$1,$3); }
| raster_exp '>' raster_exp { $$ = new QgsRasterCalcNode( QgsRasterCalcNode::opGT, $1, $3 ); joinTmpNodes($$, $1, $3); }
Modified: trunk/qgis/src/analysis/raster/qgsrastermatrix.cpp
===================================================================
--- trunk/qgis/src/analysis/raster/qgsrastermatrix.cpp 2010-12-11 20:37:14 UTC (rev 14891)
+++ trunk/qgis/src/analysis/raster/qgsrastermatrix.cpp 2010-12-11 21:43:46 UTC (rev 14892)
@@ -122,6 +122,16 @@
return twoArgumentOperation( opLE, other );
}
+bool QgsRasterMatrix::logicalAnd( const QgsRasterMatrix& other )
+{
+ return twoArgumentOperation( opAND, other );
+}
+
+bool QgsRasterMatrix::logicalOr( const QgsRasterMatrix& other )
+{
+ return twoArgumentOperation( opOR, other );
+}
+
bool QgsRasterMatrix::squareRoot()
{
return oneArgumentOperation( opSQRT );
@@ -266,6 +276,12 @@
case opLE:
mData[0] = mData[0] <= other.number() ? 1.0f : 0.0f;
break;
+ case opAND:
+ mData[0] = mData[0] && other.number() ? 1.0f : 0.0f;
+ break;
+ case opOR:
+ mData[0] = mData[0] || other.number() ? 1.0f : 0.0f;
+ break;
}
return true;
}
@@ -335,6 +351,12 @@
case opLE:
mData[i] = value1 <= value2 ? 1.0f : 0.0f;
break;
+ case opAND:
+ mData[i] = value1 && value2 ? 1.0f : 0.0f;
+ break;
+ case opOR:
+ mData[i] = value1 || value2 ? 1.0f : 0.0f;
+ break;
}
}
}
@@ -417,6 +439,12 @@
case opLE:
mData[i] = value <= matrix[i] ? 1.0f : 0.0f;
break;
+ case opAND:
+ mData[i] = value && matrix[i] ? 1.0f : 0.0f;
+ break;
+ case opOR:
+ mData[i] = value || matrix[i] ? 1.0f : 0.0f;
+ break;
}
}
return true;
@@ -491,6 +519,12 @@
case opLE:
mData[i] = mData[i] <= value ? 1.0f : 0.0f;
break;
+ case opAND:
+ mData[i] = mData[i] && value ? 1.0f : 0.0f;
+ break;
+ case opOR:
+ mData[i] = mData[i] || value ? 1.0f : 0.0f;
+ break;
}
}
return true;
Modified: trunk/qgis/src/analysis/raster/qgsrastermatrix.h
===================================================================
--- trunk/qgis/src/analysis/raster/qgsrastermatrix.h 2010-12-11 20:37:14 UTC (rev 14891)
+++ trunk/qgis/src/analysis/raster/qgsrastermatrix.h 2010-12-11 21:43:46 UTC (rev 14892)
@@ -35,6 +35,8 @@
opLT, // <
opGE, // >=
opLE, // <=
+ opAND,
+ opOR
};
enum OneArgOperator
@@ -85,6 +87,8 @@
bool lesserThan( const QgsRasterMatrix& other );
bool greaterEqual( const QgsRasterMatrix& other );
bool lesserEqual( const QgsRasterMatrix& other );
+ bool logicalAnd( const QgsRasterMatrix& other );
+ bool logicalOr( const QgsRasterMatrix& other );
bool squareRoot();
bool sinus();
@@ -100,7 +104,7 @@
float* mData;
double mNodataValue;
- /**+,-,*,/,^,<,>,<=,>=,=,!=*/
+ /**+,-,*,/,^,<,>,<=,>=,=,!=, and, or*/
bool twoArgumentOperation( TwoArgOperator op, const QgsRasterMatrix& other );
/*sqrt, sin, cos, tan, asin, acos, atan*/
bool oneArgumentOperation( OneArgOperator op );
Modified: trunk/qgis/src/app/qgsrastercalcdialog.cpp
===================================================================
--- trunk/qgis/src/app/qgsrastercalcdialog.cpp 2010-12-11 20:37:14 UTC (rev 14891)
+++ trunk/qgis/src/app/qgsrastercalcdialog.cpp 2010-12-11 21:43:46 UTC (rev 14892)
@@ -389,3 +389,38 @@
{
mExpressionTextEdit->insertPlainText( " ) " );
}
+
+void QgsRasterCalcDialog::on_mLessButton_clicked()
+{
+ mExpressionTextEdit->insertPlainText( " < " );
+}
+
+void QgsRasterCalcDialog::on_mGreaterButton_clicked()
+{
+ mExpressionTextEdit->insertPlainText( " > " );
+}
+
+void QgsRasterCalcDialog::on_mEqualButton_clicked()
+{
+ mExpressionTextEdit->insertPlainText( " = " );
+}
+
+void QgsRasterCalcDialog::on_mLesserEqualButton_clicked()
+{
+ mExpressionTextEdit->insertPlainText( " <= " );
+}
+
+void QgsRasterCalcDialog::on_mGreaterEqualButton_clicked()
+{
+ mExpressionTextEdit->insertPlainText( " >= " );
+}
+
+void QgsRasterCalcDialog::on_mAndButton_clicked()
+{
+ mExpressionTextEdit->insertPlainText( " AND " );
+}
+
+void QgsRasterCalcDialog::on_mOrButton_clicked()
+{
+ mExpressionTextEdit->insertPlainText( " OR " );
+}
Modified: trunk/qgis/src/app/qgsrastercalcdialog.h
===================================================================
--- trunk/qgis/src/app/qgsrastercalcdialog.h 2010-12-11 20:37:14 UTC (rev 14891)
+++ trunk/qgis/src/app/qgsrastercalcdialog.h 2010-12-11 21:43:46 UTC (rev 14892)
@@ -68,6 +68,13 @@
void on_mATanButton_clicked();
void on_mOpenBracketPushButton_clicked();
void on_mCloseBracketPushButton_clicked();
+ void on_mLessButton_clicked();
+ void on_mGreaterButton_clicked();
+ void on_mEqualButton_clicked();
+ void on_mLesserEqualButton_clicked();
+ void on_mGreaterEqualButton_clicked();
+ void on_mAndButton_clicked();
+ void on_mOrButton_clicked();
private:
//insert available GDAL drivers that support the create() option
Modified: trunk/qgis/src/ui/qgsrastercalcdialogbase.ui
===================================================================
--- trunk/qgis/src/ui/qgsrastercalcdialogbase.ui 2010-12-11 20:37:14 UTC (rev 14891)
+++ trunk/qgis/src/ui/qgsrastercalcdialogbase.ui 2010-12-11 21:43:46 UTC (rev 14892)
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>651</width>
- <height>512</height>
+ <height>518</height>
</rect>
</property>
<property name="windowTitle">
@@ -323,6 +323,55 @@
</property>
</widget>
</item>
+ <item row="2" column="0">
+ <widget class="QPushButton" name="mLessButton">
+ <property name="text">
+ <string><</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QPushButton" name="mGreaterButton">
+ <property name="text">
+ <string>></string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QPushButton" name="mEqualButton">
+ <property name="text">
+ <string>=</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="6">
+ <widget class="QPushButton" name="mOrButton">
+ <property name="text">
+ <string>OR</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="5">
+ <widget class="QPushButton" name="mAndButton">
+ <property name="text">
+ <string>AND</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="QPushButton" name="mLesserEqualButton">
+ <property name="text">
+ <string><=</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="4">
+ <widget class="QPushButton" name="mGreaterEqualButton">
+ <property name="text">
+ <string>>=</string>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
</item>
More information about the QGIS-commit
mailing list