1"""
2Metadata classes for map layer and space time datasets
3
4Usage:
5
6.. code-block:: python
7
8    >>> import grass.temporal as tgis
9    >>> tgis.init()
10    >>> meta = tgis.RasterMetadata()
11    >>> meta = tgis.Raster3DMetadata()
12    >>> meta = tgis.VectorMetadata()
13    >>> meta = tgis.STRDSMetadata()
14    >>> meta = tgis.STR3DSMetadata()
15    >>> meta = tgis.STVDSMetadata()
16
17(C) 2012-2013 by the GRASS Development Team
18This program is free software under the GNU General Public
19License (>=v2). Read the file COPYING that comes with GRASS
20for details.
21
22:authors: Soeren Gebbert
23"""
24from __future__ import print_function
25from .base import SQLDatabaseInterface
26from .core import init
27
28###############################################################################
29
30
31class RasterMetadataBase(SQLDatabaseInterface):
32    """This is the metadata base class for time stamped raster and raster3d maps
33
34        Usage:
35
36        .. code-block:: python
37
38            >>> init()
39            >>> meta = RasterMetadataBase(table="metadata", ident="soil@PERMANENT",
40            ... datatype="CELL", cols=100, rows=100, number_of_cells=10000, nsres=0.1,
41            ... ewres=0.1, min=0, max=100)
42            >>> meta.datatype
43            'CELL'
44            >>> meta.cols
45            100
46            >>> meta.rows
47            100
48            >>> meta.number_of_cells
49            10000
50            >>> meta.nsres
51            0.1
52            >>> meta.ewres
53            0.1
54            >>> meta.min
55            0.0
56            >>> meta.max
57            100.0
58            >>> meta.print_info()
59             | Datatype:................... CELL
60             | Number of columns:.......... 100
61             | Number of rows:............. 100
62             | Number of cells:............ 10000
63             | North-South resolution:..... 0.1
64             | East-west resolution:....... 0.1
65             | Minimum value:.............. 0.0
66             | Maximum value:.............. 100.0
67            >>> meta.print_shell_info()
68            datatype=CELL
69            cols=100
70            rows=100
71            number_of_cells=10000
72            nsres=0.1
73            ewres=0.1
74            min=0.0
75            max=100.0
76
77    """
78    def __init__(self, table=None, ident=None, datatype=None, cols=None,
79                 rows=None, number_of_cells=None, nsres=None, ewres=None,
80                 min=None, max=None):
81
82        SQLDatabaseInterface.__init__(self, table, ident)
83
84        self.set_id(ident)
85        self.set_datatype(datatype)
86        self.set_cols(cols)
87        self.set_rows(rows)
88        self.set_number_of_cells(number_of_cells)
89        self.set_nsres(nsres)
90        self.set_ewres(ewres)
91        self.set_min(min)
92        self.set_max(max)
93
94    def set_id(self, ident):
95        """Convenient method to set the unique identifier (primary key)"""
96        self.ident = ident
97        self.D["id"] = ident
98
99    def set_datatype(self, datatype):
100        """Set the datatype"""
101        self.D["datatype"] = datatype
102
103    def set_cols(self, cols):
104        """Set the number of cols"""
105        if cols is not None:
106            self.D["cols"] = int(cols)
107        else:
108            self.D["cols"] = None
109
110    def set_rows(self, rows):
111        """Set the number of rows"""
112        if rows is not None:
113            self.D["rows"] = int(rows)
114        else:
115            self.D["rows"] = None
116
117    def set_number_of_cells(self, number_of_cells):
118        """Set the number of cells"""
119        if number_of_cells is not None:
120            self.D["number_of_cells"] = int(number_of_cells)
121        else:
122            self.D["number_of_cells"] = None
123
124    def set_nsres(self, nsres):
125        """Set the north-south resolution"""
126        if nsres is not None:
127            self.D["nsres"] = float(nsres)
128        else:
129            self.D["nsres"] = None
130
131    def set_ewres(self, ewres):
132        """Set the east-west resolution"""
133        if ewres is not None:
134            self.D["ewres"] = float(ewres)
135        else:
136            self.D["ewres"] = None
137
138    def set_min(self, min):
139        """Set the minimum raster value"""
140        if min is not None:
141            self.D["min"] = float(min)
142        else:
143            self.D["min"] = None
144
145    def set_max(self, max):
146        """Set the maximum raster value"""
147        if max is not None:
148            self.D["max"] = float(max)
149        else:
150            self.D["max"] = None
151
152    def get_id(self):
153        """Convenient method to get the unique identifier (primary key)
154           :return: None if not found
155        """
156        if "id" in self.D:
157            return self.D["id"]
158        else:
159            return None
160
161    def get_datatype(self):
162        """Get the map type
163           :return: None if not found"""
164        if "datatype" in self.D:
165            return self.D["datatype"]
166        else:
167            return None
168
169    def get_cols(self):
170        """Get number of cols
171           :return: None if not found"""
172        if "cols" in self.D:
173            return self.D["cols"]
174        else:
175            return None
176
177    def get_rows(self):
178        """Get number of rows
179           :return: None if not found"""
180        if "rows" in self.D:
181            return self.D["rows"]
182        else:
183            return None
184
185    def get_number_of_cells(self):
186        """Get number of cells
187           :return: None if not found"""
188        if "number_of_cells" in self.D:
189            return self.D["number_of_cells"]
190        else:
191            return None
192
193    def get_nsres(self):
194        """Get the north-south resolution
195           :return: None if not found"""
196        if "nsres" in self.D:
197            return self.D["nsres"]
198        else:
199            return None
200
201    def get_ewres(self):
202        """Get east-west resolution
203           :return: None if not found"""
204        if "ewres" in self.D:
205            return self.D["ewres"]
206        else:
207            return None
208
209    def get_min(self):
210        """Get the minimum cell value
211           :return: None if not found"""
212        if "min" in self.D:
213            return self.D["min"]
214        else:
215            return None
216
217    def get_max(self):
218        """Get the maximum cell value
219           :return: None if not found"""
220        if "max" in self.D:
221            return self.D["max"]
222        else:
223            return None
224
225    # Properties
226    datatype = property(fget=get_datatype, fset=set_datatype)
227    cols = property(fget=get_cols, fset=set_cols)
228    rows = property(fget=get_rows, fset=set_rows)
229    number_of_cells = property(fget=get_number_of_cells,
230                               fset=set_number_of_cells)
231    nsres = property(fget=get_nsres, fset=set_nsres)
232    ewres = property(fget=get_ewres, fset=set_ewres)
233    min = property(fget=get_min, fset=set_min)
234    max = property(fget=get_max, fset=set_max)
235
236    def print_info(self):
237        """Print information about this class in human readable style"""
238        #      0123456789012345678901234567890
239        print(" | Datatype:................... " + str(self.get_datatype()))
240        print(" | Number of columns:.......... " + str(self.get_cols()))
241        print(" | Number of rows:............. " + str(self.get_rows()))
242        print(" | Number of cells:............ " + str(
243            self.get_number_of_cells()))
244        print(" | North-South resolution:..... " + str(self.get_nsres()))
245        print(" | East-west resolution:....... " + str(self.get_ewres()))
246        print(" | Minimum value:.............. " + str(self.get_min()))
247        print(" | Maximum value:.............. " + str(self.get_max()))
248
249    def print_shell_info(self):
250        """Print information about this class in shell style"""
251        print("datatype=" + str(self.get_datatype()))
252        print("cols=" + str(self.get_cols()))
253        print("rows=" + str(self.get_rows()))
254        print("number_of_cells=" + str(self.get_number_of_cells()))
255        print("nsres=" + str(self.get_nsres()))
256        print("ewres=" + str(self.get_ewres()))
257        print("min=" + str(self.get_min()))
258        print("max=" + str(self.get_max()))
259
260###############################################################################
261
262
263class RasterMetadata(RasterMetadataBase):
264    """This is the raster metadata class
265
266        This class is the interface to the raster_metadata table in the
267        temporal database that stores the metadata of all registered raster maps.
268
269        The metadata includes the datatype, number of cols, rows and cells and
270        the north-south and east west resolution of the map. Additionally the
271        minimum and maximum valuesare stored.
272
273        Usage:
274
275        .. code-block:: python
276
277            >>> init()
278            >>> meta = RasterMetadata(ident="soil@PERMANENT",
279            ... datatype="CELL", cols=100, rows=100, number_of_cells=10000, nsres=0.1,
280            ... ewres=0.1, min=0, max=100)
281            >>> meta.datatype
282            'CELL'
283            >>> meta.cols
284            100
285            >>> meta.rows
286            100
287            >>> meta.number_of_cells
288            10000
289            >>> meta.nsres
290            0.1
291            >>> meta.ewres
292            0.1
293            >>> meta.min
294            0.0
295            >>> meta.max
296            100.0
297            >>> meta.print_info()
298             +-------------------- Metadata information ----------------------------------+
299             | Datatype:................... CELL
300             | Number of columns:.......... 100
301             | Number of rows:............. 100
302             | Number of cells:............ 10000
303             | North-South resolution:..... 0.1
304             | East-west resolution:....... 0.1
305             | Minimum value:.............. 0.0
306             | Maximum value:.............. 100.0
307            >>> meta.print_shell_info()
308            datatype=CELL
309            cols=100
310            rows=100
311            number_of_cells=10000
312            nsres=0.1
313            ewres=0.1
314            min=0.0
315            max=100.0
316
317    """
318    def __init__(self, ident=None, datatype=None,
319                 cols=None, rows=None, number_of_cells=None, nsres=None,
320                 ewres=None, min=None, max=None):
321
322        RasterMetadataBase.__init__(self, "raster_metadata", ident, datatype,
323                                    cols, rows, number_of_cells, nsres,
324                                    ewres, min, max)
325
326    def print_info(self):
327        """Print information about this class in human readable style"""
328        print(" +-------------------- Metadata information ----------------------------------+")
329        #      0123456789012345678901234567890
330        RasterMetadataBase.print_info(self)
331
332    def print_shell_info(self):
333        """Print information about this class in shell style"""
334        RasterMetadataBase.print_shell_info(self)
335
336###############################################################################
337
338
339class Raster3DMetadata(RasterMetadataBase):
340    """This is the raster3d metadata class
341
342        This class is the interface to the raster3d_metadata table in the
343        temporal database that stores the metadata of all registered
344        3D raster maps.
345
346        The metadata includes all raster metadata variables and additional
347        the number of depths, the top-bottom resolution and the space time 3D
348        raster dataset register table is stored.
349
350        Usage:
351
352        .. code-block:: python
353
354            >>> init()
355            >>> meta = Raster3DMetadata(ident="soil@PERMANENT",
356            ... datatype="FCELL", cols=100, rows=100, depths=100,
357            ... number_of_cells=1000000, nsres=0.1, ewres=0.1, tbres=0.1,
358            ... min=0, max=100)
359            >>> meta.datatype
360            'FCELL'
361            >>> meta.cols
362            100
363            >>> meta.rows
364            100
365            >>> meta.depths
366            100
367            >>> meta.number_of_cells
368            1000000
369            >>> meta.nsres
370            0.1
371            >>> meta.ewres
372            0.1
373            >>> meta.tbres
374            0.1
375            >>> meta.min
376            0.0
377            >>> meta.max
378            100.0
379            >>> meta.print_info()
380             +-------------------- Metadata information ----------------------------------+
381             | Datatype:................... FCELL
382             | Number of columns:.......... 100
383             | Number of rows:............. 100
384             | Number of cells:............ 1000000
385             | North-South resolution:..... 0.1
386             | East-west resolution:....... 0.1
387             | Minimum value:.............. 0.0
388             | Maximum value:.............. 100.0
389             | Number of depths:........... 100
390             | Top-Bottom resolution:...... 0.1
391            >>> meta.print_shell_info()
392            datatype=FCELL
393            cols=100
394            rows=100
395            number_of_cells=1000000
396            nsres=0.1
397            ewres=0.1
398            min=0.0
399            max=100.0
400            depths=100
401            tbres=0.1
402
403    """
404    def __init__(self, ident=None, datatype=None,
405                 cols=None, rows=None, depths=None, number_of_cells=None,
406                 nsres=None, ewres=None, tbres=None, min=None, max=None):
407
408        RasterMetadataBase.__init__(self, "raster3d_metadata", ident,
409                                    datatype, cols, rows, number_of_cells,
410                                    nsres,	ewres, min, max)
411
412        self.set_tbres(tbres)
413        self.set_depths(depths)
414
415    def set_depths(self, depths):
416        """Set the number of depths"""
417        if depths is not None:
418            self.D["depths"] = int(depths)
419        else:
420            self.D["depths"] = None
421
422    def set_tbres(self, tbres):
423        """Set the top-bottom resolution"""
424        if tbres is not None:
425            self.D["tbres"] = float(tbres)
426        else:
427            self.D["tbres"] = None
428
429    def get_depths(self):
430        """Get number of depths
431           :return: None if not found"""
432        if "depths" in self.D:
433            return self.D["depths"]
434        else:
435            return None
436
437    def get_tbres(self):
438        """Get top-bottom resolution
439           :return: None if not found"""
440        if "tbres" in self.D:
441            return self.D["tbres"]
442        else:
443            return None
444
445    depths = property(fget=get_depths, fset=set_depths)
446    tbres = property(fget=get_tbres, fset=set_tbres)
447
448    def print_info(self):
449        """Print information about this class in human readable style"""
450        print(" +-------------------- Metadata information ----------------------------------+")
451        #      0123456789012345678901234567890
452        RasterMetadataBase.print_info(self)
453        #      0123456789012345678901234567890
454        print(" | Number of depths:........... " + str(self.get_depths()))
455        print(" | Top-Bottom resolution:...... " + str(self.get_tbres()))
456
457    def print_shell_info(self):
458        """Print information about this class in shell style"""
459        RasterMetadataBase.print_shell_info(self)
460        print("depths=" + str(self.get_depths()))
461        print("tbres=" + str(self.get_tbres()))
462
463###############################################################################
464
465
466class VectorMetadata(SQLDatabaseInterface):
467    """This is the vector metadata class
468
469        This class is the interface to the vector_metadata table in the
470        temporal database that stores the metadata of all registered
471        vector maps.
472
473        Usage:
474
475        .. code-block:: python
476
477            >>> init()
478            >>> meta = VectorMetadata(ident="lidar@PERMANENT", is_3d=True,
479            ... number_of_points=1, number_of_lines=2, number_of_boundaries=3,
480            ... number_of_centroids=4, number_of_faces=5, number_of_kernels=6,
481            ... number_of_primitives=7, number_of_nodes=8, number_of_areas=9,
482            ... number_of_islands=10, number_of_holes=11, number_of_volumes=12)
483            >>> meta.id
484            'lidar@PERMANENT'
485            >>> meta.is_3d
486            True
487            >>> meta.number_of_points
488            1
489            >>> meta.number_of_lines
490            2
491            >>> meta.number_of_boundaries
492            3
493            >>> meta.number_of_centroids
494            4
495            >>> meta.number_of_faces
496            5
497            >>> meta.number_of_kernels
498            6
499            >>> meta.number_of_primitives
500            7
501            >>> meta.number_of_nodes
502            8
503            >>> meta.number_of_areas
504            9
505            >>> meta.number_of_islands
506            10
507            >>> meta.number_of_holes
508            11
509            >>> meta.number_of_volumes
510            12
511            >>> meta.print_info()
512             +-------------------- Metadata information ----------------------------------+
513             | Is map 3d .................. True
514             | Number of points ........... 1
515             | Number of lines ............ 2
516             | Number of boundaries ....... 3
517             | Number of centroids ........ 4
518             | Number of faces ............ 5
519             | Number of kernels .......... 6
520             | Number of primitives ....... 7
521             | Number of nodes ............ 8
522             | Number of areas ............ 9
523             | Number of islands .......... 10
524             | Number of holes ............ 11
525             | Number of volumes .......... 12
526            >>> meta.print_shell_info()
527            is_3d=True
528            points=1
529            lines=2
530            boundaries=3
531            centroids=4
532            faces=5
533            kernels=6
534            primitives=7
535            nodes=8
536            areas=9
537            islands=10
538            holes=11
539            volumes=12
540
541    """
542    def __init__(self, ident=None, is_3d=False, number_of_points=None,
543                 number_of_lines=None, number_of_boundaries=None,
544                 number_of_centroids=None, number_of_faces=None,
545                 number_of_kernels=None, number_of_primitives=None,
546                 number_of_nodes=None, number_of_areas=None,
547                 number_of_islands=None, number_of_holes=None,
548                 number_of_volumes=None):
549
550        SQLDatabaseInterface.__init__(self, "vector_metadata", ident)
551
552        self.set_id(ident)
553        self.set_3d_info(is_3d)
554        self.set_number_of_points(number_of_points)
555        self.set_number_of_lines(number_of_lines)
556        self.set_number_of_boundaries(number_of_boundaries)
557        self.set_number_of_centroids(number_of_centroids)
558        self.set_number_of_faces(number_of_faces)
559        self.set_number_of_kernels(number_of_kernels)
560        self.set_number_of_primitives(number_of_primitives)
561        self.set_number_of_nodes(number_of_nodes)
562        self.set_number_of_areas(number_of_areas)
563        self.set_number_of_islands(number_of_islands)
564        self.set_number_of_holes(number_of_holes)
565        self.set_number_of_volumes(number_of_volumes)
566
567    def set_id(self, ident):
568        """Convenient method to set the unique identifier (primary key)"""
569        self.ident = ident
570        self.D["id"] = ident
571
572    def set_3d_info(self, is_3d):
573        """Set True if the vector map is three dimensional"""
574        self.D["is_3d"] = is_3d
575
576    def set_number_of_points(self, number_of_points):
577        """Set the number of points of the vector map"""
578        self.D["points"] = number_of_points
579
580    def set_number_of_lines(self, number_of_lines):
581        """Set the number of lines of the vector map"""
582        self.D["lines"] = number_of_lines
583
584    def set_number_of_boundaries(self, number_of_boundaries):
585        """Set the number of boundaries of the vector map"""
586        self.D["boundaries"] = number_of_boundaries
587
588    def set_number_of_centroids(self, number_of_centroids):
589        """Set the number of centroids of the vector map"""
590        self.D["centroids"] = number_of_centroids
591
592    def set_number_of_faces(self, number_of_faces):
593        """Set the number of faces of the vector map"""
594        self.D["faces"] = number_of_faces
595
596    def set_number_of_kernels(self, number_of_kernels):
597        """Set the number of kernels of the vector map"""
598        self.D["kernels"] = number_of_kernels
599
600    def set_number_of_primitives(self, number_of_primitives):
601        """Set the number of primitives of the vector map"""
602        self.D["primitives"] = number_of_primitives
603
604    def set_number_of_nodes(self, number_of_nodes):
605        """Set the number of nodes of the vector map"""
606        self.D["nodes"] = number_of_nodes
607
608    def set_number_of_areas(self, number_of_areas):
609        """Set the number of areas of the vector map"""
610        self.D["areas"] = number_of_areas
611
612    def set_number_of_islands(self, number_of_islands):
613        """Set the number of islands of the vector map"""
614        self.D["islands"] = number_of_islands
615
616    def set_number_of_holes(self, number_of_holes):
617        """Set the number of holes of the vector map"""
618        self.D["holes"] = number_of_holes
619
620    def set_number_of_volumes(self, number_of_volumes):
621        """Set the number of volumes of the vector map"""
622        self.D["volumes"] = number_of_volumes
623
624    def get_id(self):
625        """Convenient method to get the unique identifier (primary key)
626           :return: None if not found
627        """
628        if "id" in self.D:
629            return self.D["id"]
630        else:
631            return None
632
633    def get_3d_info(self):
634        """Return True if the map is three dimensional,
635           False if not and None if not info was found"""
636        if "is_3d" in self.D:
637            return self.D["is_3d"]
638        else:
639            return None
640
641    def get_number_of_points(self):
642        """Get the number of points of the vector map
643           :return: None if not found"""
644        if "points" in self.D:
645            return self.D["points"]
646        else:
647            return None
648
649    def get_number_of_lines(self):
650        """Get the number of lines of the vector map
651           :return: None if not found"""
652        if "lines" in self.D:
653            return self.D["lines"]
654        else:
655            return None
656
657    def get_number_of_boundaries(self):
658        """Get the number of boundaries of the vector map
659           :return: None if not found"""
660        if "boundaries" in self.D:
661            return self.D["boundaries"]
662        else:
663            return None
664
665    def get_number_of_centroids(self):
666        """Get the number of centroids of the vector map
667           :return: None if not found"""
668        if "centroids" in self.D:
669            return self.D["centroids"]
670        else:
671            return None
672
673    def get_number_of_faces(self):
674        """Get the number of faces of the vector map
675           :return: None if not found"""
676        if "faces" in self.D:
677            return self.D["faces"]
678        else:
679            return None
680
681    def get_number_of_kernels(self):
682        """Get the number of kernels of the vector map
683           :return: None if not found"""
684        if "kernels" in self.D:
685            return self.D["kernels"]
686        else:
687            return None
688
689    def get_number_of_primitives(self):
690        """Get the number of primitives of the vector map
691           :return: None if not found"""
692        if "primitives" in self.D:
693            return self.D["primitives"]
694        else:
695            return None
696
697    def get_number_of_nodes(self):
698        """Get the number of nodes of the vector map
699           :return: None if not found"""
700        if "nodes" in self.D:
701            return self.D["nodes"]
702        else:
703            return None
704
705    def get_number_of_areas(self):
706        """Get the number of areas of the vector map
707           :return: None if not found"""
708        if "areas" in self.D:
709            return self.D["areas"]
710        else:
711            return None
712
713    def get_number_of_islands(self):
714        """Get the number of islands of the vector map
715           :return: None if not found"""
716        if "islands" in self.D:
717            return self.D["islands"]
718        else:
719            return None
720
721    def get_number_of_holes(self):
722        """Get the number of holes of the vector map
723           :return: None if not found"""
724        if "holes" in self.D:
725            return self.D["holes"]
726        else:
727            return None
728
729    def get_number_of_volumes(self):
730        """Get the number of volumes of the vector map
731           :return: None if not found"""
732        if "volumes" in self.D:
733            return self.D["volumes"]
734        else:
735            return None
736
737    # Set the properties
738    id = property(fget=get_id, fset=set_id)
739    is_3d = property(fget=get_3d_info, fset=set_3d_info)
740    number_of_points = property(fget=get_number_of_points,
741                                fset=set_number_of_points)
742    number_of_lines = property(fget=get_number_of_lines,
743                               fset=set_number_of_lines)
744    number_of_boundaries = property(fget=get_number_of_boundaries,
745                                    fset=set_number_of_boundaries)
746    number_of_centroids = property(fget=get_number_of_centroids,
747                                   fset=set_number_of_centroids)
748    number_of_faces = property(fget=get_number_of_faces,
749                               fset=set_number_of_faces)
750    number_of_kernels = property(fget=get_number_of_kernels,
751                                 fset=set_number_of_kernels)
752    number_of_primitives = property(fget=get_number_of_primitives,
753                                    fset=set_number_of_primitives)
754    number_of_nodes = property(fget=get_number_of_nodes,
755                               fset=set_number_of_nodes)
756    number_of_areas = property(fget=get_number_of_areas,
757                               fset=set_number_of_areas)
758    number_of_islands = property(fget=get_number_of_islands,
759                                 fset=set_number_of_islands)
760    number_of_holes = property(fget=get_number_of_holes,
761                               fset=set_number_of_holes)
762    number_of_volumes = property(fget=get_number_of_volumes,
763                                 fset=set_number_of_volumes)
764
765    def print_info(self):
766        """Print information about this class in human readable style"""
767        #      0123456789012345678901234567890
768        print(" +-------------------- Metadata information ----------------------------------+")
769        print(" | Is map 3d .................. " + str(self.get_3d_info()))
770        print(" | Number of points ........... " + str(self.get_number_of_points()))
771        print(" | Number of lines ............ " + str(self.get_number_of_lines()))
772        print(" | Number of boundaries ....... " + str(self.get_number_of_boundaries()))
773        print(" | Number of centroids ........ " + str(self.get_number_of_centroids()))
774        print(" | Number of faces ............ " + str(self.get_number_of_faces()))
775        print(" | Number of kernels .......... " + str(self.get_number_of_kernels()))
776        print(" | Number of primitives ....... " + str(self.get_number_of_primitives()))
777        print(" | Number of nodes ............ " + str(self.get_number_of_nodes()))
778        print(" | Number of areas ............ " + str(self.get_number_of_areas()))
779        print(" | Number of islands .......... " + str(self.get_number_of_islands()))
780        print(" | Number of holes ............ " + str(self.get_number_of_holes()))
781        print(" | Number of volumes .......... " + str(self.get_number_of_volumes()))
782
783    def print_shell_info(self):
784        """Print information about this class in shell style"""
785        print("is_3d=" + str(self.get_3d_info()))
786        print("points=" + str(self.get_number_of_points()))
787        print("lines=" + str(self.get_number_of_lines()))
788        print("boundaries=" + str(self.get_number_of_boundaries()))
789        print("centroids=" + str(self.get_number_of_centroids()))
790        print("faces=" + str(self.get_number_of_faces()))
791        print("kernels=" + str(self.get_number_of_kernels()))
792        print("primitives=" + str(self.get_number_of_primitives()))
793        print("nodes=" + str(self.get_number_of_nodes()))
794        print("areas=" + str(self.get_number_of_areas()))
795        print("islands=" + str(self.get_number_of_islands()))
796        print("holes=" + str(self.get_number_of_holes()))
797        print("volumes=" + str(self.get_number_of_volumes()))
798
799###############################################################################
800
801
802class STDSMetadataBase(SQLDatabaseInterface):
803    """This is the space time dataset metadata base class for
804       strds, stvds and str3ds datasets
805       setting/getting the id, the title and the description
806
807        Usage:
808
809        .. code-block:: python
810
811            >>> init()
812            >>> meta = STDSMetadataBase(ident="soils@PERMANENT",
813            ... title="Soils", description="Soils 1950 - 2010")
814            >>> meta.id
815            'soils@PERMANENT'
816            >>> meta.title
817            'Soils'
818            >>> meta.description
819            'Soils 1950 - 2010'
820            >>> meta.number_of_maps
821            >>> meta.print_info()
822             | Number of registered maps:.. None
823             |
824             | Title:
825             | Soils
826             | Description:
827             | Soils 1950 - 2010
828             | Command history:
829            >>> meta.print_shell_info()
830            number_of_maps=None
831
832    """
833    def __init__(self, table=None, ident=None, title=None, description=None,
834                 command=None):
835
836        SQLDatabaseInterface.__init__(self, table, ident)
837
838        self.set_id(ident)
839        self.set_title(title)
840        self.set_description(description)
841        self.set_command(command)
842        # No setter for this
843        self.D["number_of_maps"] = None
844
845    def set_id(self, ident):
846        """Convenient method to set the unique identifier (primary key)"""
847        self.ident = ident
848        self.D["id"] = ident
849
850    def set_title(self, title):
851        """Set the title"""
852        self.D["title"] = title
853
854    def set_description(self, description):
855        """Set the number of cols"""
856        self.D["description"] = description
857
858    def set_command(self, command):
859        """Set the number of cols"""
860        self.D["command"] = command
861
862    def get_id(self):
863        """Convenient method to get the unique identifier (primary key)
864           :return: None if not found
865        """
866        if "id" in self.D:
867            return self.D["id"]
868        else:
869            return None
870
871    def get_title(self):
872        """Get the title
873           :return: None if not found"""
874        if "title" in self.D:
875            return self.D["title"]
876        else:
877            return None
878
879    def get_description(self):
880        """Get description
881           :return: None if not found"""
882        if "description" in self.D:
883            return self.D["description"]
884        else:
885            return None
886
887    def get_command(self):
888        """Get command
889           :return: None if not found"""
890        if "command" in self.D:
891            return self.D["command"]
892        else:
893            return None
894
895    def get_number_of_maps(self):
896        """Get the number of registered maps,
897           this value is set in the database
898           automatically via SQL, so no setter exists
899           :return: None if not found"""
900        if "number_of_maps" in self.D:
901            return self.D["number_of_maps"]
902        else:
903            return None
904
905    id = property(fget=get_id, fset=set_id)
906    title = property(fget=get_title, fset=set_title)
907    description = property(fget=get_description, fset=set_description)
908    number_of_maps = property(fget=get_number_of_maps)
909
910    def print_info(self):
911        """Print information about this class in human readable style"""
912        #      0123456789012345678901234567890
913        print(" | Number of registered maps:.. " + str(
914            self.get_number_of_maps()))
915        print(" |")
916        print(" | Title:")
917        print(" | " + str(self.get_title()))
918        print(" | Description:")
919        print(" | " + str(self.get_description()))
920        print(" | Command history:")
921        command = self.get_command()
922        if command:
923            for token in command.split("\n"):
924                print(" | " + str(token))
925
926    def print_history(self):
927        """Print history information about this class in human readable
928            shell style
929        """
930        #      0123456789012345678901234567890
931        print("# Title:")
932        print("# " + str(self.get_title()))
933        print("# Description:")
934        print("# " + str(self.get_description()))
935        print("# Command history:")
936        command = self.get_command()
937
938        if command:
939            tokens = command.split("\n")
940            print_list = []
941            for token in tokens:
942                token = str(token).rstrip().lstrip()
943                if len(token) > 1:
944                    print_list.append(token)
945
946            count = 0
947            for token in print_list:
948                count += 1
949                if len(token) > 1:
950                    if token[0] == "#":
951                        print(token)
952                    elif count < len(print_list):
953                        print(token + " \\")
954                    else:
955                        print(token)
956
957    def print_shell_info(self):
958        """Print information about this class in shell style"""
959        print("number_of_maps=" + str(self.get_number_of_maps()))
960
961###############################################################################
962
963
964class STDSRasterMetadataBase(STDSMetadataBase):
965    """This is the space time dataset metadata base
966        class for strds and str3ds datasets
967
968        Most of the metadata values are set by SQL scripts in the database when
969        new maps are added. Therefor only some set- an many
970        get-functions are available.
971
972        Usage:
973
974        .. code-block:: python
975
976            >>> init()
977            >>> meta = STDSRasterMetadataBase(ident="soils@PERMANENT",
978            ... title="Soils", description="Soils 1950 - 2010")
979            >>> meta.id
980            'soils@PERMANENT'
981            >>> meta.title
982            'Soils'
983            >>> meta.description
984            'Soils 1950 - 2010'
985            >>> meta.number_of_maps
986            >>> meta.min_max
987            >>> meta.max_max
988            >>> meta.min_min
989            >>> meta.max_min
990            >>> meta.nsres_min
991            >>> meta.nsres_max
992            >>> meta.ewres_min
993            >>> meta.ewres_max
994            >>> meta.print_info()
995             | North-South resolution min:. None
996             | North-South resolution max:. None
997             | East-west resolution min:... None
998             | East-west resolution max:... None
999             | Minimum value min:.......... None
1000             | Minimum value max:.......... None
1001             | Maximum value min:.......... None
1002             | Maximum value max:.......... None
1003             | Aggregation type:........... None
1004             | Number of registered maps:.. None
1005             |
1006             | Title:
1007             | Soils
1008             | Description:
1009             | Soils 1950 - 2010
1010             | Command history:
1011            >>> meta.print_shell_info()
1012            aggregation_type=None
1013            number_of_maps=None
1014            nsres_min=None
1015            nsres_max=None
1016            ewres_min=None
1017            ewres_max=None
1018            min_min=None
1019            min_max=None
1020            max_min=None
1021            max_max=None
1022
1023    """
1024    def __init__(self, table=None, ident=None, title=None, description=None,
1025                 aggregation_type=None):
1026
1027        STDSMetadataBase.__init__(self, table, ident, title, description)
1028
1029        # Initialize the dict to select all values from the db
1030        self.D["min_max"] = None
1031        self.D["max_max"] = None
1032        self.D["min_min"] = None
1033        self.D["max_min"] = None
1034        self.D["nsres_min"] = None
1035        self.D["nsres_max"] = None
1036        self.D["ewres_min"] = None
1037        self.D["ewres_max"] = None
1038        self.D["aggregation_type"] = aggregation_type
1039
1040    def set_aggregation_type(self, aggregation_type):
1041        """Set the aggregation type of the dataset (mean, min, max, ...)"""
1042        self.D["aggregation_type"] = aggregation_type
1043
1044    def get_aggregation_type(self):
1045        """Get the aggregation type of the dataset (mean, min, max, ...)
1046           :return: None if not found
1047        """
1048        if "aggregation_type" in self.D:
1049            return self.D["aggregation_type"]
1050        else:
1051            return None
1052
1053    def get_max_min(self):
1054        """Get the minimal maximum of all registered maps,
1055           this value is set in the database
1056           automatically via SQL, so no setter exists
1057           :return: None if not found"""
1058        if "max_min" in self.D:
1059            return self.D["max_min"]
1060        else:
1061            return None
1062
1063    def get_min_min(self):
1064        """Get the minimal minimum of all registered maps,
1065           this value is set in the database
1066           automatically via SQL, so no setter exists
1067           :return: None if not found"""
1068        if "min_min" in self.D:
1069            return self.D["min_min"]
1070        else:
1071            return None
1072
1073    def get_max_max(self):
1074        """Get the maximal maximum of all registered maps,
1075           this value is set in the database
1076           automatically via SQL, so no setter exists
1077           :return: None if not found"""
1078        if "max_max" in self.D:
1079            return self.D["max_max"]
1080        else:
1081            return None
1082
1083    def get_min_max(self):
1084        """Get the maximal minimum of all registered maps,
1085           this value is set in the database
1086           automatically via SQL, so no setter exists
1087           :return: None if not found"""
1088        if "min_max" in self.D:
1089            return self.D["min_max"]
1090        else:
1091            return None
1092
1093    def get_nsres_min(self):
1094        """Get the minimal north-south resolution of all registered maps,
1095           this value is set in the database
1096           automatically via SQL, so no setter exists
1097           :return: None if not found"""
1098        if "nsres_min" in self.D:
1099            return self.D["nsres_min"]
1100        else:
1101            return None
1102
1103    def get_nsres_max(self):
1104        """Get the maximal north-south resolution of all registered maps,
1105           this value is set in the database
1106           automatically via SQL, so no setter exists
1107           :return: None if not found"""
1108        if "nsres_max" in self.D:
1109            return self.D["nsres_max"]
1110        else:
1111            return None
1112
1113    def get_ewres_min(self):
1114        """Get the minimal east-west resolution of all registered maps,
1115           this value is set in the database
1116           automatically via SQL, so no setter exists
1117           :return: None if not found"""
1118        if "ewres_min" in self.D:
1119            return self.D["ewres_min"]
1120        else:
1121            return None
1122
1123    def get_ewres_max(self):
1124        """Get the maximal east-west resolution of all registered maps,
1125           this value is set in the database
1126           automatically via SQL, so no setter exists
1127           :return: None if not found"""
1128        if "ewres_max" in self.D:
1129            return self.D["ewres_max"]
1130        else:
1131            return None
1132
1133    nsres_min = property(fget=get_nsres_min)
1134    nsres_max = property(fget=get_nsres_max)
1135    ewres_min = property(fget=get_ewres_min)
1136    ewres_max = property(fget=get_ewres_max)
1137    min_min = property(fget=get_min_min)
1138    min_max = property(fget=get_min_max)
1139    max_min = property(fget=get_max_min)
1140    max_max = property(fget=get_max_max)
1141    aggregation_type = property(fset=set_aggregation_type,
1142                                fget=get_aggregation_type)
1143
1144    def print_info(self):
1145        """Print information about this class in human readable style"""
1146        #      0123456789012345678901234567890
1147        print(" | North-South resolution min:. " + str(self.get_nsres_min()))
1148        print(" | North-South resolution max:. " + str(self.get_nsres_max()))
1149        print(" | East-west resolution min:... " + str(self.get_ewres_min()))
1150        print(" | East-west resolution max:... " + str(self.get_ewres_max()))
1151        print(" | Minimum value min:.......... " + str(self.get_min_min()))
1152        print(" | Minimum value max:.......... " + str(self.get_min_max()))
1153        print(" | Maximum value min:.......... " + str(self.get_max_min()))
1154        print(" | Maximum value max:.......... " + str(self.get_max_max()))
1155        print(" | Aggregation type:........... " + str(self.get_aggregation_type()))
1156        STDSMetadataBase.print_info(self)
1157
1158    def print_shell_info(self):
1159        """Print information about this class in shell style"""
1160        print("aggregation_type=" + str(self.get_aggregation_type()))
1161        STDSMetadataBase.print_shell_info(self)
1162        print("nsres_min=" + str(self.get_nsres_min()))
1163        print("nsres_max=" + str(self.get_nsres_max()))
1164        print("ewres_min=" + str(self.get_ewres_min()))
1165        print("ewres_max=" + str(self.get_ewres_max()))
1166        print("min_min=" + str(self.get_min_min()))
1167        print("min_max=" + str(self.get_min_max()))
1168        print("max_min=" + str(self.get_max_min()))
1169        print("max_max=" + str(self.get_max_max()))
1170
1171
1172###############################################################################
1173
1174class STRDSMetadata(STDSRasterMetadataBase):
1175    """This is the raster metadata class
1176
1177        This class is the interface to the strds_metadata table in the
1178        temporal database that stores the metadata of all registered
1179        space time raster datasets
1180
1181        Most of the metadata values are set by SQL scripts in the database when
1182        new raster maps are added. Therefor only some set- an many
1183        get-functions are available.
1184
1185        Usage:
1186
1187        .. code-block:: python
1188
1189            >>> init()
1190            >>> meta = STRDSMetadata(ident="soils@PERMANENT",
1191            ... title="Soils", description="Soils 1950 - 2010")
1192            >>> meta.id
1193            'soils@PERMANENT'
1194            >>> meta.title
1195            'Soils'
1196            >>> meta.description
1197            'Soils 1950 - 2010'
1198            >>> meta.number_of_maps
1199            >>> meta.min_max
1200            >>> meta.max_max
1201            >>> meta.min_min
1202            >>> meta.max_min
1203            >>> meta.nsres_min
1204            >>> meta.nsres_max
1205            >>> meta.ewres_min
1206            >>> meta.ewres_max
1207            >>> meta.raster_register
1208            >>> meta.print_info()
1209             +-------------------- Metadata information ----------------------------------+
1210             | Raster register table:...... None
1211             | North-South resolution min:. None
1212             | North-South resolution max:. None
1213             | East-west resolution min:... None
1214             | East-west resolution max:... None
1215             | Minimum value min:.......... None
1216             | Minimum value max:.......... None
1217             | Maximum value min:.......... None
1218             | Maximum value max:.......... None
1219             | Aggregation type:........... None
1220             | Number of registered maps:.. None
1221             |
1222             | Title:
1223             | Soils
1224             | Description:
1225             | Soils 1950 - 2010
1226             | Command history:
1227            >>> meta.print_shell_info()
1228            aggregation_type=None
1229            number_of_maps=None
1230            nsres_min=None
1231            nsres_max=None
1232            ewres_min=None
1233            ewres_max=None
1234            min_min=None
1235            min_max=None
1236            max_min=None
1237            max_max=None
1238            raster_register=None
1239
1240    """
1241    def __init__(self, ident=None, raster_register=None, title=None,
1242                 description=None):
1243
1244        STDSRasterMetadataBase.__init__(
1245            self, "strds_metadata", ident, title, description)
1246
1247        self.set_raster_register(raster_register)
1248
1249    def set_raster_register(self, raster_register):
1250        """Set the raster map register table name"""
1251        self.D["raster_register"] = raster_register
1252
1253    def get_raster_register(self):
1254        """Get the raster map register table name
1255           :return: None if not found"""
1256        if "raster_register" in self.D:
1257            return self.D["raster_register"]
1258        else:
1259            return None
1260
1261    raster_register = property(fget=get_raster_register,
1262                               fset=set_raster_register)
1263
1264    def print_info(self):
1265        """Print information about this class in human readable style"""
1266        print(" +-------------------- Metadata information ----------------------------------+")
1267        #      0123456789012345678901234567890
1268        print(" | Raster register table:...... " + str(
1269            self.get_raster_register()))
1270        STDSRasterMetadataBase.print_info(self)
1271
1272    def print_shell_info(self):
1273        """Print information about this class in shell style"""
1274        STDSRasterMetadataBase.print_shell_info(self)
1275        print("raster_register=" + str(self.get_raster_register()))
1276
1277###############################################################################
1278
1279
1280class STR3DSMetadata(STDSRasterMetadataBase):
1281    """This is the space time 3D raster metadata class
1282
1283        This class is the interface to the str3ds_metadata table in the
1284        temporal database that stores the metadata of all registered
1285        space time 3D raster datasets
1286
1287        Most of the metadata values are set by SQL scripts in the database when
1288        new 3D raster maps are added. Therefor only some set- an many
1289        get-functions are available.
1290
1291        Usage:
1292
1293        .. code-block:: python
1294
1295            >>> init()
1296            >>> meta = STR3DSMetadata(ident="soils@PERMANENT",
1297            ... title="Soils", description="Soils 1950 - 2010")
1298            >>> meta.id
1299            'soils@PERMANENT'
1300            >>> meta.title
1301            'Soils'
1302            >>> meta.description
1303            'Soils 1950 - 2010'
1304            >>> meta.number_of_maps
1305            >>> meta.min_max
1306            >>> meta.max_max
1307            >>> meta.min_min
1308            >>> meta.max_min
1309            >>> meta.nsres_min
1310            >>> meta.nsres_max
1311            >>> meta.ewres_min
1312            >>> meta.ewres_max
1313            >>> meta.tbres_min
1314            >>> meta.tbres_max
1315            >>> meta.raster3d_register
1316            >>> meta.print_info()
1317             +-------------------- Metadata information ----------------------------------+
1318             | 3D raster register table:... None
1319             | Top-bottom resolution min:.. None
1320             | Top-bottom resolution max:.. None
1321             | North-South resolution min:. None
1322             | North-South resolution max:. None
1323             | East-west resolution min:... None
1324             | East-west resolution max:... None
1325             | Minimum value min:.......... None
1326             | Minimum value max:.......... None
1327             | Maximum value min:.......... None
1328             | Maximum value max:.......... None
1329             | Aggregation type:........... None
1330             | Number of registered maps:.. None
1331             |
1332             | Title:
1333             | Soils
1334             | Description:
1335             | Soils 1950 - 2010
1336             | Command history:
1337            >>> meta.print_shell_info()
1338            aggregation_type=None
1339            number_of_maps=None
1340            nsres_min=None
1341            nsres_max=None
1342            ewres_min=None
1343            ewres_max=None
1344            min_min=None
1345            min_max=None
1346            max_min=None
1347            max_max=None
1348            tbres_min=None
1349            tbres_max=None
1350            raster3d_register=None
1351
1352        """
1353    def __init__(self, ident=None, raster3d_register=None, title=None,
1354                 description=None):
1355
1356        STDSRasterMetadataBase.__init__(
1357            self, "str3ds_metadata", ident, title, description)
1358
1359        self.set_raster3d_register(raster3d_register)
1360        self.D["tbres_min"] = None
1361        self.D["tbres_max"] = None
1362
1363    def set_raster3d_register(self, raster3d_register):
1364        """Set the raster map register table name"""
1365        self.D["raster3d_register"] = raster3d_register
1366
1367    def get_raster3d_register(self):
1368        """Get the raster3d map register table name
1369           :return: None if not found"""
1370        if "raster3d_register" in self.D:
1371            return self.D["raster3d_register"]
1372        else:
1373            return None
1374
1375    def get_tbres_min(self):
1376        """Get the minimal top-bottom resolution of all registered maps,
1377           this value is set in the database
1378           automatically via SQL, so no setter exists
1379           :return: None if not found"""
1380        if "tbres_min" in self.D:
1381            return self.D["tbres_min"]
1382        else:
1383            return None
1384
1385    def get_tbres_max(self):
1386        """Get the maximal top-bottom resolution of all registered maps,
1387           this value is set in the database
1388           automatically via SQL, so no setter exists
1389           :return: None if not found"""
1390        if "tbres_max" in self.D:
1391            return self.D["tbres_max"]
1392        else:
1393            return None
1394
1395    raster3d_register = property(fget=get_raster3d_register,
1396                                 fset=set_raster3d_register)
1397    tbres_min = property(fget=get_tbres_min)
1398    tbres_max = property(fget=get_tbres_max)
1399
1400    def print_info(self):
1401        """Print information about this class in human readable style"""
1402        print(" +-------------------- Metadata information ----------------------------------+")
1403        #      0123456789012345678901234567890
1404        #      0123456789012345678901234567890
1405        print(" | 3D raster register table:... " + str(
1406            self.get_raster3d_register()))
1407        print(" | Top-bottom resolution min:.. " + str(self.get_ewres_min()))
1408        print(" | Top-bottom resolution max:.. " + str(self.get_ewres_max()))
1409        STDSRasterMetadataBase.print_info(self)
1410
1411    def print_shell_info(self):
1412        """Print information about this class in shell style"""
1413        STDSRasterMetadataBase.print_shell_info(self)
1414        print("tbres_min=" + str(self.get_tbres_min()))
1415        print("tbres_max=" + str(self.get_tbres_max()))
1416        print("raster3d_register=" + str(self.get_raster3d_register()))
1417
1418###############################################################################
1419
1420
1421class STVDSMetadata(STDSMetadataBase):
1422    """This is the space time vector dataset metadata class
1423
1424       This class is the interface to the stvds_metadata table in the
1425       temporal database that stores the metadata of all registered
1426       space time vector datasets
1427
1428       Most of the metadata values are set by SQL scripts in the database when
1429       new vector maps are added. Therefor only some set- an many get-functions
1430       are available.
1431
1432        Usage:
1433
1434        .. code-block:: python
1435
1436            >>> init()
1437            >>> meta = STVDSMetadata(ident="lidars@PERMANENT",
1438            ... title="LIDARS", description="LIDARS 2008 - 2010")
1439            >>> meta.id
1440            'lidars@PERMANENT'
1441            >>> meta.title
1442            'LIDARS'
1443            >>> meta.description
1444            'LIDARS 2008 - 2010'
1445            >>> meta.number_of_maps
1446            >>> meta.number_of_points
1447            >>> meta.number_of_lines
1448            >>> meta.number_of_boundaries
1449            >>> meta.number_of_centroids
1450            >>> meta.number_of_faces
1451            >>> meta.number_of_kernels
1452            >>> meta.number_of_primitives
1453            >>> meta.number_of_nodes
1454            >>> meta.number_of_areas
1455            >>> meta.number_of_islands
1456            >>> meta.number_of_holes
1457            >>> meta.number_of_volumes
1458            >>> meta.print_info()
1459             +-------------------- Metadata information ----------------------------------+
1460             | Vector register table:...... None
1461             | Number of points ........... None
1462             | Number of lines ............ None
1463             | Number of boundaries ....... None
1464             | Number of centroids ........ None
1465             | Number of faces ............ None
1466             | Number of kernels .......... None
1467             | Number of primitives ....... None
1468             | Number of nodes ............ None
1469             | Number of areas ............ None
1470             | Number of islands .......... None
1471             | Number of holes ............ None
1472             | Number of volumes .......... None
1473             | Number of registered maps:.. None
1474             |
1475             | Title:
1476             | LIDARS
1477             | Description:
1478             | LIDARS 2008 - 2010
1479             | Command history:
1480            >>> meta.print_shell_info()
1481            number_of_maps=None
1482            vector_register=None
1483            points=None
1484            lines=None
1485            boundaries=None
1486            centroids=None
1487            faces=None
1488            kernels=None
1489            primitives=None
1490            nodes=None
1491            areas=None
1492            islands=None
1493            holes=None
1494            volumes=None
1495
1496    """
1497    def __init__(self, ident=None, vector_register=None, title=None,
1498                 description=None):
1499
1500        STDSMetadataBase.__init__(
1501            self, "stvds_metadata", ident, title, description)
1502
1503        self.set_vector_register(vector_register)
1504        self.D["points"] = None
1505        self.D["lines"] = None
1506        self.D["boundaries"] = None
1507        self.D["centroids"] = None
1508        self.D["faces"] = None
1509        self.D["kernels"] = None
1510        self.D["primitives"] = None
1511        self.D["nodes"] = None
1512        self.D["areas"] = None
1513        self.D["islands"] = None
1514        self.D["holes"] = None
1515        self.D["volumes"] = None
1516
1517    def set_vector_register(self, vector_register):
1518        """Set the vector map register table name"""
1519        self.D["vector_register"] = vector_register
1520
1521    def get_vector_register(self):
1522        """Get the vector map register table name
1523           :return: None if not found"""
1524        if "vector_register" in self.D:
1525            return self.D["vector_register"]
1526        else:
1527            return None
1528
1529    def get_number_of_points(self):
1530        """Get the number of points of all registered maps,
1531           this value is set in the database
1532           automatically via SQL, so no setter exists
1533           :return: None if not found"""
1534        if "points" in self.D:
1535            return self.D["points"]
1536        else:
1537            return None
1538
1539    def get_number_of_lines(self):
1540        """Get the number of lines of all registered maps,
1541           this value is set in the database
1542           automatically via SQL, so no setter exists
1543           :return: None if not found"""
1544        if "lines" in self.D:
1545            return self.D["lines"]
1546        else:
1547            return None
1548
1549    def get_number_of_boundaries(self):
1550        """Get the number of boundaries of all registered maps,
1551           this value is set in the database
1552           automatically via SQL, so no setter exists
1553           :return: None if not found"""
1554        if "boundaries" in self.D:
1555            return self.D["boundaries"]
1556        else:
1557            return None
1558
1559    def get_number_of_centroids(self):
1560        """Get the number of centroids of all registered maps,
1561           this value is set in the database
1562           automatically via SQL, so no setter exists
1563           :return: None if not found"""
1564        if "centroids" in self.D:
1565            return self.D["centroids"]
1566        else:
1567            return None
1568
1569    def get_number_of_faces(self):
1570        """Get the number of faces of all registered maps,
1571           this value is set in the database
1572           automatically via SQL, so no setter exists
1573           :return: None if not found"""
1574        if "faces" in self.D:
1575            return self.D["faces"]
1576        else:
1577            return None
1578
1579    def get_number_of_kernels(self):
1580        """Get the number of kernels of all registered maps,
1581           this value is set in the database
1582           automatically via SQL, so no setter exists
1583           :return: None if not found"""
1584        if "kernels" in self.D:
1585            return self.D["kernels"]
1586        else:
1587            return None
1588
1589    def get_number_of_primitives(self):
1590        """Get the number of primitives of all registered maps,
1591           this value is set in the database
1592           automatically via SQL, so no setter exists
1593           :return: None if not found"""
1594        if "primitives" in self.D:
1595            return self.D["primitives"]
1596        else:
1597            return None
1598
1599    def get_number_of_nodes(self):
1600        """Get the number of nodes of all registered maps,
1601           this value is set in the database
1602           automatically via SQL, so no setter exists
1603           :return: None if not found"""
1604        if "nodes" in self.D:
1605            return self.D["nodes"]
1606        else:
1607            return None
1608
1609    def get_number_of_areas(self):
1610        """Get the number of areas of all registered maps,
1611           this value is set in the database
1612           automatically via SQL, so no setter exists
1613           :return: None if not found"""
1614        if "areas" in self.D:
1615            return self.D["areas"]
1616        else:
1617            return None
1618
1619    def get_number_of_islands(self):
1620        """Get the number of islands of all registered maps,
1621           this value is set in the database
1622           automatically via SQL, so no setter exists
1623           :return: None if not found"""
1624        if "islands" in self.D:
1625            return self.D["islands"]
1626        else:
1627            return None
1628
1629    def get_number_of_holes(self):
1630        """Get the number of holes of all registered maps,
1631           this value is set in the database
1632           automatically via SQL, so no setter exists
1633           :return: None if not found"""
1634        if "holes" in self.D:
1635            return self.D["holes"]
1636        else:
1637            return None
1638
1639    def get_number_of_volumes(self):
1640        """Get the number of volumes of all registered maps,
1641           this value is set in the database
1642           automatically via SQL, so no setter exists
1643           :return: None if not found"""
1644        if "volumes" in self.D:
1645            return self.D["volumes"]
1646        else:
1647            return None
1648
1649    # Set the properties
1650    vector_register = property(fget=get_vector_register,
1651                               fset=set_vector_register)
1652    number_of_points = property(fget=get_number_of_points)
1653    number_of_lines = property(fget=get_number_of_lines)
1654    number_of_boundaries = property(fget=get_number_of_boundaries)
1655    number_of_centroids = property(fget=get_number_of_centroids)
1656    number_of_faces = property(fget=get_number_of_faces)
1657    number_of_kernels = property(fget=get_number_of_kernels)
1658    number_of_primitives = property(fget=get_number_of_primitives)
1659    number_of_nodes = property(fget=get_number_of_nodes)
1660    number_of_areas = property(fget=get_number_of_areas)
1661    number_of_islands = property(fget=get_number_of_islands)
1662    number_of_holes = property(fget=get_number_of_holes)
1663    number_of_volumes = property(fget=get_number_of_volumes)
1664
1665    def print_info(self):
1666        """Print information about this class in human readable style"""
1667        print(" +-------------------- Metadata information ----------------------------------+")
1668        #      0123456789012345678901234567890
1669        print(" | Vector register table:...... " + str(
1670            self.get_vector_register()))
1671        print(" | Number of points ........... " + str(self.number_of_points))
1672        print(" | Number of lines ............ " + str(self.number_of_lines))
1673        print(" | Number of boundaries ....... " + str(self.number_of_boundaries))
1674        print(" | Number of centroids ........ " + str(self.number_of_centroids))
1675        print(" | Number of faces ............ " + str(self.number_of_faces))
1676        print(" | Number of kernels .......... " + str(self.number_of_kernels))
1677        print(" | Number of primitives ....... " + str(self.number_of_primitives))
1678        print(" | Number of nodes ............ " + str(self.number_of_nodes))
1679        print(" | Number of areas ............ " + str(self.number_of_areas))
1680        print(" | Number of islands .......... " + str(self.number_of_islands))
1681        print(" | Number of holes ............ " + str(self.number_of_holes))
1682        print(" | Number of volumes .......... " + str(self.number_of_volumes))
1683        STDSMetadataBase.print_info(self)
1684
1685    def print_shell_info(self):
1686        """Print information about this class in shell style"""
1687        STDSMetadataBase.print_shell_info(self)
1688        print("vector_register=" + str(self.get_vector_register()))
1689        print("points=" + str(self.get_number_of_points()))
1690        print("lines=" + str(self.get_number_of_lines()))
1691        print("boundaries=" + str(self.get_number_of_boundaries()))
1692        print("centroids=" + str(self.get_number_of_centroids()))
1693        print("faces=" + str(self.get_number_of_faces()))
1694        print("kernels=" + str(self.get_number_of_kernels()))
1695        print("primitives=" + str(self.get_number_of_primitives()))
1696        print("nodes=" + str(self.get_number_of_nodes()))
1697        print("areas=" + str(self.get_number_of_areas()))
1698        print("islands=" + str(self.get_number_of_islands()))
1699        print("holes=" + str(self.get_number_of_holes()))
1700        print("volumes=" + str(self.get_number_of_volumes()))
1701
1702###############################################################################
1703
1704if __name__ == "__main__":
1705    import doctest
1706    doctest.testmod()
1707