Skip to content

Commit f41be8a

Browse files
author
rduivenvoorde
committed
fix for #2847 layers with identical names have problems with data/filter statements
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@13844 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 6a0dfec commit f41be8a

File tree

1 file changed

+27
-21
lines changed

1 file changed

+27
-21
lines changed

python/plugins/mapserver_export/ms_export.py

+27-21
Original file line numberDiff line numberDiff line change
@@ -421,31 +421,40 @@ def writeWebSection(self):
421421
# compared to mapserver
422422
def writeMapLayers(self):
423423
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'))
430429
# get the list of maplayer nodes
431430
maplayers = self.qgs.getElementsByTagName("maplayer")
432431
print "Processing ", len(maplayers), " layers"
433432
count = 0
434433
layer_list = dict()
434+
layer_names = []
435435
for lyr in maplayers:
436436
count += 1
437-
print "Processing layer ", count
437+
print "Processing layer ", count
438438
# The attributes of the maplayer tag contain the scale dependent settings,
439439
# visibility, and layer type
440440
layer_def = " LAYER\n"
441441
# store name of the layer - replace space with underscore for wms compliance
442442
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')
443445
# first check to see if there is a name
444446
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)
446452
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
449458

450459
if lyr.getAttribute("type").encode('utf-8') == 'vector':
451460
layer_def += " TYPE " + lyr.getAttribute("geometry").encode('utf-8').upper() + "\n"
@@ -492,8 +501,6 @@ def writeMapLayers(self):
492501
#layer_def += " DATA '\"" + uri.geometryColumn() + "\" FROM " + uri.quotedTablename() + "'\n"
493502
#layer_def += " DATA '" + uri.geometryColumn() + " FROM " + uri.quotedTablename() + "'\n"
494503
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
497504
uniqueId = self.getPrimaryKey(layer_id, uri.table())
498505
# %tablename% is returned when no uniqueId is found: inform user
499506
if uniqueId.find("%") >= 0:
@@ -546,15 +553,14 @@ def writeMapLayers(self):
546553

547554
# WMS settings for all layers
548555
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"
550557
layer_def += " END\n"
551558

552559
layer_def += " STATUS OFF\n"
553560

554561
# turn status in MapServer on or off based on visibility in QGis:
555562
# layer_id = lyr.getElementsByTagName("id")[0].childNodes[0].nodeValue.encode("utf-8")
556563
# legendLayerNode = self.legendlayerfileNodesById[layer_id]
557-
558564
# if legendLayerNode.getAttribute("visible").encode("utf-8") == "1":
559565
# layer_def += " STATUS ON\n"
560566
# else:
@@ -621,13 +627,13 @@ def writeMapLayers(self):
621627
# end of LAYER
622628
layer_def += " END\n\n"
623629

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])
631637
return resultMsg
632638

633639

0 commit comments

Comments
 (0)