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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2326 - (show annotations)
Mon Aug 9 11:38:47 2004 UTC (20 years, 7 months ago) by jschuengel
File MIME type: text/x-python
File size: 49841 byte(s)
Move the import AnnotationLayer to the function where it is needed, because it don't works if it stands at the beginning.
(MF_Layer.__init__): Removed the extra numclassed variable. Now numclasses from the mapscript will be used.
(MF_Layer.get_index): New. Return the index of the layer in mapfile.
(MF_Layer.set_classes): New. A Classlist will be set to the layer.
(MF_Layer.set_metadata): New. A Metadata mapscript object will set.
(MF_Layer.remove_allclasses): New. All class of the layer will remove.
(MF_Map.create_new_layer): New. A new Layer is created and associated with the mapscript object.
(MF_Map.set_layerorder): New. The Layer order like in thuban is set in the mapscript.
(MF_Map.add_thubanlayer): Now a new layerobj is created if no one is linked to the layer in thuban, else the layerobject linked to the thubanlayer will be used.
AnnotationLayer will now store the filename of the shapefile.
(MF_Map.remove_layer): If a layer is removed the associated object must be set new.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26