[QGIS Commit] r10127 - in trunk/qgis/python/plugins/fTools: . tools
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Sun Feb 8 12:57:14 EST 2009
Author: cfarmer
Date: 2009-02-08 12:57:14 -0500 (Sun, 08 Feb 2009)
New Revision: 10127
Modified:
trunk/qgis/python/plugins/fTools/__init__.py
trunk/qgis/python/plugins/fTools/doAbout.py
trunk/qgis/python/plugins/fTools/fTools.py
trunk/qgis/python/plugins/fTools/tools/doGeoprocessing.py
Log:
1) geoprocessing tools better handle geos exceptions
2) fix osx bug regarding about dialog
3) update version information
Modified: trunk/qgis/python/plugins/fTools/__init__.py
===================================================================
--- trunk/qgis/python/plugins/fTools/__init__.py 2009-02-07 19:48:49 UTC (rev 10126)
+++ trunk/qgis/python/plugins/fTools/__init__.py 2009-02-08 17:57:14 UTC (rev 10127)
@@ -21,13 +21,13 @@
return "Tools for vector data analysis and management"
def version():
- return "0.5.5"
+ return "0.5.6"
def qgisMinimumVersion():
return "1.0.0"
def authorName():
- return "Carson Farmer"
+ return "Carson J. Q. Farmer"
def classFactory( iface ):
from fTools import fToolsPlugin
Modified: trunk/qgis/python/plugins/fTools/doAbout.py
===================================================================
--- trunk/qgis/python/plugins/fTools/doAbout.py 2009-02-07 19:48:49 UTC (rev 10126)
+++ trunk/qgis/python/plugins/fTools/doAbout.py 2009-02-08 17:57:14 UTC (rev 10127)
@@ -32,7 +32,7 @@
QObject.connect(self.btnWeb, SIGNAL("clicked()"), self.openWeb)
QObject.connect(self.btnHelp, SIGNAL("clicked()"), self.openHelp)
self.fToolsLogo.setPixmap(QPixmap(":/icons/default/ftools_logo.png"))
- self.label_3.setText("fTools 0.5.2")
+ self.label_3.setText("fTools 0.5.6")
self.textEdit.setText(self.getText())
def getText(self):
@@ -71,6 +71,8 @@
aknowledgeString.append("Paolo Cavallini\n")
aknowledgeString.append("Aaron Racicot\n")
aknowledgeString.append("Colin Robertson\n")
+ aknowledgeString.append("Agustin Lobo\n")
+ aknowledgeString.append("Jurgen E. Fischer\n")
aknowledgeString.append("QGis developer and user communities\n")
aknowledgeString.append("Folks on #qgis at freenode.net\n")
aknowledgeString.append("All those who have reported bugs/fixes/suggestions/comments/etc.")
Modified: trunk/qgis/python/plugins/fTools/fTools.py
===================================================================
--- trunk/qgis/python/plugins/fTools/fTools.py 2009-02-07 19:48:49 UTC (rev 10126)
+++ trunk/qgis/python/plugins/fTools/fTools.py 2009-02-08 17:57:14 UTC (rev 10127)
@@ -170,7 +170,7 @@
QCoreApplication.translate( "fTools", "Split vector layer" ), self.iface.mainWindow() )
self.dataManageMenu.addActions( [ self.project, self.define, self.joinAttr, self.spatJoin, self.splitVect ] )
- self.about_ftools = QAction( QIcon( self.getThemeIcon( "ftools_logo.png" ) ),
+ self.ftools_about = QAction( QIcon( self.getThemeIcon( "ftools_logo.png" ) ),
QCoreApplication.translate( "fTools", "About fTools" ), self.iface.mainWindow() )
self.menu.addMenu( self.analysisMenu )
@@ -179,7 +179,7 @@
self.menu.addMenu( self.conversionMenu )
self.menu.addMenu( self.dataManageMenu )
self.menu.addSeparator()
- self.menu.addAction( self.about_ftools )
+ self.menu.addAction( self.ftools_about )
menuBar = self.iface.mainWindow().menuBar()
actions = menuBar.actions()
@@ -226,7 +226,7 @@
QObject.connect( self.spatJoin, SIGNAL("triggered()"), self.dospatJoin )
QObject.connect( self.splitVect, SIGNAL("triggered()"), self.dosplitVect )
- QObject.connect( self.about_ftools, SIGNAL("triggered()"), self.doabout )
+ QObject.connect( self.ftools_about, SIGNAL("triggered()"), self.doabout )
def unload( self ):
pass
Modified: trunk/qgis/python/plugins/fTools/tools/doGeoprocessing.py
===================================================================
--- trunk/qgis/python/plugins/fTools/tools/doGeoprocessing.py 2009-02-07 19:48:49 UTC (rev 10126)
+++ trunk/qgis/python/plugins/fTools/tools/doGeoprocessing.py 2009-02-08 17:57:14 UTC (rev 10127)
@@ -4,6 +4,7 @@
from qgis.gui import *
from frmGeoprocessing import Ui_Dialog
import ftools_utils
+import sys
class GeoprocessingDialog( QDialog, Ui_Dialog ):
def __init__( self, iface, function ):
@@ -161,19 +162,24 @@
self.testThread.stop()
self.cancel_close.setText( "Close" )
QObject.disconnect( self.cancel_close, SIGNAL( "clicked()" ), self.cancelThread )
- if results[0]:
- if not results[1]:
- out_text = self.tr( "\n\nWarning: Different input coordinate reference systems detected, results may not be as expected.")
- else:
- out_text = ""
- addToTOC = QMessageBox.question( self, "Geoprocessing", self.tr( "Created output shapefile:" ) + "\n" +
- unicode( self.shapefileName ) + "\n\n" + self.tr( "Would you like to add the new layer to the TOC?" )
- + out_text, QMessageBox.Yes, QMessageBox.No, QMessageBox.NoButton )
- if addToTOC == QMessageBox.Yes:
- ftools_utils.addShapeToCanvas( unicode( self.shapefileName ) )
+ if not results[2] or not results[1] or not results [0]:
+ out_text = self.tr( "\nWarnings:" )
+ end_text = self.tr( "\nSome output geometries may be missing or invalid.\n\nWould you like to add the new layer anyway?" )
else:
- QMessageBox.warning( self, "Geoprocessing", self.tr( "GEOS geoprocessing error, please check that all features have a valid geometry" ) )
- QObject.disconnect( self.cancel_close, SIGNAL( "clicked()" ), self.cancelThread )
+ out_text = "\n"
+ end_text = self.tr( "\n\nWould you like to add the new layer to the TOC?" )
+ if not results[2]:
+ out_text = out_text + self.tr( "\nInput CRS error: Different input coordinate reference systems detected, results may not be as expected.")
+ if not results[1]:
+ out_text = out_text + self.tr( "\nFeature geometry error: One or more output features ignored due to invalid geometry.")
+ if not results[0]:
+ out_text = out_text + self.tr( "\nGEOS geoprocessing error: One or more input features have invalid geometry.")
+ else:
+ out_text = ""
+ addToTOC = QMessageBox.question( self, "Geoprocessing", self.tr( "Created output shapefile:" ) + "\n"
+ + unicode( self.shapefileName ) + out_text + end_text, QMessageBox.Yes, QMessageBox.No, QMessageBox.NoButton )
+ if addToTOC == QMessageBox.Yes:
+ ftools_utils.addShapeToCanvas( unicode( self.shapefileName ) )
def runStatusFromThread( self, status ):
self.progressBar.setValue( status )
@@ -202,24 +208,24 @@
( self.myParam, useField ) = self.checkParameter( self.vlayerA, self.myParam )
if not self.myParam is None:
if self.myFunction == 1:
- success, match = self.buffering( useField )
+ geos, feature, match = self.buffering( useField )
elif self.myFunction == 2:
- success, match = self.convex_hull( useField )
+ geos, feature, match = self.convex_hull( useField )
elif self.myFunction == 4:
- success, match = self.dissolve( useField )
+ geos, feature, match = self.dissolve( useField )
else:
self.vlayerB = ftools_utils.getVectorLayerByName( self.myLayerB )
if self.myFunction == 3:
- success, match = self.difference()
+ geos, feature, match = self.difference()
elif self.myFunction == 5:
- success, match = self.intersect()
+ geos, feature, match = self.intersect()
elif self.myFunction == 6:
- success, match = self.union()
+ geos, feature, match = self.union()
elif self.myFunction == 7:
- success, match = self.symetrical_difference()
+ geos, feature, match = self.symetrical_difference()
elif self.myFunction == 8:
- success, match = self.clip()
- self.emit( SIGNAL( "runFinished(PyQt_PyObject)" ), (success, match) )
+ geos, feature, match = self.clip()
+ self.emit( SIGNAL( "runFinished(PyQt_PyObject)" ), (geos, feature, match) )
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
def stop(self):
@@ -227,6 +233,7 @@
def buffering( self, useField ):
GEOS_EXCEPT = True
+ FEATURE_EXCEPT = True
vproviderA = self.vlayerA.dataProvider()
allAttrs = vproviderA.attributeIndexes()
vproviderA.select( allAttrs )
@@ -244,9 +251,8 @@
if self.myMerge:
first = True
vproviderA.rewind()
+ add = True
while vproviderA.nextFeature( inFeat ):
- nElement += 1
- self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
atMap = inFeat.attributeMap()
if useField:
value = atMap[ self.myParam ].toDouble()[ 0 ]
@@ -255,27 +261,28 @@
inGeom = QgsGeometry( inFeat.geometry() )
try:
outGeom = inGeom.buffer( float( value ), 5 )
+ if first:
+ tempGeom = QgsGeometry( outGeom )
+ first = False
+ else:
+ try:
+ tempGeom = tempGeom.combine( outGeom )
+ except:
+ GEOS_EXCEPT = False
+ continue
except:
- outGeom = QgsGeometry()
GEOS_EXCEPT = False
- break
- if first:
- tempGeom = QgsGeometry( outGeom )
- first = False
- else:
- try:
- tempGeom = tempGeom.combine( outGeom )
- except:
- tempGeom = QgsGeometry()
- GEOS_EXCEPT = False
- break
- outFeat.setGeometry( tempGeom )
- writer.addFeature( outFeat )
+ continue
+ nElement += 1
+ self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
+ try:
+ outFeat.setGeometry( tempGeom )
+ writer.addFeature( outFeat )
+ except:
+ FEATURE_EXCEPT = False
else:
vproviderA.rewind()
while vproviderA.nextFeature( inFeat ):
- nElement += 1
- self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
atMap = inFeat.attributeMap()
if useField:
value = atMap[ self.myParam ].toDouble()[ 0 ]
@@ -284,18 +291,24 @@
inGeom = QgsGeometry( inFeat.geometry() )
try:
outGeom = inGeom.buffer( float( value ), 5 )
+ try:
+ outFeat.setGeometry( outGeom )
+ outFeat.setAttributeMap( atMap )
+ writer.addFeature( outFeat )
+ except:
+ FEATURE_EXCEPT = False
+ continue
except:
- outGeom = QgsGeometry()
GEOS_EXCEPT = False
continue
- outFeat.setGeometry( outGeom )
- outFeat.setAttributeMap( atMap )
- writer.addFeature( outFeat )
+ nElement += 1
+ self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
del writer
- return GEOS_EXCEPT, True
+ return GEOS_EXCEPT, FEATURE_EXCEPT, True
def convex_hull(self, useField ):
GEOS_EXCEPT = True
+ FEATURE_EXCEPT = True
vproviderA = self.vlayerA.dataProvider()
allAttrsA = vproviderA.attributeIndexes()
fields = vproviderA.fields()
@@ -318,8 +331,6 @@
vproviderA.select( allAttrsA )
vproviderA.rewind()
while vproviderA.nextFeature( inFeat ):
- nElement += 1
- self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
atMap = inFeat.attributeMap()
idVar = atMap[ self.myParam ]
if idVar.toString().trimmed() == i.toString().trimmed():
@@ -329,19 +340,21 @@
inGeom = QgsGeometry( inFeat.geometry() )
points = ftools_utils.extractPoints( inGeom )
hull.extend( points )
+ nElement += 1
+ self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
if len( hull ) >= 3:
tmpGeom = QgsGeometry( outGeom.fromMultiPoint( hull ) )
try:
outGeom = tmpGeom.convexHull()
+ outFeat.setGeometry( outGeom )
+ (area, perim) = self.simpleMeasure( outGeom )
+ outFeat.addAttribute( 0, QVariant( outID ) )
+ outFeat.addAttribute( 1, QVariant( area ) )
+ outFeat.addAttribute( 2, QVariant( perim ) )
+ writer.addFeature( outFeat )
except:
- outGeom = QgsGeometry()
GEOS_EXCEPT = False
- outFeat.setGeometry( outGeom )
- (area, perim) = self.simpleMeasure( outGeom )
- outFeat.addAttribute( 0, QVariant( outID ) )
- outFeat.addAttribute( 1, QVariant( area ) )
- outFeat.addAttribute( 2, QVariant( perim ) )
- writer.addFeature( outFeat )
+ continue
else:
hull = []
vproviderA.rewind()
@@ -350,24 +363,24 @@
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0)
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
while vproviderA.nextFeature( inFeat ):
- nElement += 1
- self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
inGeom = QgsGeometry( inFeat.geometry() )
points = ftools_utils.extractPoints( inGeom )
hull.extend( points )
+ nElement += 1
+ self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
tmpGeom = QgsGeometry( outGeom.fromMultiPoint( hull ) )
try:
outGeom = tmpGeom.convexHull()
+ outFeat.setGeometry( outGeom )
+ writer.addFeature( outFeat )
except:
- outGeom = QgsGeometry()
GEOS_EXCEPT = False
- outFeat.setGeometry( outGeom )
- writer.addFeature( outFeat )
del writer
- return GEOS_EXCEPT, True
+ return GEOS_EXCEPT, FEATURE_EXCEPT, True
def dissolve( self, useField ):
GEOS_EXCEPT = True
+ FEATURE_EXCEPT = True
vproviderA = self.vlayerA.dataProvider()
allAttrsA = vproviderA.attributeIndexes()
fields = vproviderA.fields()
@@ -382,6 +395,7 @@
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0)
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
first = True
+ add = True
while vproviderA.nextFeature( inFeat ):
nElement += 1
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
@@ -394,11 +408,11 @@
tmpInGeom = QgsGeometry( inFeat.geometry() )
tmpOutGeom = QgsGeometry( outFeat.geometry() )
try:
- tmpOutGeom = tmpOutGeom.combine( tmpInGeom )
+ tmpOutGeom = QgsGeometry( tmpOutGeom.combine( tmpInGeom ) )
+ outFeat.setGeometry( tmpOutGeom )
except:
- tmpOutGeom = QgsGeometry()
GEOS_EXCEPT = False
- outFeat.setGeometry( tmpOutGeom )
+ continue
outFeat.setAttributeMap( attrs )
writer.addFeature( outFeat )
else:
@@ -408,6 +422,7 @@
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
for item in unique:
first = True
+ add = True
vproviderA.select( allAttrsA )
vproviderA.rewind()
while vproviderA.nextFeature( inFeat ):
@@ -426,18 +441,20 @@
tmpInGeom = QgsGeometry( inFeat.geometry() )
tmpOutGeom = QgsGeometry( outFeat.geometry() )
try:
- tmpOutGeom = tmpOutGeom.combine( tmpInGeom )
+ tmpOutGeom = QgsGeometry( tmpOutGeom.combine( tmpInGeom ) )
+ outFeat.setGeometry( tmpOutGeom )
except:
- tmpOutGeom = QgsGeometry()
GEOS_EXCEPT = False
- outFeat.setGeometry( tmpOutGeom )
- outFeat.setAttributeMap( attrs )
- writer.addFeature( outFeat )
+ add = False
+ if add:
+ outFeat.setAttributeMap( attrs )
+ writer.addFeature( outFeat )
del writer
- return GEOS_EXCEPT, True
+ return GEOS_EXCEPT, FEATURE_EXCEPT, True
def difference( self ):
GEOS_EXCEPT = True
+ FEATURE_EXCEPT = True
vproviderA = self.vlayerA.dataProvider()
allAttrsA = vproviderA.attributeIndexes()
vproviderA.select( allAttrsA )
@@ -460,28 +477,36 @@
vproviderA.rewind()
while vproviderA.nextFeature( inFeatA ):
nElement += 1
+ add = True
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
geom = QgsGeometry( inFeatA.geometry() )
+ diff_geom = QgsGeometry( geom )
atMap = inFeatA.attributeMap()
intersects = index.intersects( geom.boundingBox() )
for id in intersects:
vproviderB.featureAtId( int( id ), inFeatB , True, allAttrsB )
tmpGeom = QgsGeometry( inFeatB.geometry() )
try:
- if geom.intersects( tmpGeom ):
- geom = geom.difference( tmpGeom )
+ if diff_geom.intersects( tmpGeom ):
+ diff_geom = QgsGeometry( diff_geom.difference( tmpGeom ) )
except:
- geom = QgsGeometry()
GEOS_EXCEPT = False
+ add = False
break
- outFeat.setGeometry( geom )
- outFeat.setAttributeMap( atMap )
- writer.addFeature( outFeat )
+ if add:
+ try:
+ outFeat.setGeometry( diff_geom )
+ outFeat.setAttributeMap( atMap )
+ writer.addFeature( outFeat )
+ except:
+ FEATURE_EXCEPT = False
+ continue
del writer
- return GEOS_EXCEPT, crs_match
+ return GEOS_EXCEPT, FEATURE_EXCEPT, crs_match
def intersect( self ):
GEOS_EXCEPT = True
+ FEATURE_EXCEPT = True
vproviderA = self.vlayerA.dataProvider()
allAttrsA = vproviderA.attributeIndexes()
vproviderA.select( allAttrsA )
@@ -514,22 +539,27 @@
try:
if geom.intersects( tmpGeom ):
atMapB = inFeatB.attributeMap()
- int_geom = geom.intersection( tmpGeom )
+ int_geom = QgsGeometry( geom.intersection( tmpGeom ) )
if int_geom.wkbType() == 7:
int_com = geom.combine( tmpGeom )
int_sym = geom.symDifference( tmpGeom )
- int_geom = int_com.difference( int_sym )
- outFeat.setGeometry( int_geom )
- outFeat.setAttributeMap( ftools_utils.combineVectorAttributes( atMapA, atMapB ) )
- writer.addFeature( outFeat )
+ int_geom = QgsGeometry( int_com.difference( int_sym ) )
+ try:
+ outFeat.setGeometry( int_geom )
+ outFeat.setAttributeMap( ftools_utils.combineVectorAttributes( atMapA, atMapB ) )
+ writer.addFeature( outFeat )
+ except:
+ FEATURE_EXCEPT = False
+ continue
except:
GEOS_EXCEPT = False
- continue
+ break
del writer
- return True, crs_match
+ return GEOS_EXCEPT, FEATURE_EXCEPT, crs_match
def union( self ):
GEOS_EXCEPT = True
+ FEATURE_EXCEPT = True
vproviderA = self.vlayerA.dataProvider()
allAttrsA = vproviderA.attributeIndexes()
vproviderA.select( allAttrsA )
@@ -552,76 +582,99 @@
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
vproviderA.rewind()
while vproviderA.nextFeature( inFeatA ):
+ self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
nElement += 1
- self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
found = False
geom = QgsGeometry( inFeatA.geometry() )
diffGeom = QgsGeometry( inFeatA.geometry() )
atMapA = inFeatA.attributeMap()
intersects = indexA.intersects( geom.boundingBox() )
if len( intersects ) <= 0:
- outFeat.setGeometry( geom )
- outFeat.setAttributeMap( atMapA )
- writer.addFeature( outFeat )
+ try:
+ outFeat.setGeometry( geom )
+ outFeat.setAttributeMap( atMapA )
+ writer.addFeature( outFeat )
+ except:
+ FEATURE_EXCEPT = False
+ continue
else:
for id in intersects:
vproviderB.featureAtId( int( id ), inFeatB , True, allAttrsB )
atMapB = inFeatB.attributeMap()
tmpGeom = QgsGeometry( inFeatB.geometry() )
- if geom.intersects( tmpGeom ):
- found = True
- try:
- diff_geom = diff_geom.difference( tmpGeom )
- int_geom = geom.intersection( tmpGeom )
+ try:
+ if geom.intersects( tmpGeom ):
+ found = True
+ diff_geom = QgsGeometry( diff_geom.difference( tmpGeom ) )
+ int_geom = QgsGeometry( geom.intersection( tmpGeom ) )
if int_geom.wkbType() == 7:
int_com = geom.combine( tmpGeom )
int_sym = geom.symDifference( tmpGeom )
- int_geom = int_com.difference( int_sym )
- except:
- int_geom = QgsGeometry()
- GEOS_EXCEPT = False
- found = False
- break
- outFeat.setGeometry( int_geom )
- outFeat.setAttributeMap( ftools_utils.combineVectorAttributes( atMapA, atMapB ) )
+ int_geom = QgsGeometry( int_com.difference( int_sym ) )
+ try:
+ outFeat.setGeometry( int_geom )
+ outFeat.setAttributeMap( ftools_utils.combineVectorAttributes( atMapA, atMapB ) )
+ writer.addFeature( outFeat )
+ except:
+ FEATURE_EXCEPT = False
+ continue
+ except:
+ GEOS_EXCEPT = False
+ found = False
+ continue
+ if found:
+ try:
+ outFeat.setGeometry( diff_geom )
+ outFeat.setAttributeMap( atMapA )
writer.addFeature( outFeat )
- if found:
- outFeat.setGeometry( diff_geom )
- outFeat.setAttributeMap( atMapA )
- writer.addFeature( outFeat )
+ except:
+ FEATURE_EXCEPT = False
+ continue
length = len( vproviderA.fields().values() )
vproviderB.rewind()
while vproviderB.nextFeature( inFeatA ):
- nElement += 1
- self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
+ add = True
geom = QgsGeometry( inFeatA.geometry() )
+ diff_geom = QgsGeometry( geom )
atMap = inFeatA.attributeMap().values()
atMap = dict( zip( range( length, length + len( atMap ) ), atMap ) )
intersects = indexB.intersects( geom.boundingBox() )
if len(intersects) <= 0:
- outFeat.setGeometry( geom )
- outFeat.setAttributeMap( atMapA )
- writer.addFeature( outFeat )
+ try:
+ outFeat.setGeometry( diff_geom )
+ outFeat.setAttributeMap( atMapA )
+ writer.addFeature( outFeat )
+ except:
+ FEATURE_EXCEPT = False
+ continue
else:
for id in intersects:
vproviderA.featureAtId( int( id ), inFeatB , True, allAttrsA )
atMapB = inFeatB.attributeMap()
tmpGeom = QgsGeometry( inFeatB.geometry() )
try:
- if geom.intersects( tmpGeom ):
- geom = geom.difference( tmpGeom )
+ if diff_geom.intersects( tmpGeom ):
+ diff_geom = QgsGeometry( diff_geom.difference( tmpGeom ) )
except:
- geom = QgsGeometry()
+ add = False
GEOS_EXCEPT = False
+ break
+ if add:
+ try:
+ outFeat.setGeometry( diff_geom )
+ outFeat.setAttributeMap( atMap )
+ writer.addFeature( outFeat )
+ except:
+ FEATURE_EXCEPT = False
continue
- outFeat.setGeometry( geom )
- outFeat.setAttributeMap( atMap )
- writer.addFeature( outFeat )
+ self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
+ nElement += 1
del writer
- return True, crs_match
+ return GEOS_EXCEPT, FEATURE_EXCEPT, crs_match
def symetrical_difference( self ):
GEOS_EXCEPT = True
+ FEATURE_EXCEPT = True
vproviderA = self.vlayerA.dataProvider()
allAttrsA = vproviderA.attributeIndexes()
vproviderA.select( allAttrsA )
@@ -646,28 +699,37 @@
while vproviderA.nextFeature( inFeatA ):
nElement += 1
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
+ add = True
geom = QgsGeometry( inFeatA.geometry() )
+ diff_geom = QgsGeometry( geom )
atMapA = inFeatA.attributeMap()
intersects = indexA.intersects( geom.boundingBox() )
for id in intersects:
vproviderB.featureAtId( int( id ), inFeatB , True, allAttrsB )
tmpGeom = QgsGeometry( inFeatB.geometry() )
try:
- if geom.intersects( tmpGeom ):
- geom = geom.difference( tmpGeom )
+ if diff_geom.intersects( tmpGeom ):
+ diff_geom = QgsGeometry( diff_geom.difference( tmpGeom ) )
except:
- geom = QgsGeometry()
+ add = False
GEOS_EXCEPT = False
+ break
+ if add:
+ try:
+ outFeat.setGeometry( diff_geom )
+ outFeat.setAttributeMap( atMapA )
+ writer.addFeature( outFeat )
+ except:
+ FEATURE_EXCEPT = False
continue
- outFeat.setGeometry( geom )
- outFeat.setAttributeMap( atMapA )
- writer.addFeature( outFeat )
length = len( vproviderA.fields().values() )
vproviderB.rewind()
while vproviderB.nextFeature( inFeatA ):
nElement += 1
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
+ add = True
geom = QgsGeometry( inFeatA.geometry() )
+ diff_geom = QgsGeometry( geom )
atMap = inFeatA.attributeMap().values()
atMap = dict( zip( range( length, length + len( atMap ) ), atMap ) )
intersects = indexB.intersects( geom.boundingBox() )
@@ -675,20 +737,26 @@
vproviderA.featureAtId( int( id ), inFeatB , True, allAttrsA )
tmpGeom = QgsGeometry( inFeatB.geometry() )
try:
- if geom.intersects( tmpGeom ):
- geom = geom.difference( tmpGeom )
+ if diff_geom.intersects( tmpGeom ):
+ diff_geom = QgsGeometry( diff_geom.difference( tmpGeom ) )
except:
- geom = QgsGeometry()
+ add = False
GEOS_EXCEPT = False
+ break
+ if add:
+ try:
+ outFeat.setGeometry( diff_geom )
+ outFeat.setAttributeMap( atMap )
+ writer.addFeature( outFeat )
+ except:
+ FEATURE_EXCEPT = False
continue
- outFeat.setGeometry( geom )
- outFeat.setAttributeMap( atMap )
- writer.addFeature( outFeat )
del writer
- return GEOS_EXCEPT, crs_match
+ return GEOS_EXCEPT, FEATURE_EXCEPT, crs_match
def clip( self ):
GEOS_EXCEPT = True
+ FEATURE_EXCEPT = True
vproviderA = self.vlayerA.dataProvider()
allAttrsA = vproviderA.attributeIndexes()
vproviderA.select( allAttrsA )
@@ -720,19 +788,23 @@
tmpGeom = QgsGeometry( inFeatB.geometry() )
try:
if geom.intersects( tmpGeom ):
- int_geom = geom.intersection( tmpGeom )
+ int_geom = QgsGeometry( geom.intersection( tmpGeom ) )
if int_geom.wkbType() == 7:
int_com = geom.combine( tmpGeom )
int_sym = geom.symDifference( tmpGeom )
- int_geom = int_com.difference( int_sym )
- outFeat.setGeometry( int_geom )
- outFeat.setAttributeMap( atMap )
- writer.addFeature( outFeat )
+ int_geom = QgsGeometry( int_com.difference( int_sym ) )
+ try:
+ outFeat.setGeometry( int_geom )
+ outFeat.setAttributeMap( atMap )
+ writer.addFeature( outFeat )
+ except:
+ FEATURE_EXCEPT = False
+ continue
except:
GEOS_EXCEPT = False
- continue
+ break
del writer
- return GEOS_EXCEPT, crs_match
+ return GEOS_EXCEPT, FEATURE_EXCEPT, crs_match
def checkParameter( self, layer, param ):
if self.myFunction == 1:
More information about the QGIS-commit
mailing list