Skip to content

Commit c989673

Browse files
committed
Test improvements - moved writeShape to utilities for DRY. Added clip test to geometry python tests.
1 parent 9f71d9f commit c989673

File tree

4 files changed

+145
-38
lines changed

4 files changed

+145
-38
lines changed

tests/src/python/test_qgsgeometry.py

+106-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
__revision__ = '$Format:%H$'
1414

1515
import os
16+
17+
from PyQt4.QtCore import QVariant
18+
1619
from qgis.core import (QgsGeometry,
1720
QgsVectorLayer,
1821
QgsFeature,
@@ -23,7 +26,8 @@
2326
TestCase,
2427
unittest,
2528
expectedFailure,
26-
unitTestDataPath)
29+
unitTestDataPath,
30+
writeShape)
2731
# Convenience instances in case you may need them
2832
# not used in this test
2933

@@ -241,6 +245,107 @@ def testSimplifyIssue4189(self):
241245
myMinimumLength = len('POLYGON(())')
242246
assert myEndLength > myMinimumLength, myMessage
243247

248+
def testClipping(self):
249+
"""Test that we can clip geometries using other geometries."""
250+
"""Check we can write a vector file."""
251+
myMemoryLayer = QgsVectorLayer(
252+
('LineString?crs=epsg:4326&field=name:string(20)&index=yes'),
253+
'clip-in',
254+
'memory')
255+
256+
assert myMemoryLayer is not None, 'Provider not initialised'
257+
myProvider = myMemoryLayer.dataProvider()
258+
assert myProvider is not None
259+
260+
myFeature1 = QgsFeature()
261+
myFeature1.setGeometry(QgsGeometry.fromPolyline([
262+
QgsPoint(10,10),
263+
QgsPoint(20,10),
264+
QgsPoint(30,10),
265+
QgsPoint(40,10),
266+
]
267+
))
268+
myFeature1.setAttributeMap({0 : QVariant('Johny')})
269+
270+
myFeature2 = QgsFeature()
271+
myFeature2.setGeometry(QgsGeometry.fromPolyline([
272+
QgsPoint(10,10),
273+
QgsPoint(20,20),
274+
QgsPoint(30,30),
275+
QgsPoint(40,40),
276+
]
277+
))
278+
myFeature2.setAttributeMap({0 : QVariant('Be')})
279+
280+
myFeature3 = QgsFeature()
281+
myFeature3.setGeometry(QgsGeometry.fromPolyline([
282+
QgsPoint(10,10),
283+
QgsPoint(10,20),
284+
QgsPoint(10,30),
285+
QgsPoint(10,40),
286+
]
287+
))
288+
289+
myFeature3.setAttributeMap({0 : QVariant('Good')})
290+
291+
myResult, myFeatures = myProvider.addFeatures(
292+
[myFeature1, myFeature2, myFeature3])
293+
assert myResult == True
294+
assert len(myFeatures) == 3
295+
296+
myClipPolygon = QgsGeometry.fromPolygon([[
297+
QgsPoint(20,20),
298+
QgsPoint(20,30),
299+
QgsPoint(30,30),
300+
QgsPoint(30,20),
301+
QgsPoint(20,20),
302+
]]
303+
)
304+
print 'Clip: %s' % myClipPolygon.exportToWkt()
305+
writeShape(myMemoryLayer, 'clipGeometryBefore.shp')
306+
myProvider.rewind()
307+
myProvider.select(myProvider.attributeIndexes())
308+
myFeatures = []
309+
myFeature = QgsFeature()
310+
while myProvider.nextFeature(myFeature):
311+
myGeometry = myFeature.geometry()
312+
if myGeometry.intersects(myClipPolygon):
313+
# Adds nodes where the clip and the line intersec
314+
myCombinedGeometry = myGeometry.combine(myClipPolygon)
315+
# Gives you the areas inside the clip
316+
mySymmetricalGeometry = myGeometry.symDifference(
317+
myCombinedGeometry)
318+
# Gives you areas outside the clip area
319+
myDifferenceGeometry = myCombinedGeometry.difference(
320+
myClipPolygon)
321+
#print 'Original: %s' % myGeometry.exportToWkt()
322+
#print 'Combined: %s' % myCombinedGeometry.exportToWkt()
323+
#print 'Difference: %s' % myDifferenceGeometry.exportToWkt()
324+
print 'Symmetrical: %s' % mySymmetricalGeometry.exportToWkt()
325+
326+
myExpectedWkt = 'LINESTRING(20.0 20.0, 30.0 30.0)'
327+
# There should only be one feature that intersects this clip
328+
# poly so this assertion should work.
329+
self.assertEqual(myExpectedWkt,
330+
mySymmetricalGeometry.exportToWkt())
331+
332+
myNewFeature = QgsFeature()
333+
myNewFeature.setAttributeMap(myFeature.attributeMap())
334+
myNewFeature.setGeometry(mySymmetricalGeometry)
335+
myFeatures.append(myNewFeature)
336+
337+
myNewMemoryLayer = QgsVectorLayer(
338+
('LineString?crs=epsg:4326&field=name:string(20)&index=yes'),
339+
'clip-out',
340+
'memory')
341+
myNewProvider = myNewMemoryLayer.dataProvider()
342+
myResult, myFeatures = myNewProvider.addFeatures(myFeatures)
343+
self.assertTrue(myResult)
344+
self.assertEqual(len(myFeatures), 1)
345+
myNewMemoryLayer.commitChanges()
346+
347+
writeShape(myNewMemoryLayer, 'clipGeometryAfter.shp')
348+
244349
if __name__ == '__main__':
245350
unittest.main()
246351

tests/src/python/test_qgsmemoryprovider.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -75,28 +75,28 @@ def testAddFeatures(self):
7575
f = QgsFeature()
7676
provider.select()
7777
while provider.nextFeature(f):
78-
attrMap = f.attributeMap()
79-
myMessage = ('Expected: %s\nGot: %s\n' %
78+
attrMap = f.attributeMap()
79+
myMessage = ('Expected: %s\nGot: %s\n' %
8080
("Johny", str(attrMap[0].toString())))
8181

82-
assert str(attrMap[0].toString()) == "Johny", myMessage
82+
assert str(attrMap[0].toString()) == "Johny", myMessage
8383

84-
myMessage = ('Expected: %s\nGot: %s\n' %
84+
myMessage = ('Expected: %s\nGot: %s\n' %
8585
(20, attrMap[1].toInt()[0]))
8686

87-
assert attrMap[1].toInt()[0] == 20, myMessage
87+
assert attrMap[1].toInt()[0] == 20, myMessage
8888

89-
myMessage = ('Expected: %s\nGot: %s\n' %
89+
myMessage = ('Expected: %s\nGot: %s\n' %
9090
(0.3, attrMap[2].toFloat()[0]))
9191

92-
assert (attrMap[0].toFloat()[0] - 0.3) < 0.0000001, myMessage
92+
assert (attrMap[0].toFloat()[0] - 0.3) < 0.0000001, myMessage
9393

94-
geom = f.geometry()
94+
geom = f.geometry()
9595

96-
myMessage = ('Expected: %s\nGot: %s\n' %
96+
myMessage = ('Expected: %s\nGot: %s\n' %
9797
("POINT(10.0 10.0)", str(geom.exportToWkt())))
9898

99-
assert str(geom.exportToWkt()) == "POINT(10.0 10.0)", myMessage
99+
assert str(geom.exportToWkt()) == "POINT(10.0 10.0)", myMessage
100100

101101
def testFromUri(self):
102102
"""Test we can construct the mem provider from a uri"""

tests/src/python/test_qgsvectorfilewriter.py

+4-25
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@
1818

1919
from qgis.core import (QgsVectorLayer,
2020
QgsFeature,
21-
QgsField,
2221
QgsGeometry,
2322
QgsPoint,
2423
QgsVectorFileWriter,
2524
QgsCoordinateReferenceSystem)
2625

27-
from utilities import (unitTestDataPath,
26+
from utilities import (#unitTestDataPath,
2827
getQgisTestApp,
2928
TestCase,
3029
unittest,
31-
expectedFailure
30+
#expectedFailure,
31+
writeShape
3232
)
3333
QGISAPP, CANVAS, IFACE, PARENT = getQgisTestApp()
3434

@@ -58,28 +58,7 @@ def testWrite(self):
5858
assert myResult == True
5959
assert len(myFeatures) > 0
6060

61-
myFileName = os.path.join(str(QDir.tempPath()), 'writetest.shp')
62-
print myFileName
63-
# Explicitly giving all options, not really needed but nice for clarity
64-
myErrorMessage = QString()
65-
myOptions = QStringList()
66-
myLayerOptions = QStringList()
67-
mySelectedOnlyFlag = False
68-
mySkipAttributesFlag = False
69-
myGeoCrs = QgsCoordinateReferenceSystem()
70-
myGeoCrs.createFromId(4326, QgsCoordinateReferenceSystem.EpsgCrsId)
71-
myResult = QgsVectorFileWriter.writeAsVectorFormat(
72-
self.mMemoryLayer,
73-
myFileName,
74-
'utf-8',
75-
myGeoCrs,
76-
'ESRI Shapefile',
77-
mySelectedOnlyFlag,
78-
myErrorMessage,
79-
myOptions,
80-
myLayerOptions,
81-
mySkipAttributesFlag)
82-
assert myResult == QgsVectorFileWriter.NoError
61+
writeShape(self.mMemoryLayer, 'writetest.shp')
8362

8463
if __name__ == '__main__':
8564
unittest.main()

tests/src/python/utilities.py

+25-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
import sys
1616
from PyQt4 import QtGui, QtCore
1717
from qgis.core import (QgsApplication,
18-
QgsCoordinateReferenceSystem)
18+
QgsCoordinateReferenceSystem,
19+
QgsVectorFileWriter)
1920
from qgis.gui import QgsMapCanvas
2021
from qgis_interface import QgisInterface
2122
import hashlib
@@ -159,4 +160,26 @@ def setCanvasCrs(theEpsgId, theOtfpFlag=False):
159160
# Reproject all layers to WGS84 geographic CRS
160161
CANVAS.mapRenderer().setDestinationCrs(myCrs)
161162

162-
163+
def writeShape(theMemoryLayer, theFileName):
164+
myFileName = os.path.join(str(QtCore.QDir.tempPath()), theFileName)
165+
print myFileName
166+
# Explicitly giving all options, not really needed but nice for clarity
167+
myErrorMessage = QtCore.QString()
168+
myOptions = QtCore.QStringList()
169+
myLayerOptions = QtCore.QStringList()
170+
mySelectedOnlyFlag = False
171+
mySkipAttributesFlag = False
172+
myGeoCrs = QgsCoordinateReferenceSystem()
173+
myGeoCrs.createFromId(4326, QgsCoordinateReferenceSystem.EpsgCrsId)
174+
myResult = QgsVectorFileWriter.writeAsVectorFormat(
175+
theMemoryLayer,
176+
myFileName,
177+
'utf-8',
178+
myGeoCrs,
179+
'ESRI Shapefile',
180+
mySelectedOnlyFlag,
181+
myErrorMessage,
182+
myOptions,
183+
myLayerOptions,
184+
mySkipAttributesFlag)
185+
assert myResult == QgsVectorFileWriter.NoError

0 commit comments

Comments
 (0)