25
25
26
26
__revision__ = '$Format:%H$'
27
27
28
+ from qgis .core import (QgsProcessingParameterFeatureSource ,
29
+ QgsProcessingParameterString ,
30
+ QgsProcessingParameterEnum ,
31
+ QgsProcessingParameterCrs ,
32
+ QgsProcessingParameterField ,
33
+ QgsProcessingParameterExtent ,
34
+ QgsProcessingParameterBoolean )
35
+
28
36
from processing .algs .gdal .GdalAlgorithm import GdalAlgorithm
29
37
from processing .algs .gdal .GdalUtils import GdalUtils
30
38
35
43
class Ogr2OgrToPostGisList (GdalAlgorithm ):
36
44
37
45
DATABASE = 'DATABASE'
38
- INPUT_LAYER = 'INPUT_LAYER '
46
+ INPUT = 'INPUT '
39
47
SHAPE_ENCODING = 'SHAPE_ENCODING'
40
48
GTYPE = 'GTYPE'
41
49
GEOMTYPE = ['' , 'NONE' , 'GEOMETRY' , 'POINT' , 'LINESTRING' , 'POLYGON' , 'GEOMETRYCOLLECTION' , 'MULTIPOINT' , 'MULTIPOLYGON' , 'MULTILINESTRING' ]
@@ -71,92 +79,93 @@ class Ogr2OgrToPostGisList(GdalAlgorithm):
71
79
OPTIONS = 'OPTIONS'
72
80
73
81
def __init__ (self ):
74
- GdalAlgorithm .__init__ (self )
75
- self .processing = False
82
+ super ().__init__ ()
76
83
77
84
def initAlgorithm (self , config = None ):
78
- self .addParameter (ParameterString (
85
+
86
+ db_param = QgsProcessingParameterString (
79
87
self .DATABASE ,
80
- self .tr ('Database (connection name)' ),
81
- metadata = {
82
- 'widget_wrapper' : {
83
- 'class' : 'processing.gui.wrappers_postgis.ConnectionWidgetWrapper' }}))
84
- self .addParameter (ParameterVector (self .INPUT_LAYER ,
85
- self .tr ('Input layer' )))
86
- self .addParameter (ParameterString (self .SHAPE_ENCODING ,
87
- self .tr ('Shape encoding' ), "" , optional = True ))
88
- self .addParameter (ParameterSelection (self .GTYPE ,
89
- self .tr ('Output geometry type' ), self .GEOMTYPE , 0 ))
90
- self .addParameter (ParameterCrs (self .A_SRS ,
91
- self .tr ('Assign an output CRS' ), '' , optional = False ))
92
- self .addParameter (ParameterCrs (self .T_SRS ,
93
- self .tr ('Reproject to this CRS on output ' ), '' , optional = True ))
94
- self .addParameter (ParameterCrs (self .S_SRS ,
95
- self .tr ('Override source CRS' ), '' , optional = True ))
96
- self .addParameter (ParameterString (
88
+ self .tr ('Database (connection name)' ))
89
+ db_param .setMetadata ({
90
+ 'widget_wrapper' : {
91
+ 'class' : 'processing.gui.wrappers_postgis.ConnectionWidgetWrapper' }})
92
+ self .addParameter (db_param )
93
+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT ,
94
+ self .tr ('Input layer' )))
95
+ self .addParameter (QgsProcessingParameterString (self .SHAPE_ENCODING ,
96
+ self .tr ('Shape encoding' ), "" , optional = True ))
97
+ self .addParameter (QgsProcessingParameterEnum (self .GTYPE ,
98
+ self .tr ('Output geometry type' ), options = self .GEOMTYPE , defaultValue = 0 ))
99
+ self .addParameter (QgsProcessingParameterCrs (self .A_SRS ,
100
+ self .tr ('Assign an output CRS' ), defaultValue = '' , optional = False ))
101
+ self .addParameter (QgsProcessingParameterCrs (self .T_SRS ,
102
+ self .tr ('Reproject to this CRS on output ' ), defaultValue = '' , optional = True ))
103
+ self .addParameter (QgsProcessingParameterCrs (self .S_SRS ,
104
+ self .tr ('Override source CRS' ), defaultValue = '' , optional = True ))
105
+
106
+ schema_param = QgsProcessingParameterString (
97
107
self .SCHEMA ,
98
- self .tr ('Schema name' ),
99
- 'public' ,
100
- optional = True ,
101
- metadata = {
102
- 'widget_wrapper ' : {
103
- 'class' : 'processing.gui.wrappers_postgis.SchemaWidgetWrapper' ,
104
- 'connection_param' : self . DATABASE }}))
105
- self . addParameter ( ParameterString (
108
+ self .tr ('Schema (schema name) ' ), 'public' , False , True )
109
+ schema_param . setMetadata ({
110
+ 'widget_wrapper' : {
111
+ 'class' : 'processing.gui.wrappers_postgis.SchemaWidgetWrapper' ,
112
+ 'connection_param ' : self . DATABASE }})
113
+ self . addParameter ( schema_param )
114
+
115
+ table_param = QgsProcessingParameterString (
106
116
self .TABLE ,
107
- self .tr ('Table name, leave blank to use input name' ),
108
- '' ,
109
- optional = True ,
110
- metadata = {
111
- 'widget_wrapper' : {
112
- 'class' : 'processing.gui.wrappers_postgis.TableWidgetWrapper' ,
113
- 'schema_param' : self .SCHEMA }}))
114
- self .addParameter (ParameterString (self .PK ,
115
- self .tr ('Primary key (new field)' ), 'id' , optional = True ))
116
- self .addParameter (ParameterTableField (self .PRIMARY_KEY ,
117
- self .tr ('Primary key (existing field, used if the above option is left empty)' ), self .INPUT_LAYER , optional = True ))
118
- self .addParameter (ParameterString (self .GEOCOLUMN ,
119
- self .tr ('Geometry column name' ), 'geom' , optional = True ))
120
- self .addParameter (ParameterSelection (self .DIM ,
121
- self .tr ('Vector dimensions' ), self .DIMLIST , 0 ))
122
- self .addParameter (ParameterString (self .SIMPLIFY ,
123
- self .tr ('Distance tolerance for simplification' ),
124
- '' , optional = True ))
125
- self .addParameter (ParameterString (self .SEGMENTIZE ,
126
- self .tr ('Maximum distance between 2 nodes (densification)' ),
127
- '' , optional = True ))
128
- self .addParameter (ParameterExtent (self .SPAT ,
129
- self .tr ('Select features by extent (defined in input layer CRS)' )))
130
- self .addParameter (ParameterBoolean (self .CLIP ,
131
- self .tr ('Clip the input layer using the above (rectangle) extent' ),
132
- False ))
133
- self .addParameter (ParameterString (self .WHERE ,
134
- self .tr ('Select features using a SQL "WHERE" statement (Ex: column=\' value\' )' ),
135
- '' , optional = True ))
136
- self .addParameter (ParameterString (self .GT ,
137
- self .tr ('Group N features per transaction (Default: 20000)' ),
138
- '' , optional = True ))
139
- self .addParameter (ParameterBoolean (self .OVERWRITE ,
140
- self .tr ('Overwrite existing table' ), True ))
141
- self .addParameter (ParameterBoolean (self .APPEND ,
142
- self .tr ('Append to existing table' ), False ))
143
- self .addParameter (ParameterBoolean (self .ADDFIELDS ,
144
- self .tr ('Append and add new fields to existing table' ), False ))
145
- self .addParameter (ParameterBoolean (self .LAUNDER ,
146
- self .tr ('Do not launder columns/table names' ), False ))
147
- self .addParameter (ParameterBoolean (self .INDEX ,
148
- self .tr ('Do not create spatial index' ), False ))
149
- self .addParameter (ParameterBoolean (self .SKIPFAILURES ,
150
- self .tr ('Continue after a failure, skipping the failed feature' ),
151
- False ))
152
- self .addParameter (ParameterBoolean (self .PROMOTETOMULTI ,
153
- self .tr ('Promote to Multipart' ),
154
- True ))
155
- self .addParameter (ParameterBoolean (self .PRECISION ,
156
- self .tr ('Keep width and precision of input attributes' ),
157
- True ))
158
- self .addParameter (ParameterString (self .OPTIONS ,
159
- self .tr ('Additional creation options' ), '' , optional = True ))
117
+ self .tr ('Table to import to (leave blank to use layer name)' ), '' , False , True )
118
+ table_param .setMetadata ({
119
+ 'widget_wrapper' : {
120
+ 'class' : 'processing.gui.wrappers_postgis.TableWidgetWrapper' ,
121
+ 'schema_param' : self .SCHEMA }})
122
+ self .addParameter (table_param )
123
+
124
+ self .addParameter (QgsProcessingParameterString (self .PK ,
125
+ self .tr ('Primary key (new field)' ), defaultValue = 'id' , optional = True ))
126
+ self .addParameter (QgsProcessingParameterField (self .PRIMARY_KEY ,
127
+ self .tr ('Primary key (existing field, used if the above option is left empty)' ), parentLayerParameterName = self .INPUT , optional = True ))
128
+ self .addParameter (QgsProcessingParameterString (self .GEOCOLUMN ,
129
+ self .tr ('Geometry column name' ), defaultValue = 'geom' , optional = True ))
130
+ self .addParameter (QgsProcessingParameterEnum (self .DIM ,
131
+ self .tr ('Vector dimensions' ), options = self .DIMLIST , defaultValue = 0 ))
132
+ self .addParameter (QgsProcessingParameterString (self .SIMPLIFY ,
133
+ self .tr ('Distance tolerance for simplification' ),
134
+ defaultValue = '' , optional = True ))
135
+ self .addParameter (QgsProcessingParameterString (self .SEGMENTIZE ,
136
+ self .tr ('Maximum distance between 2 nodes (densification)' ),
137
+ defaultValue = '' , optional = True ))
138
+ self .addParameter (QgsProcessingParameterExtent (self .SPAT ,
139
+ self .tr ('Select features by extent (defined in input layer CRS)' ), optional = True ))
140
+ self .addParameter (QgsProcessingParameterBoolean (self .CLIP ,
141
+ self .tr ('Clip the input layer using the above (rectangle) extent' ),
142
+ defaultValue = False ))
143
+ self .addParameter (QgsProcessingParameterString (self .WHERE ,
144
+ self .tr ('Select features using a SQL "WHERE" statement (Ex: column=\' value\' )' ),
145
+ defaultValue = '' , optional = True ))
146
+ self .addParameter (QgsProcessingParameterString (self .GT ,
147
+ self .tr ('Group N features per transaction (Default: 20000)' ),
148
+ defaultValue = '' , optional = True ))
149
+ self .addParameter (QgsProcessingParameterBoolean (self .OVERWRITE ,
150
+ self .tr ('Overwrite existing table' ), defaultValue = True ))
151
+ self .addParameter (QgsProcessingParameterBoolean (self .APPEND ,
152
+ self .tr ('Append to existing table' ), defaultValue = False ))
153
+ self .addParameter (QgsProcessingParameterBoolean (self .ADDFIELDS ,
154
+ self .tr ('Append and add new fields to existing table' ), defaultValue = False ))
155
+ self .addParameter (QgsProcessingParameterBoolean (self .LAUNDER ,
156
+ self .tr ('Do not launder columns/table names' ), defaultValue = False ))
157
+ self .addParameter (QgsProcessingParameterBoolean (self .INDEX ,
158
+ self .tr ('Do not create spatial index' ), defaultValue = False ))
159
+ self .addParameter (QgsProcessingParameterBoolean (self .SKIPFAILURES ,
160
+ self .tr ('Continue after a failure, skipping the failed feature' ), defaultValue = False ))
161
+ self .addParameter (QgsProcessingParameterBoolean (self .PROMOTETOMULTI ,
162
+ self .tr ('Promote to Multipart' ),
163
+ defaultValue = True ))
164
+ self .addParameter (QgsProcessingParameterBoolean (self .PRECISION ,
165
+ self .tr ('Keep width and precision of input attributes' ),
166
+ defaultValue = True ))
167
+ self .addParameter (QgsProcessingParameterString (self .OPTIONS ,
168
+ self .tr ('Additional creation options' ), defaultValue = '' , optional = True ))
160
169
161
170
def name (self ):
162
171
return 'importvectorintopostgisdatabaseavailableconnections'
@@ -167,47 +176,48 @@ def displayName(self):
167
176
def group (self ):
168
177
return self .tr ('Vector miscellaneous' )
169
178
170
- def processAlgorithm (self , parameters , context , feedback ):
171
- self .processing = True
172
- GdalAlgorithm .processAlgorithm (parameters , None , self )
173
- self .processing = False
174
-
175
179
def getConsoleCommands (self , parameters , context , feedback , executing = True ):
176
- connection = self .getParameterValue ( self .DATABASE )
180
+ connection = self .parameterAsString ( parameters , self .DATABASE , context )
177
181
uri = uri_from_name (connection )
178
- if self . processing :
182
+ if executing :
179
183
# to get credentials input when needed
180
184
uri = GeoDB (uri = uri ).uri
181
185
182
- inLayer = self .getParameterValue (self .INPUT_LAYER )
183
- ogrLayer = GdalUtils .ogrConnectionString (inLayer , context )[1 :- 1 ]
184
- shapeEncoding = self .getParameterValue (self .SHAPE_ENCODING )
185
- ssrs = self .getParameterValue (self .S_SRS )
186
- tsrs = self .getParameterValue (self .T_SRS )
187
- asrs = self .getParameterValue (self .A_SRS )
188
- schema = self .getParameterValue (self .SCHEMA )
189
- table = self .getParameterValue (self .TABLE )
190
- pk = self .getParameterValue (self .PK )
191
- primary_key = self .getParameterValue (self .PRIMARY_KEY )
192
- geocolumn = self .getParameterValue (self .GEOCOLUMN )
193
- dim = self .DIMLIST [self .getParameterValue (self .DIM )]
194
- simplify = self .getParameterValue (self .SIMPLIFY )
195
- segmentize = self .getParameterValue (self .SEGMENTIZE )
196
- spat = self .getParameterValue (self .SPAT )
197
- if not spat :
198
- spat = QgsProcessingUtils .combineLayerExtents ([inLayer ])
199
- clip = self .getParameterValue (self .CLIP )
200
- where = self .getParameterValue (self .WHERE )
201
- gt = self .getParameterValue (self .GT )
202
- overwrite = self .getParameterValue (self .OVERWRITE )
203
- append = self .getParameterValue (self .APPEND )
204
- addfields = self .getParameterValue (self .ADDFIELDS )
205
- launder = self .getParameterValue (self .LAUNDER )
206
- index = self .getParameterValue (self .INDEX )
207
- skipfailures = self .getParameterValue (self .SKIPFAILURES )
208
- promotetomulti = self .getParameterValue (self .PROMOTETOMULTI )
209
- precision = self .getParameterValue (self .PRECISION )
210
- options = self .getParameterValue (self .OPTIONS )
186
+ inLayer = self .parameterAsSource (parameters , self .INPUT , context )
187
+ ogrLayer , layername = self .getOgrCompatibleSource (self .INPUT , parameters , context , feedback , executing )
188
+ shapeEncoding = self .parameterAsString (parameters , self .SHAPE_ENCODING , context )
189
+ ssrs = self .parameterAsCrs (parameters , self .S_SRS , context ).authid ()
190
+ tsrs = self .parameterAsCrs (parameters , self .T_SRS , context ).authid ()
191
+ asrs = self .parameterAsCrs (parameters , self .A_SRS , context ).authid ()
192
+ table = self .parameterAsString (parameters , self .TABLE , context )
193
+ schema = self .parameterAsString (parameters , self .SCHEMA , context )
194
+ pk = self .parameterAsString (parameters , self .PK , context )
195
+ pkstring = "-lco FID=" + pk
196
+ primary_key = self .parameterAsString (parameters , self .PRIMARY_KEY , context )
197
+ geocolumn = self .parameterAsString (parameters , self .GEOCOLUMN , context )
198
+ geocolumnstring = "-lco GEOMETRY_NAME=" + geocolumn
199
+ dim = self .DIMLIST [self .parameterAsEnum (parameters , self .DIM , context )]
200
+ dimstring = "-lco DIM=" + dim
201
+ simplify = self .parameterAsString (parameters , self .SIMPLIFY , context )
202
+ segmentize = self .parameterAsString (parameters , self .SEGMENTIZE , context )
203
+ spat = self .parameterAsExtent (parameters , self .SPAT , context )
204
+ if spat .isNull ():
205
+ spat = inLayer .sourceExtent ()
206
+ clip = self .parameterAsBool (parameters , self .CLIP , context )
207
+ where = self .parameterAsString (parameters , self .WHERE , context )
208
+ wherestring = '-where "' + where + '"'
209
+ gt = self .parameterAsString (parameters , self .GT , context )
210
+ overwrite = self .parameterAsBool (parameters , self .OVERWRITE , context )
211
+ append = self .parameterAsBool (parameters , self .APPEND , context )
212
+ addfields = self .parameterAsBool (parameters , self .ADDFIELDS , context )
213
+ launder = self .parameterAsBool (parameters , self .LAUNDER , context )
214
+ launderstring = "-lco LAUNDER=NO"
215
+ index = self .parameterAsBool (parameters , self .INDEX , context )
216
+ indexstring = "-lco SPATIAL_INDEX=OFF"
217
+ skipfailures = self .parameterAsBool (parameters , self .SKIPFAILURES , context )
218
+ promotetomulti = self .parameterAsBool (parameters , self .PROMOTETOMULTI , context )
219
+ precision = self .parameterAsBool (parameters , self .PRECISION , context )
220
+ options = self .parameterAsString (parameters , self .OPTIONS , context )
211
221
212
222
arguments = []
213
223
arguments .append ('-progress' )
@@ -219,74 +229,73 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):
219
229
arguments .append ('-f' )
220
230
arguments .append ('PostgreSQL' )
221
231
arguments .append ('PG:"' )
222
- for token in uri .connectionInfo (self . processing ).split (' ' ):
232
+ for token in uri .connectionInfo (executing ).split (' ' ):
223
233
arguments .append (token )
224
234
arguments .append ('active_schema={}' .format (schema or 'public' ))
225
235
arguments .append ('"' )
226
- arguments .append ("-lco DIM=" + dim )
236
+ arguments .append (dimstring )
227
237
arguments .append (ogrLayer )
228
- arguments .append (GdalUtils . ogrLayerName ( inLayer ) )
238
+ arguments .append (layername )
229
239
if index :
230
- arguments .append ("-lco SPATIAL_INDEX=OFF" )
240
+ arguments .append (indexstring )
231
241
if launder :
232
- arguments .append ("-lco LAUNDER=NO" )
242
+ arguments .append (launderstring )
233
243
if append :
234
244
arguments .append ('-append' )
235
245
if addfields :
236
246
arguments .append ('-addfields' )
237
247
if overwrite :
238
248
arguments .append ('-overwrite' )
239
- if len (self .GEOMTYPE [self .getParameterValue ( self .GTYPE )]) > 0 :
249
+ if len (self .GEOMTYPE [self .parameterAsEnum ( parameters , self .GTYPE , context )]) > 0 :
240
250
arguments .append ('-nlt' )
241
- arguments .append (self .GEOMTYPE [self .getParameterValue ( self .GTYPE )])
242
- if geocolumn :
243
- arguments .append ("-lco GEOMETRY_NAME=" + geocolumn )
244
- if pk :
245
- arguments .append ("-lco FID=" + pk )
251
+ arguments .append (self .GEOMTYPE [self .parameterAsEnum ( parameters , self .GTYPE , context )])
252
+ if len ( geocolumn ) > 0 :
253
+ arguments .append (geocolumnstring )
254
+ if len ( pk ) > 0 :
255
+ arguments .append (pkstring )
246
256
elif primary_key is not None :
247
257
arguments .append ("-lco FID=" + primary_key )
248
- if not table :
258
+ if len ( table ) == 0 :
249
259
table = GdalUtils .ogrLayerName (inLayer ).lower ()
250
260
if schema :
251
261
table = '{}.{}' .format (schema , table )
252
262
arguments .append ('-nln' )
253
263
arguments .append (table )
254
- if ssrs :
264
+ if len ( ssrs ) > 0 :
255
265
arguments .append ('-s_srs' )
256
266
arguments .append (ssrs )
257
- if tsrs :
267
+ if len ( tsrs ) > 0 :
258
268
arguments .append ('-t_srs' )
259
269
arguments .append (tsrs )
260
- if asrs :
270
+ if len ( asrs ) > 0 :
261
271
arguments .append ('-a_srs' )
262
272
arguments .append (asrs )
263
- if spat :
264
- regionCoords = spat .split (',' )
273
+ if not spat .isNull ():
265
274
arguments .append ('-spat' )
266
- arguments .append (regionCoords [ 0 ] )
267
- arguments .append (regionCoords [ 2 ] )
268
- arguments .append (regionCoords [ 1 ] )
269
- arguments .append (regionCoords [ 3 ] )
275
+ arguments .append (spat . xMinimum () )
276
+ arguments .append (spat . yMinimum () )
277
+ arguments .append (spat . xMaximum () )
278
+ arguments .append (spat . yMaximum () )
270
279
if clip :
271
280
arguments .append ('-clipsrc spat_extent' )
272
281
if skipfailures :
273
282
arguments .append ('-skipfailures' )
274
283
if where :
275
- arguments .append ('-where "' + where + '"' )
276
- if simplify :
284
+ arguments .append (wherestring )
285
+ if len ( simplify ) > 0 :
277
286
arguments .append ('-simplify' )
278
287
arguments .append (simplify )
279
- if segmentize :
288
+ if len ( segmentize ) > 0 :
280
289
arguments .append ('-segmentize' )
281
290
arguments .append (segmentize )
282
- if gt :
291
+ if len ( gt ) > 0 :
283
292
arguments .append ('-gt' )
284
293
arguments .append (gt )
285
294
if promotetomulti :
286
295
arguments .append ('-nlt PROMOTE_TO_MULTI' )
287
296
if precision is False :
288
297
arguments .append ('-lco PRECISION=NO' )
289
- if options :
298
+ if len ( options ) > 0 :
290
299
arguments .append (options )
291
300
292
301
commands = []
0 commit comments