The following commit has been merged in the master branch: commit c89fec8e755ac262fb8c465b653419706440987c Author: Alexander Bruy <alexander.b...@gmail.com> Date: Tue Mar 6 20:33:46 2012 +0200
[FEATURE] fTools: allow to calculate extent not only for whole layer but for individual features too diff --git a/python/plugins/fTools/tools/doGeometry.py b/python/plugins/fTools/tools/doGeometry.py index 978d786..d4d3e72 100644 --- a/python/plugins/fTools/tools/doGeometry.py +++ b/python/plugins/fTools/tools/doGeometry.py @@ -81,7 +81,8 @@ class GeometryDialog( QDialog, Ui_Dialog ): self.tr( "Please specify valid UID field" ) ) else: self.outShape.clear() - self.geometry( self.inShape.currentText(), self.lineEdit.value(), self.cmbField.currentText() ) + self.geometry( self.inShape.currentText(), self.lineEdit.value(), + self.cmbField.currentText() ) def outFile( self ): self.outShape.clear() @@ -97,6 +98,9 @@ class GeometryDialog( QDialog, Ui_Dialog ): self.lblCalcType.setVisible( False ) self.cmbCalcType.setVisible( False ) + self.chkUseSelection.setVisible( False ) + self.chkByFeatures.setVisible( False ) + self.chkWriteShapefile.setVisible( False ) if self.myFunction == 1: # Singleparts to multipart self.setWindowTitle( self.tr( "Singleparts to multipart" ) ) @@ -167,6 +171,8 @@ class GeometryDialog( QDialog, Ui_Dialog ): self.label_3.setText( self.tr( "Input layer" ) ) self.label.setVisible( False ) self.lineEdit.setVisible( False ) + self.chkByFeatures.setVisible( True ) + self.chkUseSelection.setVisible( True ) self.lblOutputShapefile.setText( self.tr( "Output polygon shapefile" ) ) self.resize( 381, 100 ) self.populateLayers() @@ -229,7 +235,8 @@ class GeometryDialog( QDialog, Ui_Dialog ): self.buttonOk.setEnabled( False ) self.testThread = geometryThread( self.iface.mainWindow(), self, self.myFunction, vlayer, myParam, myField, self.shapefileName, self.encoding, - self.cmbCalcType.currentIndex(), self.chkWriteShapefile.isChecked() ) + self.cmbCalcType.currentIndex(), self.chkWriteShapefile.isChecked(), + self.chkByFeatures.isChecked(), self.chkUseSelection.isChecked() ) QObject.connect( self.testThread, SIGNAL( "runFinished( PyQt_PyObject )" ), self.runFinishedFromThread ) QObject.connect( self.testThread, SIGNAL( "runStatus( PyQt_PyObject )" ), self.runStatusFromThread ) QObject.connect( self.testThread, SIGNAL( "runRange( PyQt_PyObject )" ), self.runRangeFromThread ) @@ -288,7 +295,8 @@ class GeometryDialog( QDialog, Ui_Dialog ): class geometryThread( QThread ): def __init__( self, parentThread, parentObject, function, vlayer, myParam, - myField, myName, myEncoding, myCalcType, myNewShape ): + myField, myName, myEncoding, myCalcType, myNewShape, myByFeatures, + myUseSelection ): QThread.__init__( self, parentThread ) self.parent = parentObject self.running = False @@ -300,6 +308,8 @@ class geometryThread( QThread ): self.myEncoding = myEncoding self.myCalcType = myCalcType self.writeShape = myNewShape + self.byFeatures = myByFeatures + self.useSelection = myUseSelection def run( self ): self.running = True @@ -319,7 +329,10 @@ class geometryThread( QThread ): elif self.myFunction == 8: # Delaunay triangulation success = self.delaunay_triangulation() elif self.myFunction == 9: # Polygon from layer extent - success = self.layer_extent() + if self.byFeatures: + success = self.feature_extent() + else: + success = self.layer_extent() elif self.myFunction == 10: # Voronoi Polygons success = self.voronoi_polygons() elif self.myFunction == 11: # Lines to polygons @@ -860,6 +873,105 @@ class geometryThread( QThread ): return True + def feature_extent( self, ): + vprovider = self.vlayer.dataProvider() + vprovider.select( [] ) + + self.emit( SIGNAL( "runStatus( PyQt_PyObject )" ), 0 ) + + fields = { 0 : QgsField( "MINX", QVariant.Double ), + 1 : QgsField( "MINY", QVariant.Double ), + 2 : QgsField( "MAXX", QVariant.Double ), + 3 : QgsField( "MAXY", QVariant.Double ), + 4 : QgsField( "CNTX", QVariant.Double ), + 5 : QgsField( "CNTY", QVariant.Double ), + 6 : QgsField( "AREA", QVariant.Double ), + 7 : QgsField( "PERIM", QVariant.Double ), + 8 : QgsField( "HEIGHT", QVariant.Double ), + 9 : QgsField( "WIDTH", QVariant.Double ) } + + writer = QgsVectorFileWriter( self.myName, self.myEncoding, fields, + QGis.WKBPolygon, self.vlayer.crs() ) + inFeat = QgsFeature() + outFeat = QgsFeature() + nElement = 0 + + if self.useSelection: + self.emit( SIGNAL( "runRange( PyQt_PyObject )" ), (0, self.vlayer.selectedFeatureCount() ) ) + for inFeat in self.vlayer.selectedFeatures(): + self.emit( SIGNAL( "runStatus( PyQt_PyObject )" ), nElement ) + nElement += 1 + + rect = inFeat.geometry().boundingBox() + minx = rect.xMinimum() + miny = rect.yMinimum() + maxx = rect.xMaximum() + maxy = rect.yMaximum() + height = rect.height() + width = rect.width() + cntx = minx + ( width / 2.0 ) + cnty = miny + ( height / 2.0 ) + area = width * height + perim = ( 2 * width ) + ( 2 * height ) + rect = [ QgsPoint( minx, miny ), + QgsPoint( minx, maxy ), + QgsPoint( maxx, maxy ), + QgsPoint( maxx, miny ), + QgsPoint( minx, miny ) ] + geometry = QgsGeometry().fromPolygon( [ rect ] ) + + outFeat.setGeometry( geometry ) + outFeat.setAttributeMap( { 0 : QVariant( minx ), + 1 : QVariant( miny ), + 2 : QVariant( maxx ), + 3 : QVariant( maxy ), + 4 : QVariant( cntx ), + 5 : QVariant( cnty ), + 6 : QVariant( area ), + 7 : QVariant( perim ), + 8 : QVariant( height ), + 9 : QVariant( width ) } ) + writer.addFeature( outFeat ) + else: + self.emit( SIGNAL( "runRange( PyQt_PyObject )" ), ( 0, vprovider.featureCount() ) ) + while vprovider.nextFeature( inFeat ): + self.emit( SIGNAL( "runStatus( PyQt_PyObject )" ), nElement ) + nElement += 1 + + rect = inFeat.geometry().boundingBox() + minx = rect.xMinimum() + miny = rect.yMinimum() + maxx = rect.xMaximum() + maxy = rect.yMaximum() + height = rect.height() + width = rect.width() + cntx = minx + ( width / 2.0 ) + cnty = miny + ( height / 2.0 ) + area = width * height + perim = ( 2 * width ) + ( 2 * height ) + rect = [ QgsPoint( minx, miny ), + QgsPoint( minx, maxy ), + QgsPoint( maxx, maxy ), + QgsPoint( maxx, miny ), + QgsPoint( minx, miny ) ] + geometry = QgsGeometry().fromPolygon( [ rect ] ) + + outFeat.setGeometry( geometry ) + outFeat.setAttributeMap( { 0 : QVariant( minx ), + 1 : QVariant( miny ), + 2 : QVariant( maxx ), + 3 : QVariant( maxy ), + 4 : QVariant( cntx ), + 5 : QVariant( cnty ), + 6 : QVariant( area ), + 7 : QVariant( perim ), + 8 : QVariant( height ), + 9 : QVariant( width ) } ) + writer.addFeature( outFeat ) + + del writer + return True + def simpleMeasure( self, inGeom, calcType, ellips, crs ): if inGeom.wkbType() in ( QGis.WKBPoint, QGis.WKBPoint25D ): pt = QgsPoint() diff --git a/python/plugins/fTools/tools/frmGeometry.ui b/python/plugins/fTools/tools/frmGeometry.ui index e1bad95..591cf50 100644 --- a/python/plugins/fTools/tools/frmGeometry.ui +++ b/python/plugins/fTools/tools/frmGeometry.ui @@ -47,7 +47,7 @@ <widget class="QComboBox" name="cmbField"/> </widget> </item> - <item row="4" column="0"> + <item row="6" column="0"> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -60,7 +60,7 @@ </property> </spacer> </item> - <item row="5" column="0" colspan="2"> + <item row="7" column="0" colspan="2"> <layout class="QVBoxLayout"> <item> <widget class="QCheckBox" name="chkWriteShapefile"> @@ -96,7 +96,7 @@ </item> </layout> </item> - <item row="6" column="0"> + <item row="8" column="0"> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -109,7 +109,7 @@ </property> </spacer> </item> - <item row="7" column="0"> + <item row="9" column="0"> <widget class="QProgressBar" name="progressBar"> <property name="value"> <number>0</number> @@ -122,7 +122,7 @@ </property> </widget> </item> - <item row="7" column="1"> + <item row="9" column="1"> <widget class="QDialogButtonBox" name="buttonBox_2"> <property name="orientation"> <enum>Qt::Horizontal</enum> @@ -189,6 +189,20 @@ </item> </layout> </item> + <item row="5" column="0" colspan="2"> + <widget class="QCheckBox" name="chkByFeatures"> + <property name="text"> + <string>Calculate extent for each feature separately</string> + </property> + </widget> + </item> + <item row="4" column="0" colspan="2"> + <widget class="QCheckBox" name="chkUseSelection"> + <property name="text"> + <string>Use only selected features</string> + </property> + </widget> + </item> </layout> </widget> <resources/> -- The Quantum GIS in Debian project _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel