Skip to content

Commit fa8b216

Browse files
authored
[processing] restore import into spatialite & spatialite execute sql
1 parent bfb41a1 commit fa8b216

File tree

3 files changed

+85
-65
lines changed

3 files changed

+85
-65
lines changed

python/plugins/processing/algs/qgis/ImportIntoSpatialite.py

Lines changed: 63 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,16 @@
2929
QgsFeatureSink,
3030
QgsVectorLayerExporter,
3131
QgsApplication,
32-
QgsProcessingUtils)
32+
QgsProcessingUtils,
33+
QgsProcessingParameterFeatureSource,
34+
QgsProcessingParameterVectorLayer,
35+
QgsProcessingParameterField,
36+
QgsProcessingParameterString,
37+
QgsProcessingParameterBoolean,
38+
QgsWkbTypes)
3339

3440
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
3541
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
36-
from processing.core.parameters import ParameterBoolean
37-
from processing.core.parameters import ParameterVector
38-
from processing.core.parameters import ParameterString
39-
from processing.core.parameters import ParameterTableField
4042
from processing.tools import spatialite
4143

4244

@@ -59,17 +61,17 @@ def group(self):
5961

6062
def __init__(self):
6163
super().__init__()
62-
self.addParameter(ParameterVector(self.INPUT, self.tr('Layer to import')))
63-
self.addParameter(ParameterVector(self.DATABASE, self.tr('File database'), False, False))
64-
self.addParameter(ParameterString(self.TABLENAME, self.tr('Table to import to (leave blank to use layer name)'), optional=True))
65-
self.addParameter(ParameterTableField(self.PRIMARY_KEY, self.tr('Primary key field'), self.INPUT, optional=True))
66-
self.addParameter(ParameterString(self.GEOMETRY_COLUMN, self.tr('Geometry column'), 'geom'))
67-
self.addParameter(ParameterString(self.ENCODING, self.tr('Encoding'), 'UTF-8', optional=True))
68-
self.addParameter(ParameterBoolean(self.OVERWRITE, self.tr('Overwrite'), True))
69-
self.addParameter(ParameterBoolean(self.CREATEINDEX, self.tr('Create spatial index'), True))
70-
self.addParameter(ParameterBoolean(self.LOWERCASE_NAMES, self.tr('Convert field names to lowercase'), True))
71-
self.addParameter(ParameterBoolean(self.DROP_STRING_LENGTH, self.tr('Drop length constraints on character fields'), False))
72-
self.addParameter(ParameterBoolean(self.FORCE_SINGLEPART, self.tr('Create single-part geometries instead of multi-part'), False))
64+
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, self.tr('Layer to import')))
65+
self.addParameter(QgsProcessingParameterVectorLayer(self.DATABASE, self.tr('File database'), False, False))
66+
self.addParameter(QgsProcessingParameterString(self.TABLENAME, self.tr('Table to import to (leave blank to use layer name)'), optional=True))
67+
self.addParameter(QgsProcessingParameterField(self.PRIMARY_KEY, self.tr('Primary key field'), self.INPUT, optional=True))
68+
self.addParameter(QgsProcessingParameterString(self.GEOMETRY_COLUMN, self.tr('Geometry column'), 'geom'))
69+
self.addParameter(QgsProcessingParameterString(self.ENCODING, self.tr('Encoding'), 'UTF-8', optional=True))
70+
self.addParameter(QgsProcessingParameterBoolean(self.OVERWRITE, self.tr('Overwrite'), True))
71+
self.addParameter(QgsProcessingParameterBoolean(self.CREATEINDEX, self.tr('Create spatial index'), True))
72+
self.addParameter(QgsProcessingParameterBoolean(self.LOWERCASE_NAMES, self.tr('Convert field names to lowercase'), True))
73+
self.addParameter(QgsProcessingParameterBoolean(self.DROP_STRING_LENGTH, self.tr('Drop length constraints on character fields'), False))
74+
self.addParameter(QgsProcessingParameterBoolean(self.FORCE_SINGLEPART, self.tr('Create single-part geometries instead of multi-part'), False))
7375

7476
def name(self):
7577
return 'importintospatialite'
@@ -78,36 +80,37 @@ def displayName(self):
7880
return self.tr('Import into Spatialite')
7981

8082
def processAlgorithm(self, parameters, context, feedback):
81-
database = self.getParameterValue(self.DATABASE)
82-
uri = QgsDataSourceUri(database)
83+
database = self.parameterAsVectorLayer(parameters, self.DATABASE, context)
84+
databaseuri = database.dataProvider().dataSourceUri()
85+
uri = QgsDataSourceUri(databaseuri)
8386
if uri.database() is '':
84-
if '|layerid' in database:
85-
database = database[:database.find('|layerid')]
86-
uri = QgsDataSourceUri('dbname=\'%s\'' % (database))
87+
if '|layerid' in databaseuri:
88+
databaseuri = databaseuri[:databaseuri.find('|layerid')]
89+
uri = QgsDataSourceUri('dbname=\'%s\'' % (databaseuri))
8790
db = spatialite.GeoDB(uri)
8891

89-
overwrite = self.getParameterValue(self.OVERWRITE)
90-
createIndex = self.getParameterValue(self.CREATEINDEX)
91-
convertLowerCase = self.getParameterValue(self.LOWERCASE_NAMES)
92-
dropStringLength = self.getParameterValue(self.DROP_STRING_LENGTH)
93-
forceSinglePart = self.getParameterValue(self.FORCE_SINGLEPART)
94-
primaryKeyField = self.getParameterValue(self.PRIMARY_KEY) or 'id'
95-
encoding = self.getParameterValue(self.ENCODING)
92+
overwrite = self.parameterAsBool(parameters, self.OVERWRITE, context)
93+
createIndex = self.parameterAsBool(parameters, self.CREATEINDEX, context)
94+
convertLowerCase = self.parameterAsBool(parameters, self.LOWERCASE_NAMES, context)
95+
dropStringLength = self.parameterAsBool(parameters, self.DROP_STRING_LENGTH, context)
96+
forceSinglePart = self.parameterAsBool(parameters, self.FORCE_SINGLEPART, context)
97+
primaryKeyField = self.parameterAsString(parameters, self.PRIMARY_KEY, context) or 'id'
98+
encoding = self.parameterAsString(parameters, self.ENCODING, context)
9699

97-
layerUri = self.getParameterValue(self.INPUT)
98-
layer = QgsProcessingUtils.mapLayerFromString(layerUri, context)
100+
source = self.parameterAsSource(parameters, self.INPUT, context)
99101

100-
table = self.getParameterValue(self.TABLENAME)
102+
table = self.parameterAsString(parameters, self.TABLENAME, context)
101103
if table:
102104
table.strip()
103105
if not table or table == '':
104-
table = layer.name()
106+
table = source.sourceName()
107+
table = table.replace('.', '_')
105108
table = table.replace(' ', '').lower()
106109
providerName = 'spatialite'
107110

108-
geomColumn = self.getParameterValue(self.GEOMETRY_COLUMN)
111+
geomColumn = self.parameterAsString(parameters, self.GEOMETRY_COLUMN, context)
109112
if not geomColumn:
110-
geomColumn = 'the_geom'
113+
geomColumn = 'geom'
111114

112115
options = {}
113116
if overwrite:
@@ -121,26 +124,39 @@ def processAlgorithm(self, parameters, context, feedback):
121124
options['forceSinglePartGeometryType'] = True
122125

123126
# Clear geometry column for non-geometry tables
124-
if not layer.hasGeometryType():
127+
if source.wkbType() == QgsWkbTypes.NoGeometry:
125128
geomColumn = None
126129

127130
uri = db.uri
128131
uri.setDataSource('', table, geomColumn, '', primaryKeyField)
129132

130133
if encoding:
131-
layer.setProviderEncoding(encoding)
132-
133-
(ret, errMsg) = QgsVectorLayerExporter.exportLayer(
134-
layer,
135-
uri.uri(),
136-
providerName,
137-
self.crs,
138-
False,
139-
options,
140-
)
141-
if ret != 0:
134+
options['fileEncoding'] = encoding
135+
136+
exporter = QgsVectorLayerExporter(uri.uri(), providerName, source.fields(),
137+
source.wkbType(), source.sourceCrs(), overwrite, options)
138+
139+
if exporter.errorCode() != QgsVectorLayerExporter.NoError:
140+
raise GeoAlgorithmExecutionException(
141+
self.tr('Error importing to Spatialite\n{0}').format(exporter.errorMessage()))
142+
143+
features = source.getFeatures()
144+
total = 100.0 / source.featureCount() if source.featureCount() else 0
145+
for current, f in enumerate(features):
146+
if feedback.isCanceled():
147+
break
148+
149+
if not exporter.addFeature(f, QgsFeatureSink.FastInsert):
150+
feedback.reportError(exporter.errorMessage())
151+
152+
feedback.setProgress(int(current * total))
153+
154+
exporter.flushBuffer()
155+
if exporter.errorCode() != QgsVectorLayerExporter.NoError:
142156
raise GeoAlgorithmExecutionException(
143-
self.tr('Error importing to Spatialite\n{0}').format(errMsg))
157+
self.tr('Error importing to Spatialite\n{0}').format(exporter.errorMessage()))
144158

145159
if geomColumn and createIndex:
146160
db.create_spatial_index(table, geomColumn)
161+
162+
return {}

python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,15 @@
5757
from .FixGeometry import FixGeometry
5858
from .GridPolygon import GridPolygon
5959
from .ImportIntoPostGIS import ImportIntoPostGIS
60+
from .ImportIntoSpatialite import ImportIntoSpatialite
6061
from .Merge import Merge
6162
from .PostGISExecuteSQL import PostGISExecuteSQL
6263
from .RandomExtract import RandomExtract
6364
from .RandomExtractWithinSubsets import RandomExtractWithinSubsets
6465
from .RegularPoints import RegularPoints
6566
from .SimplifyGeometries import SimplifyGeometries
6667
from .Smooth import Smooth
68+
from .SpatialiteExecuteSQL import SpatialiteExecuteSQL
6769
from .SymmetricalDifference import SymmetricalDifference
6870
from .VectorSplit import VectorSplit
6971

@@ -124,8 +126,6 @@
124126
# from .RandomPointsPolygonsVariable import RandomPointsPolygonsVariable
125127
# from .RandomPointsAlongLines import RandomPointsAlongLines
126128
# from .PointsToPaths import PointsToPaths
127-
# from .SpatialiteExecuteSQL import SpatialiteExecuteSQL
128-
# from .ImportIntoSpatialite import ImportIntoSpatialite
129129
# from .SetVectorStyle import SetVectorStyle
130130
# from .SetRasterStyle import SetRasterStyle
131131
# from .SelectByExpression import SelectByExpression
@@ -216,7 +216,6 @@ def getAlgs(self):
216216
# RandomPointsLayer(), RandomPointsPolygonsFixed(),
217217
# RandomPointsPolygonsVariable(),
218218
# RandomPointsAlongLines(), PointsToPaths(),
219-
# SpatialiteExecuteSQL(), ImportIntoSpatialite(),
220219
# SetVectorStyle(), SetRasterStyle(),
221220
# SelectByExpression(), HypsometricCurves(),
222221
# SplitWithLines(), CreateConstantRaster(),
@@ -260,13 +259,15 @@ def getAlgs(self):
260259
FixGeometry(),
261260
GridPolygon(),
262261
ImportIntoPostGIS(),
262+
ImportIntoSpatialite(),
263263
Merge(),
264264
PostGISExecuteSQL(),
265265
RandomExtract(),
266266
RandomExtractWithinSubsets(),
267267
RegularPoints(),
268268
SimplifyGeometries(),
269269
Smooth(),
270+
SpatialiteExecuteSQL(),
270271
SymmetricalDifference(),
271272
VectorSplit()
272273
]

python/plugins/processing/algs/qgis/SpatialiteExecuteSQL.py

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@
2626

2727
__revision__ = '$Format:%H$'
2828

29+
from qgis.core import (QgsDataSourceUri,
30+
QgsApplication,
31+
QgsProcessingParameterVectorLayer,
32+
QgsProcessingParameterString)
33+
2934
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
3035
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
31-
from processing.core.parameters import ParameterVector
32-
from processing.core.parameters import ParameterString
3336
from processing.tools import spatialite
3437

35-
from qgis.core import (QgsApplication,
36-
QgsDataSourceUri)
37-
3838

3939
class SpatialiteExecuteSQL(QgisAlgorithm):
4040

@@ -46,8 +46,8 @@ def group(self):
4646

4747
def __init__(self):
4848
super().__init__()
49-
self.addParameter(ParameterVector(self.DATABASE, self.tr('File Database'), False, False))
50-
self.addParameter(ParameterString(self.SQL, self.tr('SQL query'), '', True))
49+
self.addParameter(QgsProcessingParameterVectorLayer(self.DATABASE, self.tr('File Database'), False, False))
50+
self.addParameter(QgsProcessingParameterString(self.SQL, self.tr('SQL query'), '', True))
5151

5252
def name(self):
5353
return 'spatialiteexecutesql'
@@ -56,16 +56,19 @@ def displayName(self):
5656
return self.tr('Spatialite execute SQL')
5757

5858
def processAlgorithm(self, parameters, context, feedback):
59-
database = self.getParameterValue(self.DATABASE)
60-
uri = QgsDataSourceUri(database)
59+
database = self.parameterAsVectorLayer(parameters, self.DATABASE, context)
60+
databaseuri = database.dataProvider().dataSourceUri()
61+
uri = QgsDataSourceUri(databaseuri)
6162
if uri.database() is '':
62-
if '|layerid' in database:
63-
database = database[:database.find('|layerid')]
64-
uri = QgsDataSourceUri('dbname=\'%s\'' % (database))
65-
self.db = spatialite.GeoDB(uri)
66-
sql = self.getParameterValue(self.SQL).replace('\n', ' ')
63+
if '|layerid' in databaseuri:
64+
databaseuri = databaseuri[:databaseuri.find('|layerid')]
65+
uri = QgsDataSourceUri('dbname=\'%s\'' % (databaseuri))
66+
db = spatialite.GeoDB(uri)
67+
sql = self.parameterAsString(parameters, self.SQL, context).replace('\n', ' ')
6768
try:
68-
self.db._exec_sql_and_commit(str(sql))
69+
db._exec_sql_and_commit(str(sql))
6970
except spatialite.DbError as e:
7071
raise GeoAlgorithmExecutionException(
7172
self.tr('Error executing SQL:\n{0}').format(str(e)))
73+
74+
return {}

0 commit comments

Comments
 (0)