@@ -58,8 +58,8 @@ def outFile( self ):
58
58
self .leOutShape .setText ( self .outFileName )
59
59
60
60
def inputFile ( self ):
61
- files = QFileDialog . getOpenFileNames ( self , self .tr ( "Select files to merge" ), "." , "Shapefiles(*.shp *.SHP)" )
62
- if files . isEmpty () :
61
+ ( files , self .inEncoding ) = ftools_utils . openDialog ( self , dialogMode = "ManyFiles" )
62
+ if files is None or self . inEncoding is None :
63
63
self .inputFiles = None
64
64
return
65
65
@@ -134,7 +134,7 @@ def accept( self ):
134
134
self .btnOk .setEnabled ( False )
135
135
136
136
self .mergeThread = ShapeMergeThread ( baseDir , self .inputFiles , self .inEncoding , self .outFileName , self .encoding )
137
- QObject .connect ( self .mergeThread , SIGNAL ( "rangeChanged( PyQt_PyObject )" ), self .setProgressRange )
137
+ QObject .connect ( self .mergeThread , SIGNAL ( "rangeChanged( PyQt_PyObject )" ), self .setFeatureProgressRange )
138
138
QObject .connect ( self .mergeThread , SIGNAL ( "checkStarted()" ), self .setFeatureProgressFormat )
139
139
QObject .connect ( self .mergeThread , SIGNAL ( "checkFinished()" ), self .resetFeatureProgressFormat )
140
140
QObject .connect ( self .mergeThread , SIGNAL ( "fileNameChanged( PyQt_PyObject )" ), self .setShapeProgressFormat )
@@ -149,8 +149,8 @@ def accept( self ):
149
149
150
150
self .mergeThread .start ()
151
151
152
- def setProgressRange ( self , max ):
153
- self .progressFeatures .setRange ( 0 , max )
152
+ def setFeatureProgressRange ( self , maximum ):
153
+ self .progressFeatures .setRange ( 0 , maximum )
154
154
self .progressFeatures .setValue ( 0 )
155
155
156
156
def setFeatureProgressFormat ( self ):
@@ -216,13 +216,38 @@ def run( self ):
216
216
217
217
interrupted = False
218
218
219
+ # create attribute list with uniquie fields
220
+ # from all selected layers
221
+ mergedFields = {}
222
+ count = 0
223
+ self .emit ( SIGNAL ( "rangeChanged( PyQt_PyObject )" ), len ( self .shapes ) )
224
+ self .emit ( SIGNAL ( "checkStarted()" ) )
225
+ for fileName in self .shapes :
226
+ layerPath = QFileInfo ( self .baseDir + "/" + fileName ).absoluteFilePath ()
227
+ newLayer = QgsVectorLayer ( layerPath , QFileInfo ( layerPath ).baseName (), "ogr" )
228
+ if not newLayer .isValid ():
229
+ continue
230
+ vprovider = newLayer .dataProvider ()
231
+ layerFields = vprovider .fields ()
232
+ for layerIndex , layerField in layerFields .iteritems ():
233
+ fieldFound = False
234
+ for mergedIndex , mergedField in mergedFields .iteritems ():
235
+ if ( mergedField .name () == layerField .name () ) and ( mergedField .type () == layerField .type () ):
236
+ fieldFound = True
237
+
238
+ if not fieldFound :
239
+ mergedFields [ count ] = layerField
240
+ count += 1
241
+ self .emit ( SIGNAL ( "featureProcessed()" ) )
242
+ self .emit ( SIGNAL ( "checkFinished()" ) )
243
+
219
244
# get information about shapefiles
220
245
layerPath = QFileInfo ( self .baseDir + "/" + self .shapes [ 0 ] ).absoluteFilePath ()
221
246
newLayer = QgsVectorLayer ( layerPath , QFileInfo ( layerPath ).baseName (), "ogr" )
222
247
self .crs = newLayer .crs ()
223
248
self .geom = newLayer .wkbType ()
224
249
vprovider = newLayer .dataProvider ()
225
- self .fields = vprovider . fields ()
250
+ self .fields = mergedFields
226
251
227
252
writer = QgsVectorFileWriter ( self .outputFileName , self .outputEncoding ,
228
253
self .fields , self .geom , self .crs )
@@ -234,6 +259,7 @@ def run( self ):
234
259
continue
235
260
vprovider = newLayer .dataProvider ()
236
261
vprovider .setEncoding ( self .inputEncoding )
262
+ layerFields = vprovider .fields ()
237
263
allAttrs = vprovider .attributeIndexes ()
238
264
vprovider .select ( allAttrs )
239
265
nFeat = vprovider .featureCount ()
@@ -244,9 +270,15 @@ def run( self ):
244
270
inGeom = QgsGeometry ()
245
271
while vprovider .nextFeature ( inFeat ):
246
272
atMap = inFeat .attributeMap ()
273
+ mergedAttrs = {}
274
+ # fill available attributes with values
275
+ for layerIndex , layerField in layerFields .iteritems ():
276
+ for mergedIndex , mergedField in self .fields .iteritems ():
277
+ if ( mergedField .name () == layerField .name () ) and ( mergedField .type () == layerField .type () ):
278
+ mergedAttrs [ mergedIndex ] = atMap [ layerIndex ]
247
279
inGeom = QgsGeometry ( inFeat .geometry () )
248
280
outFeat .setGeometry ( inGeom )
249
- outFeat .setAttributeMap ( atMap )
281
+ outFeat .setAttributeMap ( mergedAttrs )
250
282
writer .addFeature ( outFeat )
251
283
self .emit ( SIGNAL ( "featureProcessed()" ) )
252
284
0 commit comments