Skip to content

Commit d36c136

Browse files
author
perrygeo
committedSep 10, 2006
Some refactoring. Fixed problem related to number of parameters passed to Qgis2Map.setOptions.
git-svn-id: http://svn.osgeo.org/qgis/trunk@5808 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 991a3e2 commit d36c136

File tree

3 files changed

+234
-175
lines changed

3 files changed

+234
-175
lines changed
 

‎tools/mapserver_export/ms_export.py

Lines changed: 232 additions & 173 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
from xml.dom import minidom, Node
1111

1212
# symbol map
13-
qgisSymbols = {'hard:circle': 'CIRCLE'}
13+
qgisSymbols = {'hard:circle' : 'CIRCLE',
14+
'hard:triangle' : 'TRIANGLE'}
15+
1416
class Qgis2Map:
1517
def __init__(self, projectFile, mapFile):
1618
self.project = projectFile
@@ -28,54 +30,69 @@ def __init__(self, projectFile, mapFile):
2830
self.template = ''
2931
self.header = ''
3032
self.footer = ''
33+
self.symbolQueue = {}
3134

32-
33-
# Set the options collected from the GUI
34-
def setOptions(self, units, image, mapname, width, height, minscale, maxscale, template, header, footer):
35+
# Set the options collected from the GUI
36+
def setOptions(self, units, image, mapname, width, height, template, header, footer):
3537
self.units = units
3638
self.imageType = image
3739
self.mapName = mapname
3840
self.width = width
3941
self.height = height
40-
self.minScale = minscale
41-
self.maxScale = maxscale
42+
#self.minScale = minscale
43+
#self.maxScale = maxscale
4244
self.template = template
4345
self.header = header
4446
self.footer = footer
45-
#
46-
## All real work happens here by calling methods to write the
47-
## various sections of the map file
47+
print units, image, mapname, width, height, template, header, footer
48+
49+
## All real work happens here by calling methods to write the
50+
## various sections of the map file
4851
def writeMapFile(self):
4952
# open the output file
5053
self.outFile = open(self.mapFile, 'w')
5154
# write the general map and web settings
55+
print " --- python : map section "
5256
self.writeMapSection()
57+
print " --- python : map section done"
5358
# write the projection section
59+
print " --- python : proj section "
5460
self.writeProjectionSection()
61+
print " --- python : proj section done"
5562
# write the output format section
63+
print " --- python : outputformat section "
5664
self.writeOutputFormat()
65+
print " --- python : outputformat section done"
5766
# write the legend section
67+
print " --- python : legend section"
5868
self.writeLegendSection()
59-
# write the symbol defs section
60-
self.writeSymbolSection()
69+
print " --- python : legend section done"
6170

6271
# write the WEB section
72+
print " --- python : web section "
6373
self.writeWebSection()
74+
print " --- python : web section done"
6475

6576
# write the LAYER sections
77+
print " --- python : layer section "
6678
self.writeMapLayers()
79+
print " --- python : layer section done"
80+
81+
# write the symbol defs section
82+
# must happen after layers so we can build a symbol queue
83+
print " --- python : symbol section "
84+
self.writeSymbolSection()
85+
print " --- python : symbol section done"
6786

6887
# END and close the map file
6988
self.outFile.write("END")
7089
self.outFile.close()
7190

7291
ret = "Writing the map file using " + self.project + " " + self.mapFile
7392
return ret
74-
#, self.mapFile, self.project
7593

76-
# Write the general parts of the map section
94+
# Write the general parts of the map section
7795
def writeMapSection(self):
78-
print "Writing header\n"
7996
self.outFile.write("# Map file created from QGIS project file " + self.project + "\n")
8097
self.outFile.write("# Edit this file to customize for your map interface\n")
8198
self.outFile.write("MAP\n")
@@ -99,22 +116,22 @@ def writeMapSection(self):
99116
self.outFile.write(ymax[0].childNodes[0].nodeValue.encode())
100117
self.outFile.write("\n")
101118

102-
# Write the OUTPUTFORMAT section
119+
# Write the OUTPUTFORMAT section
103120
def writeOutputFormat(self):
104121
self.outFile.write(" # Background color for the map canvas -- change as desired\n")
105122
self.outFile.write(" IMAGECOLOR 192 192 192\n")
106123
self.outFile.write(" IMAGEQUALITY 95\n")
107124
self.outFile.write(" IMAGETYPE " + self.imageType + "\n")
108-
#self.outFile.write(" OUTPUTFORMAT\n")
109-
#self.outFile.write(" NAME " + self.imageType + "\n")
110-
#self.outFile.write(" DRIVER 'GD/" + self.imageType.upper() + "'\n")
111-
#self.outFile.write(" MIMETYPE 'image/" + self.imageType.lower() + "'\n")
112-
#self.outFile.write(" IMAGEMODE PC256\n")
113-
#self.outFile.write(" EXTENSION '" + self.imageType.lower() + "'\n")
114-
#self.outFile.write(" END\n")
125+
self.outFile.write(" OUTPUTFORMAT\n")
126+
self.outFile.write(" NAME " + self.imageType + "\n")
127+
self.outFile.write(" DRIVER 'GD/" + self.imageType.upper() + "'\n")
128+
self.outFile.write(" MIMETYPE 'image/" + self.imageType.lower() + "'\n")
129+
self.outFile.write(" IMAGEMODE PC256\n")
130+
self.outFile.write(" EXTENSION '" + self.imageType.lower() + "'\n")
131+
self.outFile.write(" END\n")
115132

116133

117-
# Write Projection section
134+
# Write Projection section
118135
def writeProjectionSection(self):
119136
# Need to get the destination srs from one of the map layers since
120137
# the project file doesn't contain the epsg id or proj4 text for
@@ -123,13 +140,14 @@ def writeProjectionSection(self):
123140
self.outFile.write(" PROJECTION\n")
124141

125142
# Get the proj4 text from the first map layer's destination SRS
126-
proj4Text = self.qgs.getElementsByTagName("destinationsrs")[0].getElementsByTagName("proj4")[0].childNodes[0].nodeValue.encode()
143+
destsrs = self.qgs.getElementsByTagName("destinationsrs")[0]
144+
proj4Text = destsrs.getElementsByTagName("proj4")[0].childNodes[0].nodeValue.encode()
127145
# the proj4 text string needs to be reformatted to make mapserver happy
128146
self.outFile.write(self.formatProj4(proj4Text))
129147

130-
self.outFile.write(" END\n")
148+
self.outFile.write(" END\n\n")
131149

132-
# Write the LEGEND section
150+
# Write the LEGEND section
133151
def writeLegendSection(self):
134152
self.outFile.write(" # Legend\n")
135153
self.outFile.write(" LEGEND\n")
@@ -141,22 +159,15 @@ def writeLegendSection(self):
141159
self.outFile.write(" SIZE MEDIUM\n")
142160
self.outFile.write(" COLOR 0 0 89\n")
143161
self.outFile.write(" END\n")
144-
self.outFile.write(" END\n\n")
162+
self.outFile.write(" END\n\n")
145163

146-
# Write the symbol definitions
164+
# Write the symbol definitions
147165
def writeSymbolSection(self):
148-
self.outFile.write(" #Circle symbol\n");
149-
self.outFile.write(" SYMBOL\n");
150-
self.outFile.write(" NAME 'CIRCLE'\n");
151-
self.outFile.write(" TYPE ellipse\n");
152-
self.outFile.write(" FILLED true\n");
153-
self.outFile.write(" POINTS\n");
154-
self.outFile.write(" 1 1\n");
155-
self.outFile.write(" END\n");
156-
self.outFile.write(" END\n\n");
157-
158-
159-
# Write the WEB section of the map file
166+
for symbol in self.symbolQueue.keys():
167+
self.outFile.write( self.symbolQueue[symbol] )
168+
self.outFile.write( "\n" )
169+
170+
# Write the WEB section of the map file
160171
def writeWebSection(self):
161172
self.outFile.write(" # Web interface definition. Only the template parameter\n")
162173
self.outFile.write(" # is required to display a map. See MapServer documentation\n")
@@ -215,7 +226,7 @@ def parsePostgisConnection( self, dataString ):
215226
return pg
216227

217228

218-
# Write the map layers
229+
# Write the map layers
219230
def writeMapLayers(self):
220231
# get the list of maplayer nodes
221232
maplayers = self.qgs.getElementsByTagName("maplayer")
@@ -255,45 +266,54 @@ def writeMapLayers(self):
255266
# it's a postgis layer
256267
pg = self.parsePostgisConnection(dataString)
257268
self.outFile.write(" CONNECTIONTYPE postgis\n")
258-
self.outFile.write(" CONNECTION 'host=" + pg['host'] + " dbname=" + pg['dbname'] + " password=" + pg['password'] + " user=" + pg['user'] + "'\n")
269+
self.outFile.write(" CONNECTION 'host=" + pg['host'] + " dbname=" + pg['dbname']
270+
+ " password=" + pg['password'] + " user=" + pg['user'] + "'\n")
259271
self.outFile.write(" DATA '" + pg['geom'] + " FROM " + pg['table'] + "'\n")
272+
260273
elif providerString == 'wms' and lyr.getAttribute("type").encode().upper() == 'RASTER':
261274
# it's a WMS layer
262275
self.outFile.write(" CONNECTIONTYPE WMS\n")
263276
self.outFile.write(" CONNECTION '" + dataString + "'\n")
264277
rasterProp = lyr.getElementsByTagName("rasterproperties")[0]
265-
266-
# TODO loop thru wmsSubLayers
267-
# wmsSubLayers = rasterProp.getElementsByTagName('wmsSublayer')
268-
layername = rasterProp.getElementsByTagName('wmsSublayer')[0].getElementsByTagName('name')[0].childNodes[0].nodeValue.encode()
269-
try:
270-
style = rasterProp.getElementsByTagName('wmsSublayer')[0].getElementsByTagName('style')[0].childNodes[0].nodeValue.encode()
271-
except:
272-
style = ''
273-
278+
# loop thru wmsSubLayers
279+
wmsSubLayers = rasterProp.getElementsByTagName('wmsSublayer')
280+
wmsNames = []
281+
wmsStyles = []
282+
for wmsLayer in wmsSubLayers:
283+
wmsNames.append( wmsLayer.getElementsByTagName('name')[0].childNodes[0].nodeValue.encode() )
284+
try:
285+
wmsStyles.append( wmsLayer.getElementsByTagName('style')[0].childNodes[0].nodeValue.encode() )
286+
except:
287+
wmsStyles.append( '' )
274288
# Create necesssary wms metadata
275289
format = rasterProp.getElementsByTagName('wmsFormat')[0].childNodes[0].nodeValue.encode()
276-
srs = lyr.getElementsByTagName('coordinatetransform')[0].getElementsByTagName('sourcesrs')[0].getElementsByTagName('spatialrefsys')[0]
290+
ct = lyr.getElementsByTagName('coordinatetransform')[0]
291+
srs = ct.getElementsByTagName('sourcesrs')[0].getElementsByTagName('spatialrefsys')[0]
277292
epsg = srs.getElementsByTagName('epsg')[0].childNodes[0].nodeValue.encode()
278293
self.outFile.write(" METADATA\n")
279-
self.outFile.write(" 'wms_name' '" + layername + "'\n")
294+
self.outFile.write(" 'wms_name' '" + ','.join(wmsNames) + "'\n")
280295
self.outFile.write(" 'wms_server_version' '1.1.1'\n")
281296
self.outFile.write(" 'wms_srs' 'EPSG:4326 EPSG:" + epsg + "'\n")
282297
self.outFile.write(" 'wms_format' '" + format + "'\n")
283-
self.outFile.write(" 'wms_style' '" + style + "'\n")
298+
self.outFile.write(" 'wms_style' '" + ','.join(wmsStyles) + "'\n")
284299
self.outFile.write(" END\n")
300+
285301
else:
286302
# its a standard ogr, gdal or grass layer
287303
self.outFile.write(" DATA '" + dataString + "'\n")
288304

289305
# WMS settings for all layers
290306
self.outFile.write(" METADATA\n")
291-
self.outFile.write(" 'wms_title' '" + lyr.getElementsByTagName("layername")[0].childNodes[0].nodeValue.encode() + "'\n")
307+
self.outFile.write(" 'wms_title' '"
308+
+ lyr.getElementsByTagName("layername")[0].childNodes[0].nodeValue.encode() + "'\n")
292309
self.outFile.write(" END\n")
293310

294311
self.outFile.write(" STATUS DEFAULT\n")
295-
opacity = int ( 100.0 * float(lyr.getElementsByTagName("transparencyLevelInt")[0].childNodes[0].nodeValue.encode()) / 255.0 )
312+
313+
opacity = int ( 100.0 *
314+
float(lyr.getElementsByTagName("transparencyLevelInt")[0].childNodes[0].nodeValue.encode()) / 255.0 )
296315
self.outFile.write(" TRANSPARENCY " + str(opacity) + "\n")
316+
297317
self.outFile.write(" PROJECTION\n")
298318
proj4Text = lyr.getElementsByTagName("proj4")[0].childNodes[0].nodeValue.encode()
299319
self.outFile.write(self.formatProj4(proj4Text))
@@ -335,66 +355,55 @@ def writeMapLayers(self):
335355
# end of LAYER
336356
self.outFile.write(" END\n\n")
337357

358+
338359
# Simple renderer ouput
339360
# We need the layer node and symbol node
340361
def simpleRenderer(self, layerNode, symbolNode):
341-
# symbology depends on the feature type and the .qgs file
342-
# contains the same markup for a layer regardless of type
343-
# so we infer a symbol type based on the geometry
344-
geometry = layerNode.getAttribute("geometry").encode().upper()
345-
if geometry == 'POLYGON':
346-
symbol = '0'
347-
elif geometry == 'LINE':
348-
symbol = '0'
349-
elif geometry == 'POINT':
350-
symbolName = qgisSymbols[symbolNode.getElementsByTagName('pointsymbol')[0].childNodes[0].nodeValue.encode()]
351-
# make sure it's single quoted
352-
symbol = "'" + symbolName + "'"
353-
354-
self.outFile.write(" CLASS\n")
362+
# get the layers geometry type
363+
geometry = layerNode.getAttribute("geometry").encode().upper()
355364

356-
self.outFile.write(" NAME "
357-
+ lyr.getElementsByTagName("layername")[0].childNodes[0].nodeValue.encode()
358-
+ " \n")
365+
self.outFile.write(" CLASS\n")
359366

360-
# use the point symbol map to lookup the mapserver symbol type
361-
self.outFile.write(" SYMBOL " + symbol + " \n")
362-
self.outFile.write(" SIZE "
363-
+ symbolNode.getElementsByTagName('pointsize')[0].childNodes[0].nodeValue.encode()
364-
+ " \n")
367+
self.outFile.write(" NAME "
368+
+ layerNode.getElementsByTagName("layername")[0].childNodes[0].nodeValue.encode()
369+
+ " \n")
365370

366-
# outline color
367-
outlineNode = symbolNode.getElementsByTagName('outlinecolor')[0]
368-
self.outFile.write(" OUTLINECOLOR "
369-
+ outlineNode.getAttribute('red') + ' '
370-
+ outlineNode.getAttribute('green') + ' '
371-
+ outlineNode.getAttribute('blue')
372-
+ "\n")
373-
# color
374-
colorNode = symbolNode.getElementsByTagName('fillcolor')[0]
375-
self.outFile.write(" COLOR "
376-
+ colorNode.getAttribute('red') + ' '
377-
+ colorNode.getAttribute('green') + ' '
378-
+ colorNode.getAttribute('blue')
379-
+ "\n")
371+
self.outFile.write(" STYLE\n")
372+
# use the point symbol map to lookup the mapserver symbol type
373+
symbol = self.msSymbol( geometry, symbolNode )
374+
self.outFile.write(" SYMBOL " + symbol + " \n")
375+
self.outFile.write(" SIZE "
376+
+ symbolNode.getElementsByTagName('pointsize')[0].childNodes[0].nodeValue.encode()
377+
+ " \n")
380378

381-
# label
382-
# currently a very basic bitmap font
383-
# need to extend for font, size, color, buffer, alignment, etc
384-
labelNode = layerNode.getElementsByTagName('labelattributes')[0]
385-
labelField = labelNode.getElementsByTagName('label')[0].getAttribute('field').encode()
386-
if labelField != '' and labelField is not None:
387-
self.outFile.write(" LABEL \n");
388-
self.outFile.write(" SIZE medium\n");
389-
self.outFile.write(" COLOR 0 0 0 \n");
390-
self.outFile.write(" END \n");
379+
# outline color
380+
outlineNode = symbolNode.getElementsByTagName('outlinecolor')[0]
381+
self.outFile.write(" OUTLINECOLOR "
382+
+ outlineNode.getAttribute('red') + ' '
383+
+ outlineNode.getAttribute('green') + ' '
384+
+ outlineNode.getAttribute('blue')
385+
+ "\n")
386+
# color
387+
colorNode = symbolNode.getElementsByTagName('fillcolor')[0]
388+
self.outFile.write(" COLOR "
389+
+ colorNode.getAttribute('red') + ' '
390+
+ colorNode.getAttribute('green') + ' '
391+
+ colorNode.getAttribute('blue')
392+
+ "\n")
391393

392-
# end of CLASS
393-
self.outFile.write(" END\n")
394+
self.outFile.write(" END\n")
395+
396+
self.outFile.write( self.msLabel( layerNode ) )
397+
398+
# end of CLASS
399+
self.outFile.write(" END\n")
394400

395401

396-
# Graduated symbol renderer output
402+
# Graduated symbol renderer output
397403
def graduatedRenderer(self, layerNode, symbolNode):
404+
# get the layers geometry type
405+
geometry = layerNode.getAttribute("geometry").encode().upper()
406+
398407
# get the renderer field for building up the classes
399408
classField = layerNode.getElementsByTagName('classificationattribute')[0].childNodes[0].nodeValue.encode()
400409
# write the render item
@@ -415,91 +424,81 @@ def graduatedRenderer(self, layerNode, symbolNode):
415424
except:
416425
self.outFile.write(" NAME '" + lower + " < " + classField + " < " + upper + "'\n")
417426

418-
self.outFile.write(" EXPRESSION ( ([" + classField + "] >= " + lower + ") AND ([" + classField + "] <= " + upper + ") )\n")
427+
self.outFile.write(" EXPRESSION ( ([" + classField + "] >= " + lower
428+
+ ") AND ([" + classField + "] <= " + upper + ") )\n")
419429

420-
# contains the same markup for a layer regardless of type
421-
# so we infer a symbol type based on the geometry
422-
geometry = layerNode.getAttribute("geometry").encode().upper()
423-
if geometry == 'POLYGON':
424-
symbol = '0'
425-
elif geometry == 'LINE':
426-
symbol = '0'
427-
elif geometry == 'POINT':
428-
symbolName = qgisSymbols[symbolNode.getElementsByTagName('pointsymbol')[0].childNodes[0].nodeValue.encode()]
429-
# make sure it's single quoted
430-
symbol = "'" + symbolName + "'"
431-
self.outFile.write(" SYMBOL " + symbol + "\n")
430+
self.outFile.write(" STYLE\n")
431+
symbol = self.msSymbol( geometry, symbolNode )
432+
self.outFile.write(" SYMBOL " + symbol + "\n")
432433

433434
# Symbol size
434435
if geometry == 'POINT' or geometry == 'LINE':
435-
self.outFile.write(" SIZE "
436+
self.outFile.write(" SIZE "
436437
+ cls.getElementsByTagName('pointsize')[0].childNodes[0].nodeValue.encode()
437438
+ " \n")
438439

439440
# outline color
440441
outlineNode = cls.getElementsByTagName('outlinecolor')[0]
441-
self.outFile.write(" OUTLINECOLOR "
442+
self.outFile.write(" OUTLINECOLOR "
442443
+ outlineNode.getAttribute('red') + ' '
443444
+ outlineNode.getAttribute('green') + ' '
444445
+ outlineNode.getAttribute('blue')
445446
+ "\n")
446447
# color
447448
colorNode = cls.getElementsByTagName('fillcolor')[0]
448-
self.outFile.write(" COLOR "
449+
self.outFile.write(" COLOR "
449450
+ colorNode.getAttribute('red') + ' '
450451
+ colorNode.getAttribute('green') + ' '
451452
+ colorNode.getAttribute('blue')
452453
+ "\n")
453454

455+
self.outFile.write(" END\n")
456+
454457
# label
455-
# currently a very basic bitmap font
456-
# need to extend for font, size, color, buffer, alignment, etc
457-
labelNode = layerNode.getElementsByTagName('labelattributes')[0]
458-
labelField = labelNode.getElementsByTagName('label')[0].getAttribute('field').encode()
459-
if labelField != '' and labelField is not None:
460-
self.outFile.write(" LABEL \n");
461-
self.outFile.write(" SIZE medium\n");
462-
self.outFile.write(" COLOR 0 0 0 \n");
463-
self.outFile.write(" END \n");
458+
self.outFile.write( self.msLabel( layerNode ) )
464459

465460
# end of CLASS
466461
self.outFile.write(" END\n")
467462

468-
# Continuous symbol renderer output
463+
# Continuous symbol renderer output
469464
def continuousRenderer(self, layerNode, symbolNode):
465+
# get the layers geometry type
466+
geometry = layerNode.getAttribute("geometry").encode().upper()
467+
470468
# get the renderer field for building up the classes
471469
classField = layerNode.getElementsByTagName('classificationattribute')[0].childNodes[0].nodeValue.encode()
472470

473471
# write the rendering info for each class
474472
self.outFile.write(" CLASS\n")
475-
476-
lower = symbolNode.getElementsByTagName('lowestsymbol')[0].getElementsByTagName('symbol')[0]
477-
upper = symbolNode.getElementsByTagName('highestsymbol')[0].getElementsByTagName('symbol')[0]
478473

479474
# Class name irrelevant for color ramps since mapserver can't render their legend
480475
#self.outFile.write(" NAME '" + classField + "'\n")
481476

482477
# color
478+
lower = symbolNode.getElementsByTagName('lowestsymbol')[0].getElementsByTagName('symbol')[0]
479+
upper = symbolNode.getElementsByTagName('highestsymbol')[0].getElementsByTagName('symbol')[0]
483480
lowerColor = lower.getElementsByTagName('fillcolor')[0]
484481
upperColor = upper.getElementsByTagName('fillcolor')[0]
485482

486483
# outline color
487484
outlineNode = lower.getElementsByTagName('outlinecolor')[0]
488485

489486
self.outFile.write(" STYLE\n")
487+
488+
# The first and last color of the ramp ( r g b r g b )
490489
self.outFile.write(" COLORRANGE "
491490
+ lowerColor.getAttribute('red') + " "
492491
+ lowerColor.getAttribute('green') + " "
493492
+ lowerColor.getAttribute('blue') + " "
494493
+ upperColor.getAttribute('red') + " "
495494
+ upperColor.getAttribute('green') + " "
496495
+ upperColor.getAttribute('blue') + "\n")
497-
# QGIS project file is a bit unclear...
498-
# lower.lowervalue <-> upper.lowervalue
499-
# upper.LOWER value .. hmm ...
496+
497+
# The range of values over which to ramp the colors
500498
self.outFile.write(" DATARANGE "
501499
+ lower.getElementsByTagName('lowervalue')[0].childNodes[0].nodeValue.encode() + ' '
502500
+ upper.getElementsByTagName('lowervalue')[0].childNodes[0].nodeValue.encode() + '\n')
501+
503502
self.outFile.write(" RANGEITEM '" + classField + "'\n")
504503
self.outFile.write(" END\n")
505504

@@ -511,24 +510,20 @@ def continuousRenderer(self, layerNode, symbolNode):
511510
self.outFile.write(" END\n")
512511

513512
# label
514-
# currently a very basic bitmap font
515-
# need to extend for font, size, color, buffer, alignment, etc
516-
labelNode = layerNode.getElementsByTagName('labelattributes')[0]
517-
labelField = labelNode.getElementsByTagName('label')[0].getAttribute('field').encode()
518-
if labelField != '' and labelField is not None:
519-
self.outFile.write(" LABEL \n");
520-
self.outFile.write(" SIZE medium\n");
521-
self.outFile.write(" COLOR 0 0 0 \n");
522-
self.outFile.write(" END \n");
513+
self.outFile.write( self.msLabel( layerNode ))
523514

524515
# end of CLASS
525516
self.outFile.write(" END\n")
526517

527518

528-
# Unique value renderer output
519+
# Unique value renderer output
529520
def uniqueRenderer(self, layerNode, symbolNode):
530521
# get the renderer field for building up the classes
531522
classField = layerNode.getElementsByTagName('classificationattribute')[0].childNodes[0].nodeValue.encode()
523+
524+
# get the layers geometry type
525+
geometry = layerNode.getAttribute("geometry").encode().upper()
526+
532527
# write the render item
533528
self.outFile.write(" CLASSITEM '" + classField + "'\n")
534529

@@ -548,55 +543,42 @@ def uniqueRenderer(self, layerNode, symbolNode):
548543

549544
self.outFile.write(" EXPRESSION '" + lower + "' \n")
550545

551-
# contains the same markup for a layer regardless of type
552-
# so we infer a symbol type based on the geometry
553-
geometry = layerNode.getAttribute("geometry").encode().upper()
554-
if geometry == 'POLYGON':
555-
symbol = '0'
556-
elif geometry == 'LINE':
557-
symbol = '0'
558-
elif geometry == 'POINT':
559-
symbolName = qgisSymbols[symbolNode.getElementsByTagName('pointsymbol')[0].childNodes[0].nodeValue.encode()]
560-
# make sure it's single quoted
561-
symbol = "'" + symbolName + "'"
562-
self.outFile.write(" SYMBOL " + symbol + "\n")
546+
# Get the symbol name
547+
symbol = self.msSymbol( geometry, symbolNode )
548+
549+
self.outFile.write(" STYLE\n")
550+
self.outFile.write(" SYMBOL " + symbol + "\n")
563551

564552
# Symbol size
565553
if geometry == 'POINT' or geometry == 'LINE':
566-
self.outFile.write(" SIZE "
554+
self.outFile.write(" SIZE "
567555
+ cls.getElementsByTagName('pointsize')[0].childNodes[0].nodeValue.encode()
568556
+ " \n")
569557

570558
# outline color
571559
outlineNode = cls.getElementsByTagName('outlinecolor')[0]
572-
self.outFile.write(" OUTLINECOLOR "
560+
self.outFile.write(" OUTLINECOLOR "
573561
+ outlineNode.getAttribute('red') + ' '
574562
+ outlineNode.getAttribute('green') + ' '
575563
+ outlineNode.getAttribute('blue')
576564
+ "\n")
565+
577566
# color
578567
colorNode = cls.getElementsByTagName('fillcolor')[0]
579-
self.outFile.write(" COLOR "
568+
self.outFile.write(" COLOR "
580569
+ colorNode.getAttribute('red') + ' '
581570
+ colorNode.getAttribute('green') + ' '
582571
+ colorNode.getAttribute('blue')
583572
+ "\n")
573+
self.outFile.write(" END\n")
584574

585575
# label
586-
# currently a very basic bitmap font
587-
# need to extend for font, size, color, buffer, alignment, etc
588-
labelNode = layerNode.getElementsByTagName('labelattributes')[0]
589-
labelField = labelNode.getElementsByTagName('label')[0].getAttribute('field').encode()
590-
if labelField != '' and labelField is not None:
591-
self.outFile.write(" LABEL \n");
592-
self.outFile.write(" SIZE medium\n");
593-
self.outFile.write(" COLOR 0 0 0 \n");
594-
self.outFile.write(" END \n");
595-
576+
self.outFile.write( self.msLabel( layerNode ))
577+
596578
# end of CLASS
597579
self.outFile.write(" END\n")
598580

599-
# Utility method to format a proj4 text string into mapserver format
581+
# Utility method to format a proj4 text string into mapserver format
600582
def formatProj4(self, proj4text):
601583
parms = proj4text.split(" ")
602584
ret = ""
@@ -605,3 +587,80 @@ def formatProj4(self, proj4text):
605587
ret = ret + " '" + p + "'\n"
606588
return ret
607589

590+
# Determines the symbol name and adds it to the symbol queue
591+
def msSymbol(self, geometry, symbolNode):
592+
# contains the same markup for a layer regardless of type
593+
# so we infer a symbol type based on the geometry
594+
symbolName = ''
595+
symbol = '0'
596+
597+
if geometry == 'POLYGON':
598+
symbol = '0'
599+
elif geometry == 'LINE':
600+
symbol = '0'
601+
elif geometry == 'POINT':
602+
try:
603+
symbolName = qgisSymbols[symbolNode.getElementsByTagName('pointsymbol')[0].childNodes[0].nodeValue.encode()]
604+
except:
605+
symbolName = "CIRCLE"
606+
# make sure it's single quoted
607+
symbol = "'" + symbolName + "'"
608+
609+
if symbolName == 'CIRCLE':
610+
self.symbolQueue['CIRCLE'] = """
611+
#Circle symbol
612+
SYMBOL
613+
NAME 'CIRCLE'
614+
TYPE ellipse
615+
FILLED true
616+
POINTS
617+
1 1
618+
END
619+
END """
620+
621+
if symbolName == 'TRIANGLE':
622+
self.symbolQueue['TRIANGLE'] = """
623+
SYMBOL
624+
NAME "TRIANGLE"
625+
TYPE vector
626+
FILLED true
627+
POINTS
628+
0 1
629+
.5 0
630+
1 1
631+
0 1
632+
END
633+
END """
634+
635+
return symbol
636+
637+
# Label block creation
638+
# TODO field-based parameters, alignment, truetype fonts, sizes
639+
def msLabel(self, layerNode):
640+
# currently a very basic bitmap font
641+
labelNode = layerNode.getElementsByTagName('labelattributes')[0]
642+
labelField = labelNode.getElementsByTagName('label')[0].getAttribute('field').encode()
643+
if labelField != '' and labelField is not None:
644+
labelBlock = " LABEL \n"
645+
646+
labelBlock += " SIZE medium\n"
647+
labelBlock += " COLOR 0 0 0 \n"
648+
649+
# Include label angle if specified
650+
# Note that angles only work for truetype fonts which aren't supported yet
651+
angle = labelNode.getElementsByTagName('angle')[0].getAttribute('value').encode()
652+
labelBlock += " ANGLE " + angle + "\n"
653+
654+
# Include label buffer if specified
655+
# Note that the buffer has different meaning in qgis vs mapserver
656+
# mapserver just adds blank space around the label while
657+
# qgis uses a fill color around the label
658+
# Note that buffer only works for truetype fonts which aren't supported yet
659+
buffer = labelNode.getElementsByTagName('buffersize')[0].getAttribute('value').encode()
660+
labelBlock += " BUFFER " + buffer + "\n"
661+
662+
labelBlock += " END \n"
663+
return labelBlock
664+
else:
665+
return ''
666+

‎tools/mapserver_export/qgsmapserverexport.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ void QgsMapserverExport::on_buttonOk_clicked()
145145
{
146146
std::cout << "Initializing all options" << std::endl;
147147
pmeth = PyObject_GetAttrString(pinst, "setOptions");
148-
pargs = Py_BuildValue("(ssssssssss)",
148+
pargs = Py_BuildValue("(ssssssss)",
149149
cmbMapUnits->currentText().ascii(), cmbMapImageType->currentText().ascii(),
150150
txtMapName->text().ascii(), txtMapWidth->text().ascii(), txtMapHeight->text().ascii(),
151151
txtWebTemplate->text().ascii(), txtWebFooter->text().ascii(),txtWebHeader->text().ascii());

‎tools/mapserver_export/test_export.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
# test script to export a sample QGIS project file to mapserver
44
import ms_export
55
ex = ms_export.Qgis2Map('./test1.qgs', './test1.map')
6-
ex.setOptions( 'Meters', 'PNG', 'TestMap', '800', '600', '','','template', 'header', 'footer')
6+
ex.setOptions( 'Meters', 'JPEG', 'TestMap', '800', '600', '', '', '')
77

88
ex.writeMapFile()

0 commit comments

Comments
 (0)
Please sign in to comment.