def test_ValidFeature(self): myPath = os.path.join(unitTestDataPath(), 'points.shp') myLayer = QgsVectorLayer(myPath, 'Points', 'ogr') provider = myLayer.dataProvider() allAttrs = provider.attributeIndexes() myLayer.select(allAttrs) feat = QgsFeature() myLayer.nextFeature(feat) myValidValue = feat.isValid() myMessage = '\nExpected: %s\nGot: %s' % ("True", myValidValue) assert myValidValue == True, myMessage
def test_Attributes(self): myPath = os.path.join(unitTestDataPath(), 'lines.shp') myLayer = QgsVectorLayer(myPath, 'Lines', 'ogr') provider = myLayer.dataProvider() allAttrs = provider.attributeIndexes() myLayer.select(allAttrs) feat = QgsFeature() myLayer.nextFeature(feat) myAttributes = feat.attributes() myExpectedAttributes = [ QVariant("Highway"), QVariant(1) ] # Only for printing purposes myAttributeDict = [ str(myAttributes[0].toString()), int(myAttributes[1].toString()) ] myExpectedAttributes = [ "Highway", 1 ] myMessage = '\nExpected: %s\nGot: %s' % (myExpectedAttributes, myAttributes) assert myAttributes == myExpectedAttributes, myMessage
def testClipping(self): """Test that we can clip geometries using other geometries.""" myMemoryLayer = QgsVectorLayer( ('LineString?crs=epsg:4326&field=name:string(20)&index=yes'), 'clip-in', 'memory') assert myMemoryLayer is not None, 'Provider not initialised' myProvider = myMemoryLayer.dataProvider() assert myProvider is not None myFeature1 = QgsFeature() myFeature1.setGeometry(QgsGeometry.fromPolyline([ QgsPoint(10,10), QgsPoint(20,10), QgsPoint(30,10), QgsPoint(40,10), ] )) myFeature1.setAttributes([QVariant('Johny')]) myFeature2 = QgsFeature() myFeature2.setGeometry(QgsGeometry.fromPolyline([ QgsPoint(10,10), QgsPoint(20,20), QgsPoint(30,30), QgsPoint(40,40), ] )) myFeature2.setAttributes([QVariant('Be')]) myFeature3 = QgsFeature() myFeature3.setGeometry(QgsGeometry.fromPolyline([ QgsPoint(10,10), QgsPoint(10,20), QgsPoint(10,30), QgsPoint(10,40), ] )) myFeature3.setAttributes([QVariant('Good')]) myResult, myFeatures = myProvider.addFeatures( [myFeature1, myFeature2, myFeature3]) assert myResult == True assert len(myFeatures) == 3 myClipPolygon = QgsGeometry.fromPolygon([[ QgsPoint(20,20), QgsPoint(20,30), QgsPoint(30,30), QgsPoint(30,20), QgsPoint(20,20), ]] ) print 'Clip: %s' % myClipPolygon.exportToWkt() writeShape(myMemoryLayer, 'clipGeometryBefore.shp') myMemoryLayer.select(myProvider.attributeIndexes()) myFeatures = [] myFeature = QgsFeature() while myMemoryLayer.nextFeature(myFeature): myGeometry = myFeature.geometry() if myGeometry.intersects(myClipPolygon): # Adds nodes where the clip and the line intersec myCombinedGeometry = myGeometry.combine(myClipPolygon) # Gives you the areas inside the clip mySymmetricalGeometry = myGeometry.symDifference( myCombinedGeometry) # Gives you areas outside the clip area # myDifferenceGeometry = myCombinedGeometry.difference( # myClipPolygon) #print 'Original: %s' % myGeometry.exportToWkt() #print 'Combined: %s' % myCombinedGeometry.exportToWkt() #print 'Difference: %s' % myDifferenceGeometry.exportToWkt() print 'Symmetrical: %s' % mySymmetricalGeometry.exportToWkt() myExpectedWkt = 'LINESTRING(20.0 20.0, 30.0 30.0)' # There should only be one feature that intersects this clip # poly so this assertion should work. self.assertEqual(myExpectedWkt, mySymmetricalGeometry.exportToWkt()) myNewFeature = QgsFeature() myNewFeature.setAttributes(myFeature.attributes()) myNewFeature.setGeometry(mySymmetricalGeometry) myFeatures.append(myNewFeature) myNewMemoryLayer = QgsVectorLayer( ('LineString?crs=epsg:4326&field=name:string(20)&index=yes'), 'clip-out', 'memory') myNewProvider = myNewMemoryLayer.dataProvider() myResult, myFeatures = myNewProvider.addFeatures(myFeatures) self.assertTrue(myResult) self.assertEqual(len(myFeatures), 1) writeShape(myNewMemoryLayer, 'clipGeometryAfter.shp')