[SCM] qgis branch, master, updated. a2ee769957385f4e084c5e8b6ba178a8c877d1db

Alexander Bruy alexander.bruy at gmail.com
Tue Mar 20 13:42:55 UTC 2012


The following commit has been merged in the master branch:
commit c89fec8e755ac262fb8c465b653419706440987c
Author: Alexander Bruy <alexander.bruy at 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



More information about the Pkg-grass-devel mailing list