@@ -421,31 +421,40 @@ def writeWebSection(self):
421
421
# compared to mapserver
422
422
def writeMapLayers (self ):
423
423
resultMsg = ''
424
- # get the list of legend nodes so the layers can be written in the proper order
425
- legend_nodes = self .qgs .getElementsByTagName ("legendlayer" )
426
- self .z_order = list ()
427
- for legend_node in legend_nodes :
428
- self .z_order .append (legend_node .getAttribute ("name" ).encode ('utf-8' ).replace ("\" " , "" ).replace (" " ,"_" ))
429
-
424
+ # get the layers from the legend to be able to determine the order later
425
+ legend_layers = self .qgs .getElementsByTagName ("legendlayerfile" )
426
+ self .layer_order = list ()
427
+ for legend_layer in legend_layers :
428
+ self .layer_order .append (legend_layer .getAttribute ("layerid" ).encode ('utf-8' ))
430
429
# get the list of maplayer nodes
431
430
maplayers = self .qgs .getElementsByTagName ("maplayer" )
432
431
print "Processing " , len (maplayers ), " layers"
433
432
count = 0
434
433
layer_list = dict ()
434
+ layer_names = []
435
435
for lyr in maplayers :
436
436
count += 1
437
- print "Processing layer " , count
437
+ print "Processing layer " , count
438
438
# The attributes of the maplayer tag contain the scale dependent settings,
439
439
# visibility, and layer type
440
440
layer_def = " LAYER\n "
441
441
# store name of the layer - replace space with underscore for wms compliance
442
442
layer_name = lyr .getElementsByTagName ("layername" )[0 ].childNodes [0 ].nodeValue .encode ('utf-8' ).replace ("\" " , "" ).replace (" " ,"_" )
443
+ # layername is not unique in qgis, store id of layer
444
+ layer_id = lyr .getElementsByTagName ("id" )[0 ].childNodes [0 ].nodeValue .encode ('utf-8' )
443
445
# first check to see if there is a name
444
446
if len (layer_name ) > 0 :
445
- layer_def += " NAME '%s'\n " % layer_name
447
+ # WMS layernames should be unique, so
448
+ # if the layer_name already excists in our layer_list of names:
449
+ if layer_name in layer_names :
450
+ # we give it the old name plus number
451
+ layer_name = layer_name + str (count )
446
452
else :
447
- # if no name for the layer, manufacture one
448
- layer_def += " NAME 'LAYER%s'\n " % count
453
+ # if no name for the layer, manufacture one
454
+ layer_name = 'layer' + str (count )
455
+ # store the name to be able to check for double names
456
+ layer_names .append (layer_name )
457
+ layer_def += " NAME '%s'\n " % layer_name
449
458
450
459
if lyr .getAttribute ("type" ).encode ('utf-8' ) == 'vector' :
451
460
layer_def += " TYPE " + lyr .getAttribute ("geometry" ).encode ('utf-8' ).upper () + "\n "
@@ -492,8 +501,6 @@ def writeMapLayers(self):
492
501
#layer_def += " DATA '\"" + uri.geometryColumn() + "\" FROM " + uri.quotedTablename() + "'\n"
493
502
#layer_def += " DATA '" + uri.geometryColumn() + " FROM " + uri.quotedTablename() + "'\n"
494
503
layer_id = lyr .getElementsByTagName ("id" )[0 ].childNodes [0 ].nodeValue .encode ("utf-8" )
495
- # TODO: check if this project is actually loaded in QGis
496
- # only in loaded project files it's possible to determine the primary key of a postgis table
497
504
uniqueId = self .getPrimaryKey (layer_id , uri .table ())
498
505
# %tablename% is returned when no uniqueId is found: inform user
499
506
if uniqueId .find ("%" ) >= 0 :
@@ -546,15 +553,14 @@ def writeMapLayers(self):
546
553
547
554
# WMS settings for all layers
548
555
layer_def += " METADATA\n "
549
- layer_def += " 'ows_title' '" + lyr . getElementsByTagName ( "layername" )[ 0 ]. childNodes [ 0 ]. nodeValue . encode ( 'utf-8' ). replace ( " \" " , "" ) + "'\n "
556
+ layer_def += " 'ows_title' '" + layer_name + "'\n "
550
557
layer_def += " END\n "
551
558
552
559
layer_def += " STATUS OFF\n "
553
560
554
561
# turn status in MapServer on or off based on visibility in QGis:
555
562
# layer_id = lyr.getElementsByTagName("id")[0].childNodes[0].nodeValue.encode("utf-8")
556
563
# legendLayerNode = self.legendlayerfileNodesById[layer_id]
557
-
558
564
# if legendLayerNode.getAttribute("visible").encode("utf-8") == "1":
559
565
# layer_def += " STATUS ON\n"
560
566
# else:
@@ -621,13 +627,13 @@ def writeMapLayers(self):
621
627
# end of LAYER
622
628
layer_def += " END\n \n "
623
629
624
- # add the layer to the list
625
- layer_list [layer_name ] = layer_def
626
- # all layers have been processed, reverse the list and write
627
- # not necessary since z- order is mapped by the legend list order
628
- self .z_order .reverse ()
629
- for layer in self .z_order :
630
- self .outFile .write (layer_list [layer ])
630
+ # add the layer to the list with layer_id as key
631
+ layer_list [layer_id ] = layer_def
632
+ # all layers have been processed, reverse the layer_order and write
633
+ # output layer_def's in order as they appear in legend (as seen by user)
634
+ self .layer_order .reverse ()
635
+ for layerid in self .layer_order :
636
+ self .outFile .write (layer_list [layerid ])
631
637
return resultMsg
632
638
633
639
0 commit comments