コード例 #1
0
    def createGeopkgLayer(self, filepath, featureIterator):
        fields, geomAtt = self._fields()
        qgsfields = QgsFields()
        for f in fields:
            qgsfields.append(f)
        writer = QgsVectorFileWriter(
            filepath,
            "UTF-8",
            qgsfields,
            FeatureTypeHelper.typeNameConverter[geomAtt.type.lower()],
            QgsCoordinateReferenceSystem(geomAtt.SRS),
            driverName="GPKG")

        BATCHSIZE = 500

        def _batch(iterable, size):
            sourceiter = iter(iterable)
            while True:
                batchiter = islice(sourceiter, size)
                try:
                    yield chain([next(batchiter)], batchiter)
                except StopIteration:
                    return

        for batch in _batch(featureIterator, BATCHSIZE):
            success = writer.addFeatures(batch)
            if not success:
                error = writer.errorMessage()
                del writer
                raise Exception("geopkg save: " + error)
        writer.flushBuffer()
        # the only way to close the writer is to call the C++ destructor -- we use sip to do this
        sip.delete(writer)
        del writer  # remove from python
        addAuditTables(filepath)