def test_SplitFeatureWithMultiKey(self): """Create spatialite database""" layer = QgsVectorLayer("dbname=%s table=test_pg_mk (geometry)" % self.dbname, "test_pg_mk", "spatialite") self.assertTrue(layer.isValid()) self.assertTrue(layer.hasGeometryType()) layer.startEditing() self.assertEqual(layer.splitFeatures([QgsPoint(0.5, -0.5), QgsPoint(0.5, 1.5)], 0), 0) self.assertEqual(layer.splitFeatures([QgsPoint(-0.5, 0.5), QgsPoint(1.5, 0.5)], 0), 0) self.assertTrue(layer.commitChanges())
def test_SplitTruToCreateCutEdge(self): """Try to creat a cut edge""" layer = QgsVectorLayer("dbname=test.sqlite table=test_pg (geometry)", "test_pg", "spatialite") assert(layer.isValid()) assert(layer.hasGeometryType()) layer.featureCount() == 1 or die("wrong number of features") layer.startEditing() layer.splitFeatures([QgsPoint(1.5, -0.5), QgsPoint(1.5, 1.5)], 0) == 0 or die("error when trying to create an invalid polygon in split") layer.commitChanges() or die("this commit should work") layer.featureCount() == 1 or die("wrong number of features, polygon should be unafected by cut")
def create_layer(self, parameters, name, is_memory, dest_crs, layer_style=None): save_as = parameters.file_path file_format = parameters.file_format # save paramaters serialized = base64.b64encode(parameters.serialize(with_style=False, with_geometry=False)) # save geometry layer = QgsVectorLayer("MultiPolygon?crs=%s" % dest_crs.authid(), name, "memory") pr = layer.dataProvider() layer.startEditing() layer.addAttribute(QgsField("params", QVariant.String)) fet1 = QgsFeature(0) fet1.setFields(layer.fields()) fet1.setAttribute("params", str(serialized)[2:-1]) fet1.setGeometry(parameters.geometry) pr.addFeatures([fet1]) layer.commitChanges() # copy layer style if layer_style is not None: self.set_layer_style(layer, layer_style) if is_memory: return layer if os.path.isfile(save_as): # delete first if already exists if save_as.endswith(".shp"): QgsVectorFileWriter.deleteShapeFile(save_as) else: os.unlink(save_as) # create the disk layer QgsMessageLog.logMessage("Mask saving '{}' as {}".format(save_as, file_format), 'Extensions') error = QgsVectorFileWriter.writeAsVectorFormat(layer, save_as, "System", dest_crs, file_format) if error == 0: nlayer = QgsVectorLayer(save_as, name, "ogr") if not nlayer.dataProvider().isValid(): return None if not nlayer.hasGeometryType(): return None # force CRS nlayer.setCrs(dest_crs) # copy layer style layer_style = self.get_layer_style(layer) self.set_layer_style(nlayer, layer_style) return nlayer else: raise RuntimeError(error) return None
def test_SplitMultipolygon(self): """Split multipolygon""" layer = QgsVectorLayer("dbname=test.sqlite table=test_mpg (geometry)", "test_mpg", "spatialite") assert(layer.isValid()) assert(layer.hasGeometryType()) layer.featureCount() == 1 or die("wrong number of features") layer.startEditing() layer.splitFeatures([QgsPoint(0.5, -0.5), QgsPoint(0.5, 1.5)], 0) == 0 or die("error in split of one polygon of multipolygon") layer.splitFeatures([QgsPoint(2.5, -0.5), QgsPoint(2.5, 4)], 0) == 0 or die("error in split of two polygons of multipolygon at a time") layer.commitChanges() or die("this commit should work") layer.featureCount() == 7 or die("wrong number of features after 2 split")
def test_SplitFeature(self): """Create spatialite database""" layer = QgsVectorLayer("dbname=%s table=test_pg (geometry)" % self.dbname, "test_pg", "spatialite") assert(layer.isValid()) assert(layer.hasGeometryType()) layer.startEditing() layer.splitFeatures([QgsPoint(0.5, -0.5), QgsPoint(0.5, 1.5)], 0) == 0 or die("error in split") layer.splitFeatures([QgsPoint(-0.5, 0.5), QgsPoint(1.5, 0.5)], 0) == 0 or die("error in split") if not layer.commitChanges(): die("this commit should work") layer.featureCount() == 4 or die("we should have 4 features after 2 split")
def test_SplitTruToCreateCutEdge(self): """Try to creat a cut edge""" layer = QgsVectorLayer("dbname=test.sqlite table=test_pg (geometry)", "test_pg", "spatialite") assert (layer.isValid()) assert (layer.hasGeometryType()) layer.featureCount() == 1 or die("wrong number of features") layer.startEditing() layer.splitFeatures( [QgsPoint(1.5, -0.5), QgsPoint(1.5, 1.5)], 0) == 0 or die( "error when trying to create an invalid polygon in split") layer.commitChanges() or die("this commit should work") layer.featureCount() == 1 or die( "wrong number of features, polygon should be unafected by cut")
def test_SplitFeatureWithMultiKey(self): """Create spatialite database""" layer = QgsVectorLayer( "dbname=%s table=test_pg_mk (geometry)" % self.dbname, "test_pg_mk", "spatialite") self.assertTrue(layer.isValid()) self.assertTrue(layer.hasGeometryType()) layer.startEditing() self.assertEqual( layer.splitFeatures( [QgsPoint(0.5, -0.5), QgsPoint(0.5, 1.5)], 0), 0) self.assertEqual( layer.splitFeatures( [QgsPoint(-0.5, 0.5), QgsPoint(1.5, 0.5)], 0), 0) self.assertTrue(layer.commitChanges())
def test_SplitFeature(self): """Create spatialite database""" layer = QgsVectorLayer( "dbname=%s table=test_pg (geometry)" % self.dbname, "test_pg", "spatialite") assert (layer.isValid()) assert (layer.hasGeometryType()) layer.startEditing() layer.splitFeatures([QgsPoint( 0.5, -0.5), QgsPoint(0.5, 1.5)], 0) == 0 or die("error in split") layer.splitFeatures([QgsPoint( -0.5, 0.5), QgsPoint(1.5, 0.5)], 0) == 0 or die("error in split") if not layer.commitChanges(): die("this commit should work") layer.featureCount() == 4 or die( "we should have 4 features after 2 split")
def test_SplitMultipolygon(self): """Split multipolygon""" layer = QgsVectorLayer("dbname=test.sqlite table=test_mpg (geometry)", "test_mpg", "spatialite") assert (layer.isValid()) assert (layer.hasGeometryType()) layer.featureCount() == 1 or die("wrong number of features") layer.startEditing() layer.splitFeatures( [QgsPoint(0.5, -0.5), QgsPoint(0.5, 1.5)], 0) == 0 or die("error in split of one polygon of multipolygon") layer.splitFeatures( [QgsPoint(2.5, -0.5), QgsPoint(2.5, 4)], 0) == 0 or die( "error in split of two polygons of multipolygon at a time") layer.commitChanges() or die("this commit should work") layer.featureCount() == 7 or die( "wrong number of features after 2 split")
def xtest_SplitFeatureWithFailedCommit(self): """Create spatialite database""" layer = QgsVectorLayer("dbname=%s table=test_pg_mk (geometry)" % self.dbname, "test_pg_mk", "spatialite") self.assertTrue(layer.isValid()) self.assertTrue(layer.hasGeometryType()) layer.startEditing() self.asserEqual(layer.splitFeatures([QgsPoint(0.5, -0.5), QgsPoint(0.5, 1.5)], 0), 0) self.asserEqual(layer.splitFeatures([QgsPoint(-0.5, 0.5), QgsPoint(1.5, 0.5)], 0), 0) self.assertFalse(layer.commitChanges()) layer.rollBack() feat = next(layer.getFeatures()) ref = [[(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)]] res = feat.geometry().asPolygon() for ring1, ring2 in zip(ref, res): for p1, p2 in zip(ring1, ring2): for c1, c2 in zip(p1, p2): self.asserEqual(c1, c2)
def xtest_SplitFeatureWithFailedCommit(self): """Create spatialite database""" layer = QgsVectorLayer("dbname=%s table=test_pg_mk (geometry)" % self.dbname, "test_pg_mk", "spatialite") assert(layer.isValid()) assert(layer.hasGeometryType()) layer.startEditing() layer.splitFeatures([QgsPoint(0.5, -0.5), QgsPoint(0.5, 1.5)], 0) == 0 or die("error in split") layer.splitFeatures([QgsPoint(-0.5, 0.5), QgsPoint(1.5, 0.5)], 0) == 0 or die("error in split") if layer.commitChanges(): die("this commit should fail") layer.rollBack() feat = QgsFeature() it = layer.getFeatures() it.nextFeature(feat) ref = [[(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)]] res = feat.geometry().asPolygon() for ring1, ring2 in zip(ref, res): for p1, p2 in zip(ring1, ring2): for c1, c2 in zip(p1, p2): c1 == c2 or die("polygon has been altered by failed edition")
def xtest_SplitFeatureWithFailedCommit(self): """Create spatialite database""" layer = QgsVectorLayer("dbname=%s table=test_pg_mk (geometry)" % self.dbname, "test_pg_mk", "spatialite") assert(layer.isValid()) assert(layer.hasGeometryType()) layer.startEditing() layer.splitFeatures([QgsPoint(0.5, -0.5), QgsPoint(0.5, 1.5)], 0)==0 or die("error in split") layer.splitFeatures([QgsPoint(-0.5, 0.5), QgsPoint(1.5, 0.5)], 0)==0 or die("error in split") if layer.commitChanges(): die("this commit should fail") layer.rollBack() feat = QgsFeature() it=layer.getFeatures() it.nextFeature(feat) ref = [[(0,0), (1,0), (1,1), (0,1), (0,0)]] res = feat.geometry().asPolygon() for ring1, ring2 in zip(ref, res): for p1, p2 in zip(ring1, ring2): for c1, c2 in zip(p1, p2): c1 == c2 or die("polygon has been altered by failed edition")
def xtest_SplitFeatureWithFailedCommit(self): """Create spatialite database""" layer = QgsVectorLayer( "dbname=%s table=test_pg_mk (geometry)" % self.dbname, "test_pg_mk", "spatialite") self.assertTrue(layer.isValid()) self.assertTrue(layer.hasGeometryType()) layer.startEditing() self.asserEqual( layer.splitFeatures( [QgsPoint(0.5, -0.5), QgsPoint(0.5, 1.5)], 0), 0) self.asserEqual( layer.splitFeatures( [QgsPoint(-0.5, 0.5), QgsPoint(1.5, 0.5)], 0), 0) self.assertFalse(layer.commitChanges()) layer.rollBack() feat = next(layer.getFeatures()) ref = [[(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)]] res = feat.geometry().asPolygon() for ring1, ring2 in zip(ref, res): for p1, p2 in zip(ring1, ring2): for c1, c2 in zip(p1, p2): self.asserEqual(c1, c2)