[QGIS Commit] r13844 - trunk/qgis/python/plugins/mapserver_export
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Tue Jun 29 16:04:49 EDT 2010
Author: rduivenvoorde
Date: 2010-06-29 20:04:49 +0000 (Tue, 29 Jun 2010)
New Revision: 13844
Modified:
trunk/qgis/python/plugins/mapserver_export/ms_export.py
Log:
fix for #2847 layers with identical names have problems with data/filter statements
Modified: trunk/qgis/python/plugins/mapserver_export/ms_export.py
===================================================================
--- trunk/qgis/python/plugins/mapserver_export/ms_export.py 2010-06-29 14:26:33 UTC (rev 13843)
+++ trunk/qgis/python/plugins/mapserver_export/ms_export.py 2010-06-29 20:04:49 UTC (rev 13844)
@@ -421,31 +421,40 @@
# compared to mapserver
def writeMapLayers(self):
resultMsg = ''
- # get the list of legend nodes so the layers can be written in the proper order
- legend_nodes = self.qgs.getElementsByTagName("legendlayer")
- self.z_order = list()
- for legend_node in legend_nodes:
- self.z_order.append(legend_node.getAttribute("name").encode('utf-8').replace("\"", "").replace(" ","_"))
-
+ # get the layers from the legend to be able to determine the order later
+ legend_layers = self.qgs.getElementsByTagName("legendlayerfile")
+ self.layer_order = list()
+ for legend_layer in legend_layers:
+ self.layer_order.append(legend_layer.getAttribute("layerid").encode('utf-8'))
# get the list of maplayer nodes
maplayers = self.qgs.getElementsByTagName("maplayer")
print "Processing ", len(maplayers), " layers"
count = 0
layer_list = dict()
+ layer_names = []
for lyr in maplayers:
count += 1
- print "Processing layer ", count
+ print "Processing layer ", count
# The attributes of the maplayer tag contain the scale dependent settings,
# visibility, and layer type
layer_def = " LAYER\n"
# store name of the layer - replace space with underscore for wms compliance
layer_name = lyr.getElementsByTagName("layername")[0].childNodes[0].nodeValue.encode('utf-8').replace("\"", "").replace(" ","_")
+ # layername is not unique in qgis, store id of layer
+ layer_id = lyr.getElementsByTagName("id")[0].childNodes[0].nodeValue.encode('utf-8')
# first check to see if there is a name
if len(layer_name) > 0:
- layer_def += " NAME '%s'\n" % layer_name
+ # WMS layernames should be unique, so
+ # if the layer_name already excists in our layer_list of names:
+ if layer_name in layer_names:
+ # we give it the old name plus number
+ layer_name = layer_name + str(count)
else:
- # if no name for the layer, manufacture one
- layer_def += " NAME 'LAYER%s'\n" % count
+ # if no name for the layer, manufacture one
+ layer_name = 'layer' + str(count)
+ # store the name to be able to check for double names
+ layer_names.append(layer_name)
+ layer_def += " NAME '%s'\n" % layer_name
if lyr.getAttribute("type").encode('utf-8') == 'vector':
layer_def += " TYPE " + lyr.getAttribute("geometry").encode('utf-8').upper() + "\n"
@@ -492,8 +501,6 @@
#layer_def += " DATA '\"" + uri.geometryColumn() + "\" FROM " + uri.quotedTablename() + "'\n"
#layer_def += " DATA '" + uri.geometryColumn() + " FROM " + uri.quotedTablename() + "'\n"
layer_id = lyr.getElementsByTagName("id")[0].childNodes[0].nodeValue.encode("utf-8")
- # TODO: check if this project is actually loaded in QGis
- # only in loaded project files it's possible to determine the primary key of a postgis table
uniqueId = self.getPrimaryKey(layer_id, uri.table())
# %tablename% is returned when no uniqueId is found: inform user
if uniqueId.find("%") >= 0:
@@ -546,7 +553,7 @@
# WMS settings for all layers
layer_def += " METADATA\n"
- layer_def += " 'ows_title' '" + lyr.getElementsByTagName("layername")[0].childNodes[0].nodeValue.encode('utf-8').replace("\"", "") + "'\n"
+ layer_def += " 'ows_title' '" + layer_name + "'\n"
layer_def += " END\n"
layer_def += " STATUS OFF\n"
@@ -554,7 +561,6 @@
# turn status in MapServer on or off based on visibility in QGis:
# layer_id = lyr.getElementsByTagName("id")[0].childNodes[0].nodeValue.encode("utf-8")
# legendLayerNode = self.legendlayerfileNodesById[layer_id]
-
# if legendLayerNode.getAttribute("visible").encode("utf-8") == "1":
# layer_def += " STATUS ON\n"
# else:
@@ -621,13 +627,13 @@
# end of LAYER
layer_def += " END\n\n"
- # add the layer to the list
- layer_list[layer_name] = layer_def
- # all layers have been processed, reverse the list and write
- # not necessary since z-order is mapped by the legend list order
- self.z_order.reverse()
- for layer in self.z_order:
- self.outFile.write(layer_list[layer])
+ # add the layer to the list with layer_id as key
+ layer_list[layer_id] = layer_def
+ # all layers have been processed, reverse the layer_order and write
+ # output layer_def's in order as they appear in legend (as seen by user)
+ self.layer_order.reverse()
+ for layerid in self.layer_order:
+ self.outFile.write(layer_list[layerid])
return resultMsg
More information about the QGIS-commit
mailing list