/[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 2260 - (hide annotations)
Thu Jul 1 14:39:00 2004 UTC (20 years, 8 months ago) by jschuengel
File MIME type: text/x-python
File size: 33486 byte(s)
Added new types which are need for the editing functions.
Added needed set-functions for the editing functions.
Added the possibility to export rasterimages.
Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol, MF_SymbolSet).
MF_Symbol and MF_SymbolSet are not needed at the moment.
(MF_Class.set_thubanstyle): Now point layers will set to a default symbol
to show a circle in mapserver and not only a 1px dot.				(MF_Style.__init__): Fixed a bug with the color. Color was not set correct
before.
(MF_Size): Removed, because it is not needed.

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 2260 labelCacheMemberObj, labelCacheObj, lineObj,
17 jschuengel 2235 markerCacheMembet, msTiledSHPLayerInfo, OutputFormat, pointObj, queryMapObj,
18     referenzMapObj, resultCacheMemberObj, resultCacheObj, scalebarObj,
19 jschuengel 2260 shapefileObj, shapeObj, VectorObj, WebObj
20 jschuengel 2235 """
21    
22     __version__ = "$Revision$"
23     # $Source$
24     # $Id$
25    
26    
27     # ##################################################
28     #
29     # import necessary modules from python and/or thuban
30     #
31     # ##################################################
32    
33 jschuengel 2252 import os
34 jschuengel 2235
35 jschuengel 2252 from Thuban.Model.color import Color, Transparent
36 jschuengel 2235
37 jschuengel 2260 from mapscript import layerObj, classObj, colorObj, styleObj, rectObj
38    
39 jschuengel 2252
40 jschuengel 2235 # ###################################
41     #
42     # Definition of dictionaries
43     #
44     # ###################################
45    
46     shp_type = { 0:'point',
47     1:'line',
48     2:'polygon',
49     3:'raster',
50     4:'annotation',
51     5:'circle',
52     6:'query'}
53    
54 jschuengel 2260 unit_type = { 0:"inches",
55     1:"feet",
56     2:"miles",
57     3:"meters",
58     4:"kilometers",
59     5:"dd"}
60 jschuengel 2235
61 jschuengel 2260 legend_status_type = { 0:"OFF",
62     1:"ON",
63     3:"embed" }
64     # 2 = Default but will not be imported because
65     # mapscript dont support it and its not allowed
66 jschuengel 2235
67 jschuengel 2260 layer_status_type = { 0:"OFF",
68     1:"ON",
69     2:"default"}
70    
71     legend_position_type = { 0:"ul",
72     1:"lr",
73     2:"ur",
74     3:"ll",
75     6:"uc",
76     7:"lc"}
77    
78     label_size_type = { 0:"tiny",
79     1:"small",
80     2:"medium",
81     3:"large",
82     4:"giant" }
83    
84     label_font_type = { 0:"truetype",
85     1:"bitmap" }
86    
87    
88 jschuengel 2235 # ##################################################
89     #
90     # Class Definition
91     #
92     # ##################################################
93    
94     # ##################################################
95 jschuengel 2252 # General Classes that are not all explicitly defined through
96 jschuengel 2235 # a mapfile, but rather some helper-classes.
97    
98     class MF_Rectangle:
99     """
100     Represents an rectanle with the bottom left
101     and top right corner.
102     """
103     def __init__(self,mf_rect):
104     self._rect = mf_rect
105    
106     def get_minx(self):
107     return self._rect.minx
108    
109     def get_miny(self):
110     return self._rect.miny
111    
112     def get_maxx(self):
113     return self._rect.maxx
114    
115     def get_maxy(self):
116     return self._rect.maxy
117 jschuengel 2252
118     def get_rect(self):
119     return (self._rect.minx,self._rect.miny,self._rect.maxx,self._rect.maxy)
120 jschuengel 2235
121 jschuengel 2252 def set_rect(self, minx, miny, maxx, maxy):
122     self._rect.minx = minx
123     self._rect.miny = miny
124     self._rect.maxx = maxx
125     self._rect.maxy = maxy
126 jschuengel 2235
127     class MF_Color:
128     """
129     The corresponding MapScript object contains also the
130     attribute pen which defines the stroke of the feature.
131     But this actually has nothing to do with the color and
132     therefore is not support here.
133    
134     It needs to be discussed with the MapServer developers
135     whether pen would better be moved to another class.
136    
137     The hex color definition which is also supported by
138     mapscript and Thuban is not supported as it does
139     not add any capability.
140    
141     color is definied as RGB 0..255
142 jschuengel 2252 """
143 jschuengel 2235 def __init__(self, mf_color):
144     self._color = mf_color
145    
146     self._tbc_red = (float(self.get_red())/255)
147     self._tbc_green = (float(self.get_green())/255)
148     self._tbc_blue = (float(self.get_blue())/255)
149     self._thubancolor = Color(self._tbc_red, self._tbc_green, self._tbc_blue)
150    
151     # TODO : Check if it is necessary to use rgb colors alone
152     # or whether it is sufficient to only use the Thuban Color.
153     # In some it is necessary as red == -1 indicates that no color
154     # is set.
155     def get_red(self):
156     return self._color.red
157    
158     def get_green(self):
159     return self._color.green
160    
161     def get_blue(self):
162     return self._color.blue
163 jschuengel 2252
164 jschuengel 2260 def set_rgbcolor(self, red, green, blue):
165     self._color.red = red
166     self._color.green = green
167     self._color.blue = blue
168    
169     self._tbc_red = (float(self.get_red())/255)
170     self._tbc_green = (float(self.get_green())/255)
171     self._tbc_blue = (float(self.get_blue())/255)
172     self._thubancolor = Color(self._tbc_red, self._tbc_green, self._tbc_blue)
173    
174 jschuengel 2252 def get_mfcolor(self):
175     return self._color
176 jschuengel 2235
177     def get_thubancolor(self):
178 jschuengel 2252 return self._thubancolor
179 jschuengel 2235
180     def set_thubancolor(self, thuban_color):
181 jschuengel 2252 if thuban_color != Transparent:
182     self._color.red = int(thuban_color.red * 255)
183     self._color.green = int(thuban_color.green * 255)
184     self._color.blue = int(thuban_color.blue * 255)
185     self._thubancolor = thuban_color
186 jschuengel 2235
187    
188     class MF_Metadata:
189     """
190     Metadata is not a Object in mapscript witch can be used
191     by ease. Only the infos can get with the functions
192     "getFirstMetaDataKey", "getNextMetaDataKey" and "getMetaData".
193     To get some special Metadata you need a key. So the metadata will
194     saved as an dictionary to geht the information with the key here.
195    
196     The metadata obj will be created and filled with infos like
197     the following code sample:
198    
199     self.metadata = MF_Metadata()
200     try:
201     self.metafkey = varia.getFirstMetaDataKey()
202     except:
203     self.metadata = None
204     else:
205     while self.metafkey:
206     self.metakeydata = varia.getMetaData(self.metafkey)
207     self.metadata.add_metadata(self.metafkey,self.metakeydata)
208     self.metafkey = varia.getNextMetaDataKey(self.metafkey)
209    
210     Metadata are not really needed at the moment.
211     """
212    
213     def __init__(self):
214     self.data = {}
215    
216     def get_metadata(self):
217     return self.data
218    
219     def get_metadatabykey(self, key):
220     return self.data[key]
221    
222     def add_metadata(self, key, data):
223     self.data[key] = data
224    
225     # ##################################################
226     # Classes for MapServer Objects as they are
227 jschuengel 2252 # explicitly defined in a mapfile
228 jschuengel 2235
229 jschuengel 2252 class MF_Symbol:
230     """
231     defines a single symbol which is used in the Symbolset
232    
233     name, type, sizex, sizey, points, numpoints, filled, stylelength,
234     style, imagepath, transparent, transparentcolor, character, antialias,
235     font, gap, position, linecap, linejoin, linejoinmaxsize, setPoints(),
236     getPoints(), setStyle()
237     """
238    
239     def __init__(self, mf_symbol):
240     print "nothing"
241    
242     class MF_SymbolSet:
243     """
244     defines a set of symbols, may be there can only be one
245    
246     filename, imagecachesize, numsymbols, symbol, getSymbol(),
247     getSymbolByName(), index(), appendSymbol(), removeSymbol(),
248     save()
249     """
250    
251     # TODO: include the symbolset, but found only the possibility to
252     # create an extra symbol file and not to include it direct to the
253     # mapfile itself
254     def __init__(self, mf_symbolset):
255     print "nothing"
256    
257    
258 jschuengel 2235 class MF_Class:
259     """
260     The following parameters and functions, which the mapscript style obj
261     contains, are used:
262     styles, numstyles, name,
263 jschuengel 2252 getExpressionString(), setExpression(), getMetaData(), getFirstMetaDataKey(),
264 jschuengel 2235 getNextMetaDataKey(), getStyle()
265    
266     The following parameters and functions are not used:
267     status, label, title, template, type, minscale, maxscale, layer,
268     debig, keyimage,
269     setExpression(), setText(), setMetaData(), drawLegendIcon(),
270     createLegendIcon(), insertStyle(), removeStyle(), moveStyleUp(),
271     moveStyleDown()
272     """
273     def __init__(self, mf_class):
274     """
275     Initialized a class from them given mapscript Class Object
276     with a list of the included styles.
277     Metadata Object will be created from the Metadata informations
278     wich are holt as a List i think.
279     """
280     self._clazz = mf_class
281     self._styles = []
282     self._numstyles = mf_class.numstyles
283     for i in range(0,self._numstyles,1):
284     self._styles.append(MF_Style(mf_class.getStyle(i)))
285    
286     if self._clazz.getExpressionString() == '"(null)"':
287     self._expression = None
288     else:
289     self._expression = self._clazz.getExpressionString()
290    
291     self.metadata = MF_Metadata()
292     try:
293     self.metafkey = mf_class.getFirstMetaDataKey()
294     except:
295     self.metadata = None
296     else:
297     while self.metafkey:
298     self.metakeydata = mf_class.getMetaData(self.metafkey)
299     self.metadata.add_metadata(self.metafkey,self.metakeydata)
300     self.metafkey = mf_class.getNextMetaDataKey(self.metafkey)
301    
302     def get_styles(self):
303     return self._styles
304    
305     def get_name(self):
306     return self._clazz.name
307    
308     def get_keyimage(self):
309     return self._clazz.keyimage
310    
311     def get_expressionstring(self):
312     return self._expression
313 jschuengel 2252
314     def set_name(self, newname):
315     self._clazz.name = newname
316    
317     def set_expressionstring(self, newstring):
318     self._clazz.setExpression(newstring)
319     self._expression = self._clazz.getExpressionString()
320    
321     def add_thubanstyle(self, tb_style, type="default"):
322 jschuengel 2260 """
323     added a thuban style object to the mapobject
324     """
325 jschuengel 2252 new_styleobj = MF_Style(styleObj(self._clazz))
326     if type == "line":
327     new_styleobj.set_color(tb_style.GetLineColor())
328 jschuengel 2260 elif type == "point":
329 jschuengel 2252 # set a default symbol to show circles not only a small dot
330     # symbol "circle" must create before
331     # TODO: create a Symbol (more see MF_SymbolSet)
332 jschuengel 2260 # first the default symbol circle will be created and the size 8
333     new_styleobj.set_symbolname('circle')
334     new_styleobj.set_size(8)
335     if tb_style.GetLineColor() != Transparent:
336     new_styleobj.set_linecolor(tb_style.GetLineColor())
337     new_styleobj.set_color(tb_style.GetFill())
338 jschuengel 2252 else:
339     new_styleobj.set_size(tb_style.GetLineWidth())
340     new_styleobj.set_linecolor(tb_style.GetLineColor())
341     new_styleobj.set_color(tb_style.GetFill())
342 jschuengel 2235
343    
344     class MF_Layer:
345     """
346     The following parameters and functions, which the mapscript style obj
347     contains, are used:
348    
349     classitem, numclasses, name, data, type
350     getClass(), getProjection(), getExtent(), getMetaData(),
351 jschuengel 2252 getFirstMetaDataKey(), getNextMetaDataKey(), status,
352 jschuengel 2235
353    
354     The following paramters and functions are not used:
355 jschuengel 2252 index, map, header, footer, template, groupe, tolerance,
356 jschuengel 2235 toleranceunits, symbolscale, minscale, maxscale, labelminscale
357     labelmaxscale, sizeunits, maxfeatures, offsite, transform, labelcache
358     postlabelcache, labelitem, labelsizeitem, labelangleitem, labelitemindex
359     labelsizeitemindex, labelangleitemindex, tileitem, tileindex, units
360     connection, connectiontype, numitems, filteritem, styleitem, requires
361     labelrequires, transparency, dump, debug, numprocessing, numjoins,
362     removeClass(), open(), close(), getShape(), getNumResults(), getResult()
363     getItem(), promote(), demote(), draw(), drawQuery(), queryByAttributes()
364     queryByPoint(), queryByRect(), queryByFeatures(), queryByShape(),
365     setFilter(), setFilterString(), setWKTProjection(), setProjection()
366     addFeature(), getNumFeatures(), setMetaData(), removeMetaData(),
367     getWMSFeatureInfoURL(), executeWFSGetFeature(), applySLD(), applySLDURL()
368     enerateSLD(), moveClassUp(), moveClassDown(), setProcessing(),
369     getProcessing(), clearProcessing()
370     """
371    
372     def __init__(self, mf_layer):
373     """
374     Creates the Layer Object from the mapscript Layer Object.
375     the class objects in the layer object will be stored in
376     an array. The metadata are created as a new object.
377     """
378    
379     self._mf_layer = mf_layer
380    
381     # Create Classes
382     # there could be more then 1
383     self._numclasses = mf_layer.numclasses
384     i = -1
385     self._classes = []
386     while i < self._numclasses-1:
387     i += 1
388     self._classes.append(MF_Class(self._mf_layer.getClass(i)))
389    
390     self._projection = MF_Projection(self._mf_layer.getProjection())
391    
392     # Variable extent will not used for RasterLayer
393     # this variable is not necessary, because it comes directly
394     # from the shp file
395     try:
396     self._extent = MF_Rectangle(self._mf_layer.getExtent())
397     except:
398     self._extent = None
399    
400     # Create Metadata
401     self._metadata = MF_Metadata()
402     try:
403     self._metafkey = self._mf_layer.getFirstMetaDataKey()
404     except:
405     self._metadata = None
406     else:
407     while self._metafkey:
408     self._metakeydata = self._mf_layer.getMetaData(self._metafkey)
409     self._metadata.add_metadata(self._metafkey,self._metakeydata)
410     self._metafkey = self._mf_layer.getNextMetaDataKey(self._metafkey)
411    
412     def get_name(self):
413     return self._mf_layer.name
414    
415     def get_data(self):
416     return self._mf_layer.data
417    
418     def get_classes(self):
419     return self._classes
420    
421     def get_type(self):
422     return shp_type[self._mf_layer.type]
423    
424     def get_classitem(self):
425     return self._mf_layer.classitem
426    
427     def get_projection(self):
428     return self._projection
429 jschuengel 2252
430     def get_status(self):
431     # returns a integer value
432     # 0 = off, 1 = on, 2 = default(always on)
433     if self._mf_layer.status == 0:
434     return False
435     else:
436     return True
437     #return self._mf_layer.status
438    
439     def set_name(self, newname):
440     self._mf_layer.name = newname
441    
442 jschuengel 2260 def set_data(self, newdata, type="shape"):
443     if type == "raster":
444     self._mf_layer.data = newdata
445     else:
446     self._mf_layer.data = newdata[:-4]
447    
448 jschuengel 2252
449     def set_status(self, newstatus):
450     # status can set to true or false from thuban.
451     # but mapserver supports the default value
452     self._mf_layer.status = newstatus
453    
454     def set_classitem(self, tb_field):
455     self._mf_layer.classitem = tb_field
456    
457     def set_type(self, tb_type):
458     # if type = arc its a in shapetype line
459     if tb_type == "arc":
460     self._mf_layer.type = 1
461 jschuengel 2260 if tb_type == "raster":
462     self._mf_layer.type = 3
463 jschuengel 2252 if shp_type.has_key(tb_type):
464     self._mf_layer.type = tb_type
465     else:
466     for shp_paar_nr in shp_type:
467     if shp_type[shp_paar_nr] == tb_type:
468     self._mf_layer.type = shp_paar_nr
469     return
470    
471     def set_projection(self, newprojection):
472     self._mfnewprojstring = ""
473     if newprojection:
474     self._newparams = newprojection.GetAllParameters()
475     for field in self._newparams:
476     self._mfnewprojstring = self._mfnewprojstring+ "," + field
477     self._mf_layer.setProjection(self._mfnewprojstring[1:])
478     self._projection.set_projection(newprojection)
479    
480 jschuengel 2260 def add_thubanclass(self, tb_class, type=""):
481     """
482     Add a thuban class object
483     """
484 jschuengel 2252 new_class = MF_Class(classObj(self._mf_layer))
485     new_class.set_name(tb_class.GetLabel())
486     if self.get_type() == "line":
487     new_class.add_thubanstyle(tb_class.GetProperties(), type="line")
488 jschuengel 2260 elif self.get_type() == "point":
489     new_class.add_thubanstyle(tb_class.GetProperties(), type="point")
490 jschuengel 2252 else:
491     new_class.add_thubanstyle(tb_class.GetProperties())
492 jschuengel 2260 if (type == "default"):
493 jschuengel 2252 return
494 jschuengel 2260 elif (tb_class.Matches("DEFAULT")):
495     new_class.set_expressionstring('/./')
496 jschuengel 2252 else:
497 jschuengel 2260 new_class.set_expressionstring(str(tb_class.GetValue()))
498 jschuengel 2252 self._classes.append(new_class)
499 jschuengel 2235
500 jschuengel 2260
501 jschuengel 2235 class MF_Map:
502     """
503     The following parameters and functions, which the mapscript style obj
504     contains, are used:
505    
506 jschuengel 2260 name, numlayers, extent, shapepath, imagecolor, imagetype, units, getLayer,
507     status, getProjection, getMetaData, getFirstMetaDataKey, getNextMetaDataKey,
508 jschuengel 2252 save(), setExtent(), height, width, setProjection()
509 jschuengel 2235
510    
511     The following parameters and functions are not used:
512 jschuengel 2260 maxsize, layers, symbolset, fontset, labelcache,
513     transparent, interlace, imagequality, cellsize, debug, datapattern,
514 jschuengel 2235 templatepattern, configoptions
515     zoomPoint(), zoomRectangle(), zoomScale(), getLayerOrder(), setLayerOrder(),
516 jschuengel 2252 clone(), removeLayer(), getLayerByName(), getSymbolByName(),
517 jschuengel 2235 prepareQuery(), prepareImage(), setImageType(), setOutputFormat(), draw(),
518     drawQuery(), drawLegend(), drawScalebar(), embedLegend(), drawLabelCache(),
519     nextLabel(), queryByPoint(), queryByRecht(), queryByFeatures(), queryByShape(),
520 jschuengel 2252 setWKTProjection(), saveQuery(), saveQueryASGML(),
521 jschuengel 2235 setMetaData(), removeMetaData(), setSymbolSet(), getNumSymbols(), setFontSet(),
522     saveMapContext(), loadMapContext(), moveLayerUp(), moveLayerDown(),
523     getLayersDrawingOrder(), setLayersDrawingOrder(), setConfigOption(),
524     getConfigOption(), applyConfigOptions(), applySLD(), applySLDURL(), gernerateSLD(),
525     procecssTemplate(), processLegemdTemplate(), processQueryTemplate(),
526     getOutputFormatByName(), appendOutputFormat(), removeOutputFormat(),
527     """
528    
529     def __init__(self, mf_map):
530     """
531 jschuengel 2252 Create the map object from the mapfile mapobject which is given.
532 jschuengel 2235
533     All layers in the mapfile will be written to an array.
534     """
535    
536     self._mf_map = mf_map
537     self._extent = MF_Rectangle(self._mf_map.extent)
538     self._imagecolor = MF_Color(self._mf_map.imagecolor)
539 jschuengel 2260 self._web = MF_Web(self._mf_map.web)
540     self._legend = MF_Legend(self._mf_map.legend)
541 jschuengel 2235
542     # if the map name is not set it will return a MS string.
543     if self._mf_map.name != "MS":
544     self._name = self._mf_map.name
545     else:
546     self._name = None
547    
548     self._projection = MF_Projection(self._mf_map.getProjection())
549    
550     # Initial Layer List
551     self._layers = []
552     self._numlayers = self._mf_map.numlayers
553     self._i = 0
554     while self._i < self._numlayers:
555     self._layers.append(MF_Layer(self._mf_map.getLayer(self._i)))
556     self._i += 1
557    
558     # Shapepath if not set, shapepath will be empty
559     if self._mf_map.shapepath:
560     self._shapepath = self._mf_map.shapepath
561     else:
562     self._shapepath = ""
563    
564     # Create Metadata
565     self._metadata = MF_Metadata()
566     try:
567     self._metafkey = self._mf_map.getFirstMetaDataKey()
568     except:
569     self._metadata = None
570     else:
571     while self._metafkey:
572     self._metakeydata = self._mf_map.getMetaData(self._metafkey)
573     self._metadata.add_metadata(self._metafkey,self._metakeydata)
574     self._metafkey = self._mf_map.getNextMetaDataKey(self._metafkey)
575 jschuengel 2252
576 jschuengel 2260 def get_status(self):
577     if layer_status_type[self._mf_map.status] == "OFF":
578     return false
579     else:
580     return true
581    
582     def get_web(self):
583     return self._web
584    
585     def get_legend(self):
586     return self._legend
587    
588 jschuengel 2235 def get_extent(self):
589     return self._extent
590    
591     def get_layers(self):
592     return self._layers
593    
594     def get_projection(self):
595     return self._projection
596    
597     def get_name(self):
598     return self._name
599    
600     def get_shapepath(self):
601     return self._shapepath # where are the shape files located..
602    
603     def get_imagetype(self):
604     return self._imagetype
605 jschuengel 2252
606 jschuengel 2235 def get_layerorder(self):
607     # shows the order of layer as list
608 jschuengel 2260 return self._mf_map.getLayerOrder()
609 jschuengel 2252
610 jschuengel 2260 def get_size(self):
611     #returns the size
612     return (self._mf_map.width, self._mf_map.height)
613    
614     def get_units(self):
615     #returns the unittype
616     return unit_type[self._mf_map.units]
617    
618     def get_imagecolor(self):
619     return self._imagecolor
620    
621 jschuengel 2252 def set_name(self, newname):
622     # whitespace musst be replaced, either no
623     # mapfile will be shown in the mapserver
624     newname = newname.replace(" ","_")
625     self._name = newname
626     self._mf_map.name = newname
627    
628     def set_extent(self, newextent):
629     # TODO: add the shown extend here instead of the total
630     self._newrect = MF_Rectangle(rectObj())
631 jschuengel 2260 try:
632     self._newrect.set_rect(newextent[0],newextent[1],newextent[2],newextent[3])
633     self._mf_map.setExtent(newextent[0],newextent[1],newextent[2],newextent[3])
634     except:
635     return
636 jschuengel 2252
637     def set_size(self, newwidth, newheight):
638     self._mf_map.width = newwidth
639     self._mf_map.height = newheight
640    
641     def set_projection(self, projection):
642     self._mfnewprojstring = ""
643     self._newparams = projection.GetAllParameters()
644     for field in self._newparams:
645     self._mfnewprojstring = self._mfnewprojstring+ "," + field
646     self._mf_map.setProjection(self._mfnewprojstring[1:])
647     self._projection.set_projection(projection)
648 jschuengel 2260
649     def set_units(self, units):
650     if unit_type.has_key(units):
651     self._mf_map.units = units
652     else:
653     for unit_paar_nr in unit_type:
654     if unit_type[unit_paar_nr] == units:
655     self._mf_map.units = unit_paar_nr
656 jschuengel 2252
657     def add_thubanlayer(self, tb_layer):
658 jschuengel 2260 """
659     Add a thuban layer
660     """
661 jschuengel 2252 new_layer = MF_Layer(layerObj(self._mf_map))
662     new_layer.set_name(tb_layer.Title())
663    
664     # TODO: implement relative pathnames
665     # yet only absolute pathnames in the LayerObj are set
666 jschuengel 2260 try:
667     new_layer.set_data(tb_layer.ShapeStore().FileName())
668     except:
669     new_layer.set_data(tb_layer.GetImageFilename(), type="raster")
670     new_layer.set_type("raster")
671     else:
672     new_layer.set_status(tb_layer.Visible())
673     new_layer.set_type(tb_layer.ShapeType())
674 jschuengel 2252
675 jschuengel 2260 if tb_layer.GetClassificationColumn():
676     new_layer.set_classitem(tb_layer.GetClassificationColumn())
677     if tb_layer.GetProjection():
678     new_layer.set_projection(tb_layer.GetProjection())
679     if tb_layer.GetClassification().GetNumGroups() > 0:
680     for group in range(0, tb_layer.GetClassification().GetNumGroups(), 1):
681     new_layer.add_thubanclass(tb_layer.GetClassification().GetGroup(group))
682     new_layer.add_thubanclass(tb_layer.GetClassification().GetDefaultGroup())
683     else:
684     new_layer.add_thubanclass(tb_layer.GetClassification().GetDefaultGroup(), type="default")
685    
686 jschuengel 2252 # set the projection to the layer.
687     # if the layer has its own definition use is, else use the main projection
688     if tb_layer.GetProjection():
689     new_layer.set_projection(tb_layer.GetProjection())
690     else:
691     new_layer.set_projection(self._projection.get_projection())
692     self._layers.append(new_layer)
693    
694 jschuengel 2260 def remove_layer(self, nr):
695     self._mf_map.removeLayer(nr)
696     self._numlayers -= 1
697     self._layers.remove(self._layers[nr])
698    
699 jschuengel 2252 def save_map(self, filepath):
700     # save the Map
701     # maybe an own saver can implement here
702     self._mf_map.save(filepath)
703 jschuengel 2260
704    
705     class MF_Web:
706     """
707     Save the Web settings
708    
709     The following parametes are used:
710     imagepath, imageurl
711    
712     The following parameters are not used:
713     log, map, template, queryformat, header, footer, empty, error, extent,
714     minscale, maxscale, mintemplate, maxtemplate
715     """
716     def __init__(self, mf_web):
717     self._mf_web = mf_web
718    
719     def get_imagepath(self):
720     return self._mf_web.imagepath
721    
722     def set_imagepath(self, new_imagepath):
723     self._mf_web.imagepath = new_imagepath
724    
725     def get_imageurl(self):
726     return self._mf_web.imageurl
727    
728     def set_imageurl(self, new_imageurl):
729     self._mf_web.imagepath = new_imageurl
730    
731     def get_queryformat(self):
732     return self._mf_web.queryformat
733    
734     def set_queryformat(self, new_queryformat):
735     self._mf_web.imagepath = new_queryformat
736    
737    
738     class MF_Label:
739     """
740     The following parameters from mapscript are used:
741     type, color, size, offsetx, offsety,
742    
743     The following parameters are not used:
744     font, outlinecolor, shadowcolor, shadowsizex, shadowsizey,
745     backgroundcolor, backgroundshadowcolor, backgroundshadowsizex,
746     backgroundshadowsizey, sizescaled, minsize, maxsize, position, angle,
747     autoangle, buffer, antialias, wrap, minfeaturesize,
748     autominfeaturesize, mindistance, partials, force
749     """
750     def __init__(self, mf_label):
751     """
752     Create a legend obj from the existing mapfile
753     """
754     self._label = mf_label
755     self._color = MF_Color(self._label.color)
756    
757     def get_size(self):
758     return self._label.size
759    
760     def set_size(self, new_size):
761     if label_size_type.has_key(new_size):
762     self._label.size = new_size
763     for label_size_type_nr in label_size_type:
764     if label_size_type[label_size_type_nr] == new_size:
765     self._label.size = label_size_type_nr
766     else:
767     self._label.size = new_size
768    
769     def get_color(self):
770     return self._color
771    
772     def get_type(self):
773     return label_font_type[self._label.type]
774    
775     def set_type(self, new_type):
776     if label_font_type.has_key(new_type):
777     self._label.type = new_type
778     else:
779     for label_font_type_nr in label_font_type:
780     if label_font_type[label_font_type_nr] == new_type:
781     self._label.type = label_font_type_nr
782    
783     def get_offset(self):
784     return (self._label.offsetx, self._label.offsety)
785    
786     def set_offset(self, new_offsetx, new_offsety):
787     self._label.offsetx = new_offsetx
788     self._label.offsety = new_offsety
789    
790    
791     class MF_Legend:
792     """
793     The following parameters are (not) used:
794     imagecolor, label, keysizex, keysizey, status, position,
795    
796     The following parameters are not used:
797     keyspacingx, keyspacingy,
798     outlinecolor, height, width, postlabelcache, template, map
799     """
800     def __init__(self, mf_legend):
801     """
802     Create a legend obj from the existing mapfile
803     """
804     self._mf_legend = mf_legend
805     self._imagecolor = MF_Color(self._mf_legend.imagecolor)
806     self._label = MF_Label(self._mf_legend.label)
807 jschuengel 2252
808 jschuengel 2260 def get_imagecolor(self):
809     return self._imagecolor
810    
811     def get_label(self):
812     return self._label
813    
814     def get_keysize(self):
815     return (self._mf_legend.keysizex, self._mf_legend.keysizey)
816    
817     def set_keysize(self, new_keysizex, new_keysizey):
818     self._mf_legend.keysizex = new_keysizex
819     self._mf_legend.keysizey = new_keysizey
820    
821     def get_keyspacing(self):
822     return (self._mf_legend.keyspacingx, self._mf_legend.keyspacingy)
823    
824     def set_keyspacing(self, new_keyspacingx, new_keyspacingy):
825     self._mf_legend.keyspacingx = new_keyspacingx
826     self._mf_legend.keyspacingy = new_keyspacingy
827    
828     def get_status(self, art="integer"):
829     if art == "string":
830     return legend_status_type[self._mf_legend.status]
831     else:
832     return self._mf_legend.status
833    
834     def set_status(self, new_status):
835     if legend_status_type.has_key(new_status):
836     self._mf_legend.status = new_status
837     else:
838     for legend_status_type_nr in legend_status_type:
839     if legend_status_type[legend_status_type_nr] == new_status:
840     self._mf_legend.status = legend_status_type_nr
841    
842     def get_position(self, art="integer"):
843     if art == "string":
844     return legend_position_type[self._mf_legend.position]
845     else:
846     return self._mf_legend.position
847    
848     def set_position(self, new_position):
849     if legend_position_type.has_key(new_position):
850     self._mf_legend.position = new_position
851     else:
852     for legend_position_type_nr in legend_position_type:
853     if legend_position_type[legend_position_type_nr] == new_position:
854     self._mf_legend.position = legend_position_type_nr
855    
856    
857 jschuengel 2235 class MF_Projection:
858     """
859     The following parameter, which the mapscript style obj contains is used:
860    
861     numargs
862     """
863    
864     def __init__(self, mf_projection):
865     """
866     Create a projection object from the given mapscript projection
867 jschuengel 2260 object. If it is a epsg code the extracted from the string
868     (e.g."init=epsg:xxxx"), else the projection parameters will
869     be splitted and an array with the parameters will be creaded.
870     """
871 jschuengel 2235 self._mfprojstring = mf_projection
872 jschuengel 2252 self._projstring = self._mfprojstring
873 jschuengel 2235 self._epsgcode = None
874     self._params = None
875     if self._mfprojstring:
876     if self._mfprojstring.find("init=epsg:") != -1:
877     self._initcode, self._epsgcode = self._mfprojstring.split(':')
878     else:
879     self._params = []
880     self._params = self._mfprojstring.split("+")
881     if self._params[0] == "":
882     self._params.remove("")
883    
884     def epsg_code_to_projection(self, epsg):
885     """
886     Find the projection for the given epsg code.
887    
888     Copied from Extension/wms/layer.py
889    
890     epsg -- EPSG code as string
891     """
892     #Needed only for this function
893     from Thuban.Model.resource import get_system_proj_file, EPSG_PROJ_FILE, \
894     EPSG_DEPRECATED_PROJ_FILE
895    
896     proj_file, warnings = get_system_proj_file(EPSG_PROJ_FILE)
897    
898     for proj in proj_file.GetProjections():
899     if proj.EPSGCode() == epsg:
900     return proj
901    
902     proj_file, warnings = get_system_proj_file(EPSG_DEPRECATED_PROJ_FILE)
903     for proj in proj_file.GetProjections():
904     if proj.EPSGCode() == epsg:
905     return proj
906     return None
907    
908     def get_params(self):
909     #Parameter from the mf_projectionstring as Array
910     return self._params
911    
912     def get_epsgcode(self):
913     # returnes the epsg number
914     return self._epsgcode
915    
916     def get_epsgproj(self):
917     # get an epsg projectionobject
918     return self.epsg_code_to_projection(self._epsgcode)
919 jschuengel 2252
920     def get_projection(self):
921     return self._projstring
922    
923     def set_projection(self, newprojection):
924     self._projstring = newprojection
925     self._params = newprojection.GetAllParameters()
926     self._mfnewprojstring = ""
927     for field in self._params:
928     self._mfnewprojstring = self._mfnewprojstring+ "+" + field
929     self._mfprojstring = self._mfnewprojstring
930 jschuengel 2235
931 jschuengel 2260
932 jschuengel 2235 class MF_Style:
933     """
934     The following parameters, which the mapscript style obj
935     contains, are used:
936 jschuengel 2252 color, backgroundcolor, outlinecolor, size, symbolname
937 jschuengel 2235
938     The following are not used:
939 jschuengel 2252 symbol, sizescaled, minsize, maxsize, offsetx, offsety,
940 jschuengel 2235 antialias
941     """
942    
943     def __init__(self, mf_style):
944     """
945     Create a style object from the given mapscript style object.
946     The color Object from the color and the outlinecolor parameter
947     will be created. if the color (red, green or blue) is -1 there
948     is no definition in the mapfile and so there is no color object,
949     it will set to 'None'.
950     """
951     self._style = mf_style
952     if self._style.color.red == -1:
953 jschuengel 2260 self._color = None
954 jschuengel 2235 else:
955 jschuengel 2260 self._color = MF_Color(self._style.color)
956 jschuengel 2235 if self._style.outlinecolor.red == -1:
957     self._outlinecolor = None
958     else:
959     self._outlinecolor = MF_Color(self._style.outlinecolor)
960    
961     def get_color(self):
962     return self._color
963    
964     def get_outlinecolor(self):
965     return self._outlinecolor
966    
967     def get_size(self):
968     return self._style.size
969 jschuengel 2252
970     def set_linecolor(self, tb_color):
971     self._color = tb_color
972     new_linecolor = MF_Color(colorObj())
973     new_linecolor.set_thubancolor(tb_color)
974     self._outlinecolor = new_linecolor
975     self._style.outlinecolor = new_linecolor.get_mfcolor()
976    
977     def set_color(self, tb_color):
978     self._color = tb_color
979     new_color = MF_Color(colorObj())
980     new_color.set_thubancolor(tb_color)
981     self._color = new_color
982     self._style.color = new_color.get_mfcolor()
983    
984     def set_size(self, newsize):
985     self._style.size = newsize
986    
987     def set_symbolname(self, newsymbol):
988     # its possible to use stringnames instead of numbers
989 jschuengel 2260 self._style.symbolname = newsymbol
990 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