Пример #1
0
 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())
Пример #2
0
 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")
Пример #3
0
    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
Пример #4
0
 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")
Пример #5
0
 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")
Пример #6
0
 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")
Пример #7
0
 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())
Пример #8
0
 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")
Пример #9
0
 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")
Пример #10
0
 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)
Пример #11
0
 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")
Пример #12
0
 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")
Пример #13
0
 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)