/[thuban]/trunk/thuban/Extensions/umn_mapserver/mapfile.py
ViewVC logotype

Annotation of /trunk/thuban/Extensions/umn_mapserver/mapfile.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2857 - (hide annotations)
Sun Jul 27 05:30:28 2008 UTC (16 years, 7 months ago) by elachuni
File MIME type: text/x-python
File size: 51745 byte(s)
Applying patch #689 (Support for PostGIS layers in umn_mapserver extension).


1 jschuengel 2235 # -*- coding:latin1 -*-
2     # Copyright (C) 2004 by Intevation GmbH
3     # Authors:
4     # Jan Schüngel <[email protected]>
5     #
6     # This program is free software under the GPL (>=v2)
7     # Read the file COPYING coming with Thuban for details.
8    
9     """
10     Classes to represent '.map'-file Objects.
11    
12     The following Classes, which are implemented in
13     mapscript are not implemented yet in this extension:
14    
15     DBFInfo, errorObj, fontSetObj, graticuleObj, imageObj, itemObj,
16 jschuengel 2273 labelCacheMemberObj, labelCacheObj,
17     markerCacheMembet, msTiledSHPLayerInfo, queryMapObj,
18     referenzMapObj, resultCacheMemberObj, resultCacheObj,
19     shapefileObj, shapeObj, VectorObj
20    
21     the following are only used to create a necessary object. They are not
22     realy created as a MF_Object.
23    
24     lineObj, pointObj
25 jschuengel 2235 """
26    
27     __version__ = "$Revision$"
28     # $Source$
29     # $Id$
30    
31    
32     # ##################################################
33     #
34     # import necessary modules from python and/or thuban
35     #
36     # ##################################################
37    
38 jschuengel 2252 import os
39 jschuengel 2235
40 jschuengel 2252 from Thuban.Model.color import Color, Transparent
41 jschuengel 2235
42 jschuengel 2284 from Thuban.Model.classification import ClassGroupDefault, \
43     ClassGroupSingleton, ClassGroupRange
44    
45 elachuni 2856 import mapscript
46 jschuengel 2265 from mapscript import layerObj, classObj, colorObj, styleObj, rectObj, symbolObj, \
47     pointObj, lineObj
48 jschuengel 2326
49     from Thuban.Model.layer import RasterLayer
50 jschuengel 2252
51 jschuengel 2235 # ###################################
52     #
53     # Definition of dictionaries
54     #
55 jschuengel 2273 # the dictonaries are like in mapscript and are used to make it
56     # easear to unterstand the key from mapscript for the settings
57     #
58 jschuengel 2235 # ###################################
59    
60     shp_type = { 0:'point',
61     1:'line',
62     2:'polygon',
63     3:'raster',
64     4:'annotation',
65     5:'circle',
66     6:'query'}
67    
68 jschuengel 2260 unit_type = { 0:"inches",
69 jschuengel 2273 1:"feet",
70     2:"miles",
71     3:"meters",
72     4:"kilometers",
73     5:"dd"}
74 jschuengel 2235
75 jschuengel 2260 legend_status_type = { 0:"OFF",
76 jschuengel 2273 1:"ON",
77     3:"embed" }
78     # 2 = Default but is not allowed here
79    
80 jschuengel 2265 scalebar_status_type = { 0:"OFF",
81 jschuengel 2273 1:"ON",
82     3:"embed" }
83     # 2 = Default but is not allowed here
84    
85 jschuengel 2265 scalebar_style_type = { 0:"0",
86     1:"1" }
87    
88 elachuni 2856 scalebar_position_type = { mapscript.MS_UL:"ul",
89     mapscript.MS_LR:"lr",
90     mapscript.MS_UR:"ur",
91     mapscript.MS_LL:"ll",
92     mapscript.MS_UC:"uc",
93     mapscript.MS_LC:"lc"}
94 jschuengel 2265
95 jschuengel 2260 layer_status_type = { 0:"OFF",
96 jschuengel 2273 1:"ON",
97     2:"default"}
98 jschuengel 2260
99 elachuni 2857 layer_connection_type = { mapscript.MS_INLINE:"inline",
100     mapscript.MS_SHAPEFILE:"shapefile",
101     mapscript.MS_TILED_SHAPEFILE:"tiled shapefile",
102     mapscript.MS_SDE:"sde",
103     mapscript.MS_OGR:"ogr",
104     mapscript.MS_POSTGIS:"postgis",
105     mapscript.MS_WMS:"wms",
106     mapscript.MS_ORACLESPATIAL:"oracle spatial",
107     mapscript.MS_WFS:"wfs",
108     mapscript.MS_GRATICULE:"graticule",
109     mapscript.MS_MYGIS:"mygis",
110     mapscript.MS_RASTER:"raster"}
111    
112 jschuengel 2260 legend_position_type = { 0:"ul",
113     1:"lr",
114     2:"ur",
115     3:"ll",
116     6:"uc",
117     7:"lc"}
118    
119     label_size_type = { 0:"tiny",
120     1:"small",
121     2:"medium",
122     3:"large",
123     4:"giant" }
124    
125 jschuengel 2270 #TODO: build in truetype (0:"truetype") support
126     label_font_type = { 1:"bitmap" }
127 jschuengel 2260
128 jschuengel 2270 label_position_type = { 0:"ul",
129 jschuengel 2273 1:"lr",
130     2:"ur",
131     3:"ll",
132     4:"cr",
133     5:"cl",
134     6:"uc",
135     7:"lc",
136     8:"cc",
137     10:"auto"}
138 jschuengel 2260
139 jschuengel 2270
140 jschuengel 2235 # ##################################################
141     #
142     # Class Definition
143     #
144     # ##################################################
145    
146     # ##################################################
147 jschuengel 2252 # General Classes that are not all explicitly defined through
148 jschuengel 2235 # a mapfile, but rather some helper-classes.
149    
150     class MF_Rectangle:
151     """
152     Represents an rectanle with the bottom left
153     and top right corner.
154     """
155     def __init__(self,mf_rect):
156     self._rect = mf_rect
157    
158     def get_minx(self):
159     return self._rect.minx
160    
161     def get_miny(self):
162     return self._rect.miny
163    
164     def get_maxx(self):
165     return self._rect.maxx
166    
167     def get_maxy(self):
168     return self._rect.maxy
169 jschuengel 2252
170     def get_rect(self):
171     return (self._rect.minx,self._rect.miny,self._rect.maxx,self._rect.maxy)
172 jschuengel 2235
173 jschuengel 2252 def set_rect(self, minx, miny, maxx, maxy):
174     self._rect.minx = minx
175     self._rect.miny = miny
176     self._rect.maxx = maxx
177     self._rect.maxy = maxy
178 jschuengel 2235
179     class MF_Color:
180     """
181     The corresponding MapScript object contains also the
182     attribute pen which defines the stroke of the feature.
183     But this actually has nothing to do with the color and
184     therefore is not support here.
185    
186     It needs to be discussed with the MapServer developers
187     whether pen would better be moved to another class.
188    
189     The hex color definition which is also supported by
190     mapscript and Thuban is not supported as it does
191     not add any capability.
192    
193     color is definied as RGB 0..255
194 jschuengel 2252 """
195 jschuengel 2235 def __init__(self, mf_color):
196     self._color = mf_color
197     self._tbc_red = (float(self.get_red())/255)
198     self._tbc_green = (float(self.get_green())/255)
199     self._tbc_blue = (float(self.get_blue())/255)
200 jschuengel 2273 self._thubancolor = Color(self._tbc_red,
201     self._tbc_green,
202     self._tbc_blue)
203 jschuengel 2235
204     # TODO : Check if it is necessary to use rgb colors alone
205     # or whether it is sufficient to only use the Thuban Color.
206     # In some it is necessary as red == -1 indicates that no color
207     # is set.
208     def get_red(self):
209     return self._color.red
210    
211     def get_green(self):
212     return self._color.green
213    
214     def get_blue(self):
215     return self._color.blue
216 jschuengel 2252
217 jschuengel 2260 def set_rgbcolor(self, red, green, blue):
218     self._color.red = red
219     self._color.green = green
220     self._color.blue = blue
221    
222     self._tbc_red = (float(self.get_red())/255)
223     self._tbc_green = (float(self.get_green())/255)
224     self._tbc_blue = (float(self.get_blue())/255)
225 jschuengel 2273 self._thubancolor = Color(self._tbc_red,
226     self._tbc_green,
227     self._tbc_blue)
228 jschuengel 2260
229 jschuengel 2252 def get_mfcolor(self):
230     return self._color
231 jschuengel 2235
232     def get_thubancolor(self):
233 jschuengel 2252 return self._thubancolor
234 jschuengel 2235
235     def set_thubancolor(self, thuban_color):
236 jschuengel 2252 if thuban_color != Transparent:
237     self._color.red = int(thuban_color.red * 255)
238     self._color.green = int(thuban_color.green * 255)
239     self._color.blue = int(thuban_color.blue * 255)
240     self._thubancolor = thuban_color
241 jschuengel 2235
242    
243     class MF_Metadata:
244     """
245     Metadata is not a Object in mapscript witch can be used
246     by ease. Only the infos can get with the functions
247     "getFirstMetaDataKey", "getNextMetaDataKey" and "getMetaData".
248 jschuengel 2301 To get some special Metadata you need a key. So there is a special
249     function which create a list of the metadatakeys.
250     """
251     def __init__(self, mapobj):
252     self.mapobj = mapobj
253    
254 jschuengel 2316 def remove_allmetadata(self):
255     keylist = self.get_metadatakeys()
256     if keylist:
257     for key in keylist:
258     self.mapobj.removeMetaData(key)
259    
260 jschuengel 2301 def get_metadatakeys(self):
261     keylist = []
262 jschuengel 2235 try:
263 jschuengel 2301 metafkey =self.mapobj.getFirstMetaDataKey()
264     keylist.append(metafkey)
265 jschuengel 2235 except:
266 jschuengel 2301 return None
267 jschuengel 2235 else:
268 jschuengel 2301 if metafkey:
269     while metafkey:
270     metafkey = self.mapobj.getNextMetaDataKey(metafkey)
271     if metafkey:
272     keylist.append(metafkey)
273     return keylist
274    
275 jschuengel 2235 def get_metadata(self):
276 jschuengel 2301 keylist = self.get_metadatakeys()
277     metadatalist = []
278     if keylist:
279     for key in keylist:
280     metadatalist.append([key,self.mapobj.getMetaData(key)])
281     return metadatalist
282     else:
283     return None
284 jschuengel 2235
285     def get_metadatabykey(self, key):
286 jschuengel 2301 return self.mapobj.getMetaData(key)
287    
288     def remove_metadatabykey(self, key):
289     self.mapobj.removeMetaData(key)
290 jschuengel 2235
291     def add_metadata(self, key, data):
292 jschuengel 2301 self.mapobj.setMetaData(key,data)
293 jschuengel 2235
294 jschuengel 2273 # ################################################
295 jschuengel 2235 # Classes for MapServer Objects as they are
296 jschuengel 2252 # explicitly defined in a mapfile
297 jschuengel 2273
298 jschuengel 2270 class MF_Outputformat:
299 jschuengel 2273 """
300     The Outputformat defines which and how the image is
301     created by the mapserver.
302    
303     The following settings are used:
304     name
305    
306     The following settings are not used:
307     mimetye, driver, extension, renderer, imagemode, transparent,
308     bands, numfrotmatoptions, formatoptions, refcount, inmapfile
309     setExtension(), setMimetype(), setOption(), getOption()
310     """
311 jschuengel 2270 def __init__(self, mf_outputformat):
312     self._outputformat = mf_outputformat
313    
314     def get_name(self):
315     return self._outputformat.name
316    
317    
318 jschuengel 2252 class MF_Symbol:
319     """
320     defines a single symbol which is used in the Symbolset
321    
322 jschuengel 2273 the following settings are used:
323     name, type,
324    
325     the following settings are not used:
326     sizex, sizey, points, numpoints, filled, stylelength,
327 jschuengel 2252 style, imagepath, transparent, transparentcolor, character, antialias,
328     font, gap, position, linecap, linejoin, linejoinmaxsize, setPoints(),
329     getPoints(), setStyle()
330 jschuengel 2273 """
331 jschuengel 2265 def __init__(self, mf_symbol = "newone"):
332     # create a circle Object like shown in Thuban
333     # because Thuban don't support other symbols
334 jschuengel 2273
335     # TODO: include the options to create a symbol, but
336     # first implement a methode to edit Symbols in Thuban
337 jschuengel 2265 if mf_symbol == "newone":
338     mf_symbol = symbolObj("")
339     newpoint = pointObj()
340     newpoint.x = 1
341     newpoint.y = 1
342     newline = lineObj()
343     newline.add(newpoint)
344     mf_symbol.setPoints(newline)
345    
346     self._symbol = mf_symbol
347    
348     def get_symbolObj(self):
349     return self._symbol
350    
351     def get_name(self):
352     return self._symbol.name
353    
354     def set_name(self, new_name):
355     self._symbol.name = new_name
356    
357 jschuengel 2273 def get_type(self):
358     return self._symbol.type
359    
360 jschuengel 2265 def set_type(self, new_type):
361     # TODO include a function to set the type by a string
362     self._symbol.type = new_type
363    
364 jschuengel 2273 def get_filled(self):
365     return self._symbol.filled
366    
367 jschuengel 2265 def set_filled(self, new_filled):
368     if new_filled:
369     self._symbol.filled = 1
370     else:
371     self._symbol.filled = 0
372 jschuengel 2252
373 jschuengel 2273
374 jschuengel 2252 class MF_SymbolSet:
375     """
376     defines a set of symbols, may be there can only be one
377    
378 jschuengel 2273 the following settings are used:
379     numsymbols,
380     appendSymbol()
381    
382     filename, imagecachesize, symbol, getSymbol(),
383     getSymbolByName(), index(), removeSymbol(),
384 jschuengel 2252 save()
385     """
386     def __init__(self, mf_symbolset):
387 jschuengel 2265 self._symbolset = mf_symbolset
388    
389     # Initial Symbol List
390     self._symbols = []
391     self._i = 1
392 jschuengel 2284 while self._i < self._symbolset.numsymbols:
393 jschuengel 2265 self._symbols.append(MF_Symbol(self._symbolset.getSymbol(self._i)))
394     self._i += 1
395 jschuengel 2252
396 jschuengel 2265 def add_symbol(self, new_symbol):
397     self._symbolset.appendSymbol(new_symbol.get_symbolObj())
398     self._symbols.append(new_symbol)
399     # the save function must be run to set the symbols to the
400     # mapfile. I don't know why this ist so but it must be.
401 jschuengel 2273 # the file is empty then an we can delete it
402 jschuengel 2265 self._symbolset.save("tempsymbol")
403     os.remove("tempsymbol")
404    
405     def get_symbol(self, symbolnr):
406 jschuengel 2284 if symbolnr < self._symbolset.numsymbols:
407 jschuengel 2265 return self._symbols[symbolnr-1]
408     else:
409     return None
410    
411 jschuengel 2273
412 jschuengel 2235 class MF_Class:
413     """
414     The following parameters and functions, which the mapscript style obj
415     contains, are used:
416 jschuengel 2273 styles, numstyles, name, status, keyimage, layer,
417 jschuengel 2252 getExpressionString(), setExpression(), getMetaData(), getFirstMetaDataKey(),
418 jschuengel 2235 getNextMetaDataKey(), getStyle()
419    
420     The following parameters and functions are not used:
421 jschuengel 2273 label, title, template, type, minscale, maxscale, debug,
422 jschuengel 2235 setExpression(), setText(), setMetaData(), drawLegendIcon(),
423     createLegendIcon(), insertStyle(), removeStyle(), moveStyleUp(),
424     moveStyleDown()
425     """
426     def __init__(self, mf_class):
427     """
428     Initialized a class from them given mapscript Class Object
429     with a list of the included styles.
430     Metadata Object will be created from the Metadata informations
431     wich are holt as a List i think.
432     """
433     self._clazz = mf_class
434     self._styles = []
435     self._numstyles = mf_class.numstyles
436     for i in range(0,self._numstyles,1):
437     self._styles.append(MF_Style(mf_class.getStyle(i)))
438    
439     if self._clazz.getExpressionString() == '"(null)"':
440     self._expression = None
441     else:
442     self._expression = self._clazz.getExpressionString()
443    
444 jschuengel 2301 self.metadata = MF_Metadata(self._clazz)
445 jschuengel 2235
446     def get_styles(self):
447     return self._styles
448    
449     def get_name(self):
450     return self._clazz.name
451    
452     def get_keyimage(self):
453     return self._clazz.keyimage
454    
455     def get_expressionstring(self):
456     return self._expression
457 jschuengel 2252
458     def set_name(self, newname):
459     self._clazz.name = newname
460    
461     def set_expressionstring(self, newstring):
462     self._clazz.setExpression(newstring)
463     self._expression = self._clazz.getExpressionString()
464    
465 jschuengel 2265 def get_status(self):
466     if self._clazz.status == 1:
467     return True
468     else:
469     return False
470    
471     def set_status(self, new_status):
472     if new_status:
473     self._clazz.status = 1
474     else:
475     self._clazz.status = 0
476    
477 jschuengel 2252 def add_thubanstyle(self, tb_style, type="default"):
478 jschuengel 2260 """
479     added a thuban style object to the mapobject
480     """
481 jschuengel 2252 new_styleobj = MF_Style(styleObj(self._clazz))
482     if type == "line":
483     new_styleobj.set_color(tb_style.GetLineColor())
484 jschuengel 2260 elif type == "point":
485 jschuengel 2252 # set a default symbol to show circles not only a small dot
486     # symbol "circle" must create before
487     # TODO: create a Symbol (more see MF_SymbolSet)
488 jschuengel 2260 # first the default symbol circle will be created and the size 8
489     new_styleobj.set_symbolname('circle')
490     new_styleobj.set_size(8)
491     if tb_style.GetLineColor() != Transparent:
492     new_styleobj.set_linecolor(tb_style.GetLineColor())
493     new_styleobj.set_color(tb_style.GetFill())
494 jschuengel 2252 else:
495     new_styleobj.set_size(tb_style.GetLineWidth())
496 jschuengel 2340 if tb_style.GetLineColor() != Transparent:
497     new_styleobj.set_linecolor(tb_style.GetLineColor())
498 jschuengel 2252 new_styleobj.set_color(tb_style.GetFill())
499 jschuengel 2235
500    
501 jschuengel 2265
502 jschuengel 2235 class MF_Layer:
503     """
504     The following parameters and functions, which the mapscript style obj
505     contains, are used:
506    
507     classitem, numclasses, name, data, type
508     getClass(), getProjection(), getExtent(), getMetaData(),
509 jschuengel 2252 getFirstMetaDataKey(), getNextMetaDataKey(), status,
510 jschuengel 2235
511    
512     The following paramters and functions are not used:
513 jschuengel 2252 index, map, header, footer, template, groupe, tolerance,
514 jschuengel 2235 toleranceunits, symbolscale, minscale, maxscale, labelminscale
515     labelmaxscale, sizeunits, maxfeatures, offsite, transform, labelcache
516     postlabelcache, labelitem, labelsizeitem, labelangleitem, labelitemindex
517     labelsizeitemindex, labelangleitemindex, tileitem, tileindex, units
518 elachuni 2857 numitems, filteritem, styleitem, requires
519 jschuengel 2235 labelrequires, transparency, dump, debug, numprocessing, numjoins,
520     removeClass(), open(), close(), getShape(), getNumResults(), getResult()
521     getItem(), promote(), demote(), draw(), drawQuery(), queryByAttributes()
522     queryByPoint(), queryByRect(), queryByFeatures(), queryByShape(),
523     setFilter(), setFilterString(), setWKTProjection(), setProjection()
524     addFeature(), getNumFeatures(), setMetaData(), removeMetaData(),
525     getWMSFeatureInfoURL(), executeWFSGetFeature(), applySLD(), applySLDURL()
526     enerateSLD(), moveClassUp(), moveClassDown(), setProcessing(),
527     getProcessing(), clearProcessing()
528     """
529    
530     def __init__(self, mf_layer):
531     """
532     Creates the Layer Object from the mapscript Layer Object.
533     the class objects in the layer object will be stored in
534     an array. The metadata are created as a new object.
535     """
536     self._mf_layer = mf_layer
537    
538     # Create Classes
539     # there could be more then 1
540     self._classes = []
541 elachuni 2857 for i in range (self._mf_layer.numclasses):
542 jschuengel 2235 self._classes.append(MF_Class(self._mf_layer.getClass(i)))
543    
544     self._projection = MF_Projection(self._mf_layer.getProjection())
545    
546     # Create Metadata
547 jschuengel 2301 self._metadata = MF_Metadata(self._mf_layer)
548 jschuengel 2235
549 jschuengel 2326 def get_index(self):
550     return self._mf_layer.index
551    
552 jschuengel 2235 def get_name(self):
553     return self._mf_layer.name
554    
555     def get_data(self):
556     return self._mf_layer.data
557 jschuengel 2326
558 elachuni 2857 def get_connection(self):
559     return self._mf_layer.connnection
560    
561     def get_connectiontype(self):
562     return self._mf_layer.connectiontype
563    
564 jschuengel 2235 def get_classes(self):
565     return self._classes
566 jschuengel 2301
567 jschuengel 2326 def set_classes(self, new_classes):
568     self._classes = new_classes
569    
570 jschuengel 2301 def get_metadata(self):
571     return self._metadata
572 jschuengel 2326
573     def set_metadata(self, new_metadata):
574     self._metadata = new_metadata
575 jschuengel 2301
576 jschuengel 2235 def get_type(self):
577     return shp_type[self._mf_layer.type]
578    
579     def get_classitem(self):
580     return self._mf_layer.classitem
581    
582     def get_projection(self):
583     return self._projection
584 jschuengel 2252
585     def get_status(self):
586     # returns a integer value
587     # 0 = off, 1 = on, 2 = default(always on)
588     if self._mf_layer.status == 0:
589     return False
590     else:
591     return True
592    
593 jschuengel 2316 def get_group(self):
594     return self._mf_layer.group
595    
596     def set_group(self, new_group):
597     self._mf_layer.group = new_group
598    
599 jschuengel 2252 def set_name(self, newname):
600     self._mf_layer.name = newname
601    
602 jschuengel 2260 def set_data(self, newdata, type="shape"):
603 elachuni 2857 if type == "shape":
604     self._mf_layer.data = newdata[:-4]
605     else:
606 jschuengel 2260 self._mf_layer.data = newdata
607 elachuni 2857
608     def set_connection (self, newconnection):
609     self._mf_layer.connection = newconnection
610    
611     def set_connectiontype (self, newtype):
612     self._mf_layer.connectiontype = newtype
613    
614 jschuengel 2252 def set_status(self, newstatus):
615     # status can set to true or false from thuban.
616     # but mapserver supports the default value
617     self._mf_layer.status = newstatus
618    
619     def set_classitem(self, tb_field):
620     self._mf_layer.classitem = tb_field
621    
622     def set_type(self, tb_type):
623     # if type = arc its a in shapetype line
624     if tb_type == "arc":
625     self._mf_layer.type = 1
626 jschuengel 2260 if tb_type == "raster":
627     self._mf_layer.type = 3
628 jschuengel 2252 if shp_type.has_key(tb_type):
629     self._mf_layer.type = tb_type
630     else:
631     for shp_paar_nr in shp_type:
632     if shp_type[shp_paar_nr] == tb_type:
633     self._mf_layer.type = shp_paar_nr
634     return
635    
636     def set_projection(self, newprojection):
637     self._mfnewprojstring = ""
638     if newprojection:
639     self._newparams = newprojection.GetAllParameters()
640     for field in self._newparams:
641     self._mfnewprojstring = self._mfnewprojstring+ "," + field
642     self._mf_layer.setProjection(self._mfnewprojstring[1:])
643     self._projection.set_projection(newprojection)
644    
645 jschuengel 2260 def add_thubanclass(self, tb_class, type=""):
646     """
647     Add a thuban class object
648 jschuengel 2326 """
649 jschuengel 2252 new_class = MF_Class(classObj(self._mf_layer))
650 jschuengel 2326 self._classes.append(new_class)
651 jschuengel 2284 # set the class name to the Label form thuban if given,
652     # else set it to the value
653     if tb_class.GetLabel() != "":
654     new_class.set_name(tb_class.GetLabel())
655     else:
656     if isinstance(tb_class, ClassGroupDefault):
657     new_class.set_name("default")
658     elif isinstance(tb_class, ClassGroupSingleton):
659     new_class.set_name(str(tb_class.GetValue()))
660     else:
661 jschuengel 2301 new_class.set_name(None)
662 jschuengel 2252 if self.get_type() == "line":
663     new_class.add_thubanstyle(tb_class.GetProperties(), type="line")
664 jschuengel 2260 elif self.get_type() == "point":
665     new_class.add_thubanstyle(tb_class.GetProperties(), type="point")
666 jschuengel 2252 else:
667     new_class.add_thubanstyle(tb_class.GetProperties())
668 jschuengel 2260 if (type == "default"):
669 jschuengel 2252 return
670 jschuengel 2284 # removed the following two lines to check if the expressionstring
671     # is needed for points, because if expressionstring is a range type,
672     # no expressionstring in the default group is allowed
673 jschuengel 2260 elif (tb_class.Matches("DEFAULT")):
674 jschuengel 2284 return
675     # new_class.set_expressionstring('/./')
676 jschuengel 2252 else:
677 jschuengel 2284 #check which type of expression
678     if isinstance(tb_class, ClassGroupRange):
679     # get the needed infos from the Range-String
680     self._range_begin = tb_class.GetRange()[0]
681     self._range_min = str(tb_class.GetMin())
682     self._range_max = str(tb_class.GetMax())
683     self._range_end = tb_class.GetRange()[len(tb_class.GetRange())-1]
684     self._range_umn = ""
685     self._range_classitem = self.get_classitem()
686     # generate the operator
687     if self._range_begin == "[":
688     self._range_op1 = ">="
689     elif self._range_begin == "]":
690     self._range_op1 = ">"
691     else:
692     print "error in Thuban class properties"
693     #build op1 string for the lower limit
694     self._range_op1 = "[" + self._range_classitem + "] " + \
695     self._range_op1 + " " +\
696     self._range_min
697     # build op2 string for the upper limit
698     if self._range_end == "[":
699     self._range_op2 = "<"
700     elif self._range_end == "]":
701     self._range_op2 = "<="
702     else:
703     print "error in Thuban class properties"
704    
705     self._range_op2 = "[" + self._range_classitem + "] " + \
706     self._range_op2 + " " +\
707     self._range_max
708     # we only need AND here at the moment, becaus of the limits
709     # in thuban
710     self._range_combine = "AND"
711     # check if the one limit is set to inf and then
712     # remove the second expression becaus is not needed.
713     if self._range_min == "-inf":
714     self._range_combine = ""
715     self._range_op1 = ""
716     elif self._range_max == "inf":
717     self._range_combine = ""
718     self._range_op2 = ""
719     # build the expression together
720     self._range_umn = "(" + self._range_umn + \
721     self._range_op1 + " " +\
722     self._range_combine + \
723     self._range_op2 + " )"
724 jschuengel 2287
725 jschuengel 2284 #set the expression to the mapscript
726     new_class.set_expressionstring(self._range_umn)
727     else:
728     new_class.set_expressionstring(str(tb_class.GetValue()))
729 jschuengel 2265 new_class.set_status(tb_class.IsVisible())
730 jschuengel 2235
731 jschuengel 2326 def remove_allclasses(self):
732     for i in range(0,len(self.get_classes()), 1):
733     self._mf_layer.removeClass(i)
734     self.set_classes([])
735 jschuengel 2273
736 jschuengel 2265 class MF_Scalebar:
737     """
738 jschuengel 2273 Represent the scalebar for a map
739    
740     The following settings are used:
741     label, color, imagecolor, style, intervals, units,
742     status, position, height, width
743    
744 jschuengel 2265 The following settings are (not) used:
745 jschuengel 2273 backgroundcolor,outlinecolor, postlabelcache
746 jschuengel 2265 """
747     def __init__(self, mf_scalebar):
748     self._scalebar = mf_scalebar
749     self._color = MF_Color(self._scalebar.color)
750     self._imagecolor = MF_Color(self._scalebar.imagecolor)
751     self._label = MF_Label(self._scalebar.label)
752    
753     def get_label(self):
754     return self._label
755    
756     def get_color(self):
757     return self._color
758    
759     def get_imagecolor(self):
760     return self._imagecolor
761    
762     def get_style(self):
763     return self._scalebar.style
764    
765     def set_style(self, new_style):
766     self._scalebar.style = new_style
767    
768     def get_size(self):
769     #returns the size
770     return (self._scalebar.width, self._scalebar.height)
771 jschuengel 2260
772 jschuengel 2265 def set_size(self, new_width, new_height):
773     self._scalebar.width = new_width
774     self._scalebar.height = new_height
775    
776     def get_intervals(self):
777     return self._scalebar.intervals
778    
779     def set_intervals(self, new_intervals):
780     self._scalebar.intervals = new_intervals
781    
782     def get_units(self):
783     #returns the unittype
784     return unit_type[self._scalebar.units]
785    
786     def set_units(self, units):
787     if unit_type.has_key(units):
788     self._scalebar.units = units
789     else:
790     for unit_paar_nr in unit_type:
791     if unit_type[unit_paar_nr] == units:
792     self._scalebar.units = unit_paar_nr
793    
794 jschuengel 2273 def get_status(self, mode="integer"):
795     if mode == "string":
796 jschuengel 2265 return scalebar_status_type[self._scalebar.status]
797     else:
798     return self._scalebar.status
799    
800     def set_status(self, new_status):
801     if scalebar_status_type.has_key(new_status):
802     self._scalebar.status = new_status
803     else:
804     for scalebar_status_type_nr in scalebar_status_type:
805     if scalebar_status_type[scalebar_status_type_nr] == new_status:
806     self._scalebar.status = scalebar_status_type_nr
807    
808 jschuengel 2273 def get_position(self, mode="integer"):
809     if mode == "string":
810 jschuengel 2265 return scalebar_position_type[self._scalebar.position]
811     else:
812     return self._scalebar.position
813    
814     def set_position(self, new_position):
815     if scalebar_position_type.has_key(new_position):
816     self._scalebar.position = new_position
817     else:
818     for scalebar_position_type_nr in legend_position_type:
819 jschuengel 2273 if scalebar_position_type[scalebar_position_type_nr] \
820     == new_position:
821 jschuengel 2265 self._scalebar.position = scalebar_position_type_nr
822    
823 jschuengel 2273
824 jschuengel 2235 class MF_Map:
825     """
826     The following parameters and functions, which the mapscript style obj
827     contains, are used:
828    
829 jschuengel 2260 name, numlayers, extent, shapepath, imagecolor, imagetype, units, getLayer,
830     status, getProjection, getMetaData, getFirstMetaDataKey, getNextMetaDataKey,
831 jschuengel 2273 save(), setExtent(), height, width, setProjection(), setImageType(),
832 jschuengel 2235
833     The following parameters and functions are not used:
834 jschuengel 2260 maxsize, layers, symbolset, fontset, labelcache,
835     transparent, interlace, imagequality, cellsize, debug, datapattern,
836 jschuengel 2235 templatepattern, configoptions
837     zoomPoint(), zoomRectangle(), zoomScale(), getLayerOrder(), setLayerOrder(),
838 jschuengel 2252 clone(), removeLayer(), getLayerByName(), getSymbolByName(),
839 jschuengel 2273 prepareQuery(), prepareImage(), setOutputFormat(), draw(),
840 jschuengel 2235 drawQuery(), drawLegend(), drawScalebar(), embedLegend(), drawLabelCache(),
841 jschuengel 2273 nextLabel(), queryByPoint(), queryByRecht(), queryByFeatures(),
842     queryByShape(), setWKTProjection(), saveQuery(), saveQueryASGML(),
843     setMetaData(), removeMetaData(), setSymbolSet(), getNumSymbols(),
844     setFontSet(), saveMapContext(), loadMapContext(), moveLayerUp(),
845     moveLayerDown(), getLayersDrawingOrder(), setLayersDrawingOrder(),
846     setConfigOption(), getConfigOption(), applyConfigOptions(), applySLD(),
847     applySLDURL(), gernerateSLD(), procecssTemplate(), processLegemdTemplate(), processQueryTemplate(),
848 jschuengel 2235 getOutputFormatByName(), appendOutputFormat(), removeOutputFormat(),
849     """
850     def __init__(self, mf_map):
851     """
852 jschuengel 2252 Create the map object from the mapfile mapobject which is given.
853 jschuengel 2235
854     All layers in the mapfile will be written to an array.
855     """
856     self._mf_map = mf_map
857     self._extent = MF_Rectangle(self._mf_map.extent)
858     self._imagecolor = MF_Color(self._mf_map.imagecolor)
859 jschuengel 2260 self._web = MF_Web(self._mf_map.web)
860     self._legend = MF_Legend(self._mf_map.legend)
861 jschuengel 2265 self._scalebar = MF_Scalebar(self._mf_map.scalebar)
862 jschuengel 2273
863     # TODO: generate the list dynamical by alle supported formats.
864     # At the moment outputformat only get by name, but in a next
865     # version there may be a function to get the outputformat by id
866     # then there is no need to define the formattypes here
867     image_types = ['gif', 'png', 'png24', 'jpeg', 'wbmp', \
868     'swf', 'pdf', 'imagemap']
869     self._alloutputformats = []
870     self._imagetype = self._mf_map.imagetype
871     # create a temp imagtype, because the function getOutputFormatByName()
872     # set the imagetype to the received OutputFormat
873     for fmtname in image_types:
874     theformat = self._mf_map.getOutputFormatByName(fmtname)
875     if theformat:
876     self._alloutputformats.append(MF_Outputformat(theformat))
877     self._mf_map.setImageType(self._imagetype)
878    
879 jschuengel 2270 self._outputformat = MF_Outputformat(self._mf_map.outputformat)
880 jschuengel 2273
881 jschuengel 2265 # symbols
882     self._symbolset = MF_SymbolSet(self._mf_map.symbolset)
883 jschuengel 2235
884     # if the map name is not set it will return a MS string.
885     if self._mf_map.name != "MS":
886     self._name = self._mf_map.name
887     else:
888     self._name = None
889    
890     self._projection = MF_Projection(self._mf_map.getProjection())
891    
892     # Initial Layer List
893     self._layers = []
894     self._i = 0
895 jschuengel 2316 while self._i < self._mf_map.numlayers:
896 jschuengel 2235 self._layers.append(MF_Layer(self._mf_map.getLayer(self._i)))
897     self._i += 1
898    
899     # Shapepath if not set, shapepath will be empty
900     if self._mf_map.shapepath:
901     self._shapepath = self._mf_map.shapepath
902     else:
903     self._shapepath = ""
904    
905     # Create Metadata
906 jschuengel 2301 self._metadata = MF_Metadata(self._mf_map)
907 jschuengel 2252
908 jschuengel 2326 def create_new_layer(self):
909     """
910     the new layer must create inside the mapobj, because mapscript
911     need the mapscript object as parameter for layerObj
912     """
913     new_layer = MF_Layer(layerObj(self._mf_map))
914     self._layers.append(new_layer)
915     # the new created layer must remove from the mapobject
916     # because all layer will create new in export.
917     #self._mf_map.removeLayer(self._mf_map.numlayers-1)
918     return new_layer
919    
920 jschuengel 2287 def get_mappath(self):
921     return self._mf_map.mappath
922    
923 jschuengel 2301 def set_mappath(self, new_mappath):
924     self._mf_map.mappath = new_mappath
925 jschuengel 2287
926 jschuengel 2270 def get_outputformat(self):
927     return self._outputformat
928    
929 jschuengel 2273 def get_alloutputformats(self):
930     return self._alloutputformats
931    
932 jschuengel 2270 def get_imagetype(self):
933     return self._mf_map.imagetype
934    
935     def set_imagetype(self, new_imagetype):
936     self._mf_map.setImageType(new_imagetype)
937    
938 jschuengel 2265 def get_symbolset(self):
939     return self._symbolset
940    
941 jschuengel 2260 def get_status(self):
942 jschuengel 2270 if self._mf_map.status == 1:
943     return True
944 jschuengel 2260 else:
945 jschuengel 2270 return False
946    
947     def set_status(self, new_status):
948     if new_status:
949     self._mf_map.status = 1
950     else:
951     self._mf_map.status = 0
952 jschuengel 2260
953 jschuengel 2265 def get_scalebar(self):
954     return self._scalebar
955    
956 jschuengel 2260 def get_web(self):
957     return self._web
958    
959     def get_legend(self):
960     return self._legend
961    
962 jschuengel 2235 def get_extent(self):
963     return self._extent
964    
965     def get_layers(self):
966     return self._layers
967    
968 jschuengel 2316 def get_numlayers(self):
969     return self._mf_map.numlayers
970    
971 jschuengel 2235 def get_projection(self):
972     return self._projection
973    
974     def get_name(self):
975     return self._name
976    
977     def get_shapepath(self):
978 jschuengel 2301 # where are the shape files located.
979 jschuengel 2273 return self._shapepath
980 jschuengel 2235
981 jschuengel 2301 def set_shapepath(self, new_shapepath):
982     # where are the shape files located..
983     self._shapepath = new_shapepath
984    
985 jschuengel 2235 def get_imagetype(self):
986 jschuengel 2270 return self._mf_map.imagetype
987 jschuengel 2316
988 jschuengel 2235 def get_layerorder(self):
989     # shows the order of layer as list
990 jschuengel 2316 return self._mf_map.getLayerOrder()
991 jschuengel 2252
992 jschuengel 2326 def set_layerorder(self, new_order):
993     self._mf_map.setLayerOrder(new_order)
994    
995 jschuengel 2260 def get_size(self):
996     #returns the size
997     return (self._mf_map.width, self._mf_map.height)
998    
999     def get_units(self):
1000     #returns the unittype
1001     return unit_type[self._mf_map.units]
1002    
1003     def get_imagecolor(self):
1004     return self._imagecolor
1005    
1006 jschuengel 2252 def set_name(self, newname):
1007     # whitespace musst be replaced, either no
1008     # mapfile will be shown in the mapserver
1009 jschuengel 2273 if newname:
1010     newname = newname.replace(" ","_")
1011 jschuengel 2252 self._name = newname
1012     self._mf_map.name = newname
1013    
1014     def set_extent(self, newextent):
1015     # TODO: add the shown extend here instead of the total
1016 jschuengel 2284 # if no size is set or if it is zero, the size will set to 1.
1017     if self.get_size()[0] == - 1:
1018     print "define the size first to set extent"
1019     print "size is now set to (1,1)"
1020     self.set_size(1,1)
1021 jschuengel 2287 # if an empty map is export newextent will be none
1022     if newextent:
1023     self._newrect = MF_Rectangle(rectObj(newextent[0],newextent[1], \
1024     newextent[2],newextent[3]))
1025     self._mf_map.setExtent(newextent[0],newextent[1], \
1026     newextent[2],newextent[3])
1027 jschuengel 2252
1028     def set_size(self, newwidth, newheight):
1029     self._mf_map.width = newwidth
1030     self._mf_map.height = newheight
1031    
1032     def set_projection(self, projection):
1033     self._mfnewprojstring = ""
1034     self._newparams = projection.GetAllParameters()
1035     for field in self._newparams:
1036     self._mfnewprojstring = self._mfnewprojstring+ "," + field
1037     self._mf_map.setProjection(self._mfnewprojstring[1:])
1038     self._projection.set_projection(projection)
1039 jschuengel 2260
1040     def set_units(self, units):
1041     if unit_type.has_key(units):
1042     self._mf_map.units = units
1043     else:
1044     for unit_paar_nr in unit_type:
1045     if unit_type[unit_paar_nr] == units:
1046     self._mf_map.units = unit_paar_nr
1047 jschuengel 2273
1048     def get_metadata(self):
1049     return self._metadata
1050    
1051 jschuengel 2252 def add_thubanlayer(self, tb_layer):
1052 jschuengel 2260 """
1053     Add a thuban layer
1054     """
1055 jschuengel 2326 # this import statement placed here, because if it is placed at the
1056     # beginning of this file, it produced the following error:
1057     # NameError: global name 'AnnotationLayer' is not defined
1058     # don't know why this error is produced and why it works
1059     # if it is placed here instead of the beginning.
1060     from Extensions.umn_mapserver.mf_import import AnnotationLayer
1061 elachuni 2857 from Thuban.Model.postgisdb import PostGISShapeStore
1062 jschuengel 2326 if hasattr(tb_layer,"extension_umn_layerobj"):
1063     #print tb_layer.extension_umn_layerobj
1064     #new_layer = MF_Layer(layerObj(self._mf_map))
1065     new_layer = tb_layer.extension_umn_layerobj
1066     else:
1067     new_layer = MF_Layer(layerObj(self._mf_map))
1068     self._layers.append(new_layer)
1069     tb_layer.extension_umn_layerobj = new_layer
1070     new_layer.remove_allclasses()
1071     # init a list to set the layerorder
1072     new_layer.get_index()
1073 jschuengel 2301 new_layer.set_name(tb_layer.Title())
1074 jschuengel 2252 # TODO: implement relative pathnames
1075 jschuengel 2301 # yet only absolute pathnames in the LayerObj are set
1076 jschuengel 2316 if isinstance(tb_layer, RasterLayer ):
1077 jschuengel 2260 new_layer.set_data(tb_layer.GetImageFilename(), type="raster")
1078     new_layer.set_type("raster")
1079 jschuengel 2265 new_layer.set_status(tb_layer.Visible())
1080 jschuengel 2316 elif isinstance(tb_layer, AnnotationLayer):
1081     new_layer.set_type("annotation")
1082     new_layer.set_status(tb_layer.Visible())
1083 jschuengel 2326 new_layer.set_data(tb_layer.ShapeStore().FileName())
1084 jschuengel 2260 else:
1085 elachuni 2857 if isinstance (tb_layer.ShapeStore(), PostGISShapeStore):
1086     data = "%s from %s" % (tb_layer.ShapeStore().geometry_column,
1087     tb_layer.ShapeStore().tablename)
1088     new_layer.set_data (data, type="postgis")
1089     params = []
1090     for name in ("host", "port", "dbname", "user", "password"):
1091     val = getattr(tb_layer.ShapeStore().db, name)
1092     if val:
1093     params.append("%s=%s" % (name, val))
1094     new_layer.set_connection (" ".join(params))
1095     new_layer.set_connectiontype (mapscript.MS_POSTGIS)
1096     else:
1097     new_layer.set_data(tb_layer.ShapeStore().FileName())
1098 jschuengel 2260 new_layer.set_status(tb_layer.Visible())
1099     new_layer.set_type(tb_layer.ShapeType())
1100     if tb_layer.GetClassificationColumn():
1101     new_layer.set_classitem(tb_layer.GetClassificationColumn())
1102     if tb_layer.GetProjection():
1103     new_layer.set_projection(tb_layer.GetProjection())
1104     if tb_layer.GetClassification().GetNumGroups() > 0:
1105 jschuengel 2284 singletonexists = False
1106 jschuengel 2273 for group in range(0, \
1107     tb_layer.GetClassification().GetNumGroups(), 1):
1108 jschuengel 2284 if isinstance(tb_layer.GetClassification().GetGroup(group), \
1109     ClassGroupSingleton):
1110     singletonexists = True
1111 jschuengel 2273 new_layer.add_thubanclass( \
1112     tb_layer.GetClassification().GetGroup(group))
1113     new_layer.add_thubanclass( \
1114     tb_layer.GetClassification().GetDefaultGroup())
1115 jschuengel 2284 # remove the classitem if one singleton exists
1116     if singletonexists == False:
1117     new_layer.set_classitem(None)
1118 jschuengel 2260 else:
1119 jschuengel 2273 new_layer.add_thubanclass( \
1120     tb_layer.GetClassification().GetDefaultGroup(), \
1121     type="default")
1122 jschuengel 2252 # set the projection to the layer.
1123 jschuengel 2326 # if the layer has its own definition use it,
1124 jschuengel 2301 # else use the main projection
1125 jschuengel 2252 if tb_layer.GetProjection():
1126     new_layer.set_projection(tb_layer.GetProjection())
1127     else:
1128     new_layer.set_projection(self._projection.get_projection())
1129    
1130 jschuengel 2326 def remove_layer(self, delnr):
1131     if delnr < len(self._layers):
1132     # if a layer is removed, the links for the mapscript layer and
1133     # the metadata must set new
1134     # TODO: All other object in a layer obj must set a new, e.g proj.
1135     for ll in range(len(self._layers)-1, delnr, -1):
1136     self._layers[ll]._mf_layer = self._layers[ll-1]._mf_layer
1137     self._layers[ll].set_metadata(self._layers[ll-1].get_metadata())
1138    
1139     self._mf_map.removeLayer(delnr)
1140     self._layers.pop(delnr)
1141 jschuengel 2260
1142 jschuengel 2252 def save_map(self, filepath):
1143     # save the Map
1144     # maybe an own saver can implement here
1145     self._mf_map.save(filepath)
1146 jschuengel 2260
1147    
1148     class MF_Web:
1149     """
1150     Save the Web settings
1151    
1152     The following parametes are used:
1153 jschuengel 2273 imagepath, imageurl, queryformat,
1154 jschuengel 2260
1155     The following parameters are not used:
1156 jschuengel 2273 log, map, template, header, footer, empty, error, extent,
1157 jschuengel 2260 minscale, maxscale, mintemplate, maxtemplate
1158     """
1159     def __init__(self, mf_web):
1160     self._mf_web = mf_web
1161    
1162     def get_imagepath(self):
1163     return self._mf_web.imagepath
1164    
1165     def set_imagepath(self, new_imagepath):
1166     self._mf_web.imagepath = new_imagepath
1167    
1168     def get_imageurl(self):
1169     return self._mf_web.imageurl
1170 jschuengel 2284
1171     def get_template(self):
1172     return self._mf_web.template
1173    
1174     def set_template(self, new_template):
1175     self._mf_web.template = new_template
1176 jschuengel 2260
1177     def set_imageurl(self, new_imageurl):
1178 jschuengel 2273 self._mf_web.imageurl = new_imageurl
1179 jschuengel 2260
1180     def get_queryformat(self):
1181     return self._mf_web.queryformat
1182    
1183     def set_queryformat(self, new_queryformat):
1184     self._mf_web.imagepath = new_queryformat
1185    
1186    
1187     class MF_Label:
1188     """
1189     The following parameters from mapscript are used:
1190 jschuengel 2273 type, color, size, offsetx, offsety, partials, force, buffer,
1191     minfeaturesize, mindistance,
1192 jschuengel 2260
1193     The following parameters are not used:
1194 jschuengel 2273 font, outlinecolor, shadowcolor, shadowsizex, shadowsizey,
1195 jschuengel 2260 backgroundcolor, backgroundshadowcolor, backgroundshadowsizex,
1196     backgroundshadowsizey, sizescaled, minsize, maxsize, position, angle,
1197 jschuengel 2273 autoangle, antialias, wrap, autominfeaturesize,
1198 jschuengel 2260 """
1199     def __init__(self, mf_label):
1200     """
1201     Create a legend obj from the existing mapfile
1202     """
1203     self._label = mf_label
1204     self._color = MF_Color(self._label.color)
1205    
1206     def get_size(self):
1207     return self._label.size
1208    
1209     def set_size(self, new_size):
1210     if label_size_type.has_key(new_size):
1211     self._label.size = new_size
1212     for label_size_type_nr in label_size_type:
1213     if label_size_type[label_size_type_nr] == new_size:
1214     self._label.size = label_size_type_nr
1215     else:
1216     self._label.size = new_size
1217    
1218     def get_color(self):
1219     return self._color
1220    
1221 jschuengel 2265 def get_partials(self):
1222     if self._label.partials == 1:
1223     return True
1224     else:
1225     return False
1226    
1227     def set_partials(self, new_partials):
1228     # if partials = True
1229     if new_partials:
1230     self._label.partials = 1
1231     elif new_partials == False:
1232     self._label.partials = 0
1233     else:
1234 jschuengel 2273 print "must be boolean"
1235 jschuengel 2265
1236 jschuengel 2270 def get_buffer(self):
1237     return self._label.buffer
1238    
1239     def set_buffer(self, new_buffer):
1240     self._label.buffer = new_buffer
1241    
1242     def get_mindistance(self):
1243     return self._label.mindistance
1244    
1245     def set_mindistance(self, new_mindistance):
1246     self._label.mindistance = new_mindistance
1247    
1248     def get_minfeaturesize(self):
1249     return self._label.minfeaturesize
1250    
1251     def set_minfeaturesize(self, new_minfeaturesize):
1252     self._label.minfeaturesize = new_minfeaturesize
1253    
1254 jschuengel 2273 def get_position(self, mode="integer"):
1255     if mode == "string":
1256 jschuengel 2270 return label_position_type[self._label.position]
1257     else:
1258     return self._label.position
1259    
1260     def set_position(self, new_position):
1261     if label_position_type.has_key(new_position):
1262     self._label.position = new_position
1263     else:
1264     for label_position_type_nr in label_position_type:
1265     if label_position_type[label_position_type_nr] == new_position:
1266     self._label.position = label_position_type_nr
1267    
1268     def get_force(self):
1269     if self._label.force == 1:
1270     return True
1271     else:
1272     return False
1273    
1274     def set_force(self, new_force):
1275     if new_force:
1276     self._label.force = 1
1277     else:
1278     self._label.force = 0
1279    
1280 jschuengel 2260 def get_type(self):
1281     return label_font_type[self._label.type]
1282    
1283     def set_type(self, new_type):
1284     if label_font_type.has_key(new_type):
1285     self._label.type = new_type
1286     else:
1287     for label_font_type_nr in label_font_type:
1288     if label_font_type[label_font_type_nr] == new_type:
1289     self._label.type = label_font_type_nr
1290    
1291     def get_offset(self):
1292     return (self._label.offsetx, self._label.offsety)
1293    
1294     def set_offset(self, new_offsetx, new_offsety):
1295     self._label.offsetx = new_offsetx
1296     self._label.offsety = new_offsety
1297    
1298    
1299     class MF_Legend:
1300     """
1301     The following parameters are (not) used:
1302     imagecolor, label, keysizex, keysizey, status, position,
1303    
1304     The following parameters are not used:
1305     keyspacingx, keyspacingy,
1306     outlinecolor, height, width, postlabelcache, template, map
1307     """
1308     def __init__(self, mf_legend):
1309     """
1310     Create a legend obj from the existing mapfile
1311     """
1312     self._mf_legend = mf_legend
1313     self._imagecolor = MF_Color(self._mf_legend.imagecolor)
1314     self._label = MF_Label(self._mf_legend.label)
1315 jschuengel 2252
1316 jschuengel 2260 def get_imagecolor(self):
1317     return self._imagecolor
1318    
1319     def get_label(self):
1320     return self._label
1321    
1322     def get_keysize(self):
1323     return (self._mf_legend.keysizex, self._mf_legend.keysizey)
1324    
1325     def set_keysize(self, new_keysizex, new_keysizey):
1326     self._mf_legend.keysizex = new_keysizex
1327     self._mf_legend.keysizey = new_keysizey
1328    
1329     def get_keyspacing(self):
1330     return (self._mf_legend.keyspacingx, self._mf_legend.keyspacingy)
1331    
1332     def set_keyspacing(self, new_keyspacingx, new_keyspacingy):
1333     self._mf_legend.keyspacingx = new_keyspacingx
1334     self._mf_legend.keyspacingy = new_keyspacingy
1335    
1336 jschuengel 2273 def get_status(self, mode="integer"):
1337     if mode == "string":
1338 jschuengel 2260 return legend_status_type[self._mf_legend.status]
1339     else:
1340     return self._mf_legend.status
1341    
1342     def set_status(self, new_status):
1343     if legend_status_type.has_key(new_status):
1344     self._mf_legend.status = new_status
1345     else:
1346     for legend_status_type_nr in legend_status_type:
1347     if legend_status_type[legend_status_type_nr] == new_status:
1348     self._mf_legend.status = legend_status_type_nr
1349    
1350 jschuengel 2273 def get_position(self, mode="integer"):
1351     if mode == "string":
1352 jschuengel 2260 return legend_position_type[self._mf_legend.position]
1353     else:
1354     return self._mf_legend.position
1355    
1356     def set_position(self, new_position):
1357     if legend_position_type.has_key(new_position):
1358     self._mf_legend.position = new_position
1359     else:
1360     for legend_position_type_nr in legend_position_type:
1361 jschuengel 2273 if legend_position_type[legend_position_type_nr]== new_position:
1362 jschuengel 2260 self._mf_legend.position = legend_position_type_nr
1363    
1364 jschuengel 2235 class MF_Projection:
1365     """
1366     The following parameter, which the mapscript style obj contains is used:
1367    
1368     numargs
1369     """
1370    
1371     def __init__(self, mf_projection):
1372     """
1373     Create a projection object from the given mapscript projection
1374 jschuengel 2260 object. If it is a epsg code the extracted from the string
1375     (e.g."init=epsg:xxxx"), else the projection parameters will
1376     be splitted and an array with the parameters will be creaded.
1377     """
1378 jschuengel 2235 self._mfprojstring = mf_projection
1379 jschuengel 2252 self._projstring = self._mfprojstring
1380 jschuengel 2235 self._epsgcode = None
1381     self._params = None
1382     if self._mfprojstring:
1383     if self._mfprojstring.find("init=epsg:") != -1:
1384     self._initcode, self._epsgcode = self._mfprojstring.split(':')
1385     else:
1386     self._params = []
1387 elachuni 2856 self._params = [p.strip() for p in self._mfprojstring.split("+")]
1388 jschuengel 2235 if self._params[0] == "":
1389     self._params.remove("")
1390    
1391     def epsg_code_to_projection(self, epsg):
1392     """
1393     Find the projection for the given epsg code.
1394    
1395     Copied from Extension/wms/layer.py
1396    
1397     epsg -- EPSG code as string
1398     """
1399     #Needed only for this function
1400 jschuengel 2273 from Thuban.Model.resource import get_system_proj_file, EPSG_PROJ_FILE,\
1401 jschuengel 2235 EPSG_DEPRECATED_PROJ_FILE
1402    
1403     proj_file, warnings = get_system_proj_file(EPSG_PROJ_FILE)
1404    
1405     for proj in proj_file.GetProjections():
1406     if proj.EPSGCode() == epsg:
1407     return proj
1408    
1409     proj_file, warnings = get_system_proj_file(EPSG_DEPRECATED_PROJ_FILE)
1410     for proj in proj_file.GetProjections():
1411     if proj.EPSGCode() == epsg:
1412     return proj
1413     return None
1414    
1415     def get_params(self):
1416     #Parameter from the mf_projectionstring as Array
1417     return self._params
1418    
1419     def get_epsgcode(self):
1420     # returnes the epsg number
1421     return self._epsgcode
1422    
1423     def get_epsgproj(self):
1424     # get an epsg projectionobject
1425     return self.epsg_code_to_projection(self._epsgcode)
1426 jschuengel 2252
1427     def get_projection(self):
1428     return self._projstring
1429    
1430     def set_projection(self, newprojection):
1431     self._projstring = newprojection
1432     self._params = newprojection.GetAllParameters()
1433     self._mfnewprojstring = ""
1434     for field in self._params:
1435     self._mfnewprojstring = self._mfnewprojstring+ "+" + field
1436     self._mfprojstring = self._mfnewprojstring
1437 jschuengel 2235
1438 jschuengel 2260
1439 jschuengel 2235 class MF_Style:
1440     """
1441     The following parameters, which the mapscript style obj
1442     contains, are used:
1443 jschuengel 2252 color, backgroundcolor, outlinecolor, size, symbolname
1444 jschuengel 2235
1445     The following are not used:
1446 jschuengel 2252 symbol, sizescaled, minsize, maxsize, offsetx, offsety,
1447 jschuengel 2235 antialias
1448     """
1449    
1450     def __init__(self, mf_style):
1451     """
1452     Create a style object from the given mapscript style object.
1453     The color Object from the color and the outlinecolor parameter
1454     will be created. if the color (red, green or blue) is -1 there
1455     is no definition in the mapfile and so there is no color object,
1456     it will set to 'None'.
1457     """
1458     self._style = mf_style
1459     if self._style.color.red == -1:
1460 jschuengel 2260 self._color = None
1461 jschuengel 2235 else:
1462 jschuengel 2260 self._color = MF_Color(self._style.color)
1463 jschuengel 2235 if self._style.outlinecolor.red == -1:
1464     self._outlinecolor = None
1465     else:
1466     self._outlinecolor = MF_Color(self._style.outlinecolor)
1467    
1468     def get_color(self):
1469     return self._color
1470    
1471     def get_outlinecolor(self):
1472     return self._outlinecolor
1473    
1474     def get_size(self):
1475     return self._style.size
1476 jschuengel 2252
1477     def set_linecolor(self, tb_color):
1478     self._color = tb_color
1479     new_linecolor = MF_Color(colorObj())
1480     new_linecolor.set_thubancolor(tb_color)
1481     self._outlinecolor = new_linecolor
1482     self._style.outlinecolor = new_linecolor.get_mfcolor()
1483    
1484     def set_color(self, tb_color):
1485     self._color = tb_color
1486     new_color = MF_Color(colorObj())
1487     new_color.set_thubancolor(tb_color)
1488     self._color = new_color
1489     self._style.color = new_color.get_mfcolor()
1490    
1491     def set_size(self, newsize):
1492     self._style.size = newsize
1493    
1494     def set_symbolname(self, newsymbol):
1495     # its possible to use stringnames instead of numbers
1496 jschuengel 2260 self._style.symbolname = newsymbol
1497 jschuengel 2252

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26