1with AdaBase;
2with Connect;
3with CommonText;
4with Ada.Text_IO;
5with AdaBase.Results.Sets;
6with Spatial_Data;
7
8procedure Spatial3 is
9
10   package CON renames Connect;
11   package TIO renames Ada.Text_IO;
12   package ARS renames AdaBase.Results.Sets;
13   package CT  renames CommonText;
14   package SD  renames Spatial_Data;
15
16   procedure print_wkt   (GM : SD.Geometry; cn, wkt : String);
17   procedure print_point (point : SD.Geometric_Point; label : String);
18
19   procedure print_wkt (GM : SD.Geometry; cn, wkt : String) is
20   begin
21      TIO.Put_Line ("");
22      TIO.Put_Line ("Column Name : " & cn);
23      TIO.Put_Line ("Geo subtype : " & SD.type_of_collection (GM)'Img);
24      TIO.Put_Line ("WKT value   : " & wkt);
25   end print_wkt;
26
27   procedure print_point (point : SD.Geometric_Point; label : String) is
28   begin
29      TIO.Put_Line ("X=" & point.X'Img & " (" & label & ")");
30      TIO.Put_Line ("Y=" & point.Y'Img);
31   end print_point;
32
33begin
34
35   CON.connect_database;
36
37   declare
38      sql  : constant String := "SELECT * FROM spatial_plus";
39      stmt : CON.Stmt_Type := CON.DR.query (sql);
40      row  : ARS.Datarow := stmt.fetch_next;
41
42      PT   : constant String := "sp_point";
43      LN   : constant String := "sp_linestring";
44      PG   : constant String := "sp_polygon";
45      MP   : constant String := "sp_multi_point";
46      ML   : constant String := "sp_multi_line_string";
47      MPG  : constant String := "sp_multi_polygon";
48      GC   : constant String := "sp_geo_collection";
49   begin
50
51      TIO.Put_Line ("Demonstrate direct geometry retrieval and manipulation");
52
53      --  Point
54      print_wkt (row.column (PT).as_geometry, PT, row.column (PT).as_string);
55      print_point (SD.retrieve_point (row.column (PT).as_geometry), PT);
56
57      --  Line
58      print_wkt (row.column (LN).as_geometry, LN, row.column (LN).as_string);
59      declare
60         LNS : SD.Geometric_Line_String :=
61            SD.retrieve_line (row.column (LN).as_geometry);
62      begin
63         for component in LNS'Range loop
64            print_point (LNS (component), LN & component'Img);
65         end loop;
66      end;
67
68      --  Polygon
69      print_wkt (row.column (PG).as_geometry, PG, row.column (PG).as_string);
70      declare
71         PG1 : SD.Geometric_Polygon :=
72            SD.retrieve_polygon (row.column (PG).as_geometry);
73         ring_count : Natural := SD.number_of_rings (PG1);
74      begin
75         for Ring_ID in 1 .. ring_count loop
76            declare
77               RG : SD.Geometric_Ring := SD.retrieve_ring (PG1, Ring_ID);
78               SZ : Natural := RG'Length;
79            begin
80               TIO.Put_Line ("Ring#" & Ring_ID'Img);
81               for component in 1 .. SZ loop
82                  print_point (RG (component), "point" & component'Img);
83               end loop;
84            end;
85         end loop;
86      end;
87
88      --  Multi-Point
89      declare
90         GM  : SD.Geometry := row.column (MP).as_geometry;
91         SZ  : Natural := SD.size_of_collection (GM);
92      begin
93         print_wkt (GM, MP, row.column (MP).as_string);
94         for component in 1 .. SZ loop
95            print_point (SD.retrieve_point (GM, component),
96                         "Multipoint#" & component'Img);
97         end loop;
98      end;
99
100      --  Multi-Line
101      declare
102         GM  : SD.Geometry := row.column (ML).as_geometry;
103         SZ  : Natural := SD.size_of_collection (GM);
104      begin
105         print_wkt (GM, ML, row.column (ML).as_string);
106         for component in 1 .. SZ loop
107            declare
108               --  extract line string type
109               SLS : SD.Geometric_Line_String :=
110                     SD.retrieve_line (GM, component);
111               --  convert to a simple geometry type
112               NGM : SD.Geometry := SD.initialize_as_line (SLS);
113            begin
114               TIO.Put_Line ("line#" & component'Img & ": " &
115                  SD.Well_Known_Text (NGM));
116            end;
117         end loop;
118      end;
119
120      --  Multi-Polygon
121      declare
122         GM  : SD.Geometry := row.column (MPG).as_geometry;
123         SZ  : Natural := SD.size_of_collection (GM);
124      begin
125         print_wkt (GM, MPG, row.column (MPG).as_string);
126         for component in 1 .. SZ loop
127            declare
128               --  extract single polygon
129               SPG : SD.Geometric_Polygon :=
130                     SD.retrieve_polygon (GM, component);
131               --  convert to a simple geometry type
132               NGM : SD.Geometry := SD.initialize_as_polygon (SPG);
133               num_rings : Natural := SD.number_of_rings (SPG);
134            begin
135               TIO.Put_Line ("polygon#" & component'Img & ": " &
136                  SD.Well_Known_Text (NGM));
137               for ring in 2 .. num_rings loop
138                  declare
139                     IR : SD.Geometric_Ring := SD.retrieve_ring (SPG, ring);
140                     newpoly : SD.Geometric_Polygon := SD.start_polygon (IR);
141                  begin
142                     TIO.Put_Line ("Inner ring" & Integer (ring - 1)'Img &
143                        " of polygon" & component'Img & " : " &
144                        SD.Well_Known_Text
145                           (SD.initialize_as_polygon (newpoly)));
146                  end;
147               end loop;
148            end;
149         end loop;
150      end;
151
152      --  Geometry Collection
153      declare
154         GM  : SD.Geometry := row.column (GC).as_geometry;
155         SZ  : Natural := SD.size_of_collection (GM);
156      begin
157         TIO.Put_Line ("");
158         TIO.Put_Line ("Column Name : " & GC);
159         TIO.Put_Line ("Geo subtype : " & SD.type_of_collection (GM)'Img);
160         TIO.Put_Line ("Number of elements in collection :" & SZ'Img);
161         for component in 1 .. SZ loop
162            declare
163               NGM : SD.Geometry := SD.retrieve_subcollection (GM, component);
164               SZC : Natural := SD.size_of_collection (NGM);
165            begin
166               TIO.Put_Line ("");
167               TIO.Put_Line ("Element" & component'Img & " type : " &
168                  SD.collection_item_type (GM, component)'Img);
169               TIO.Put_Line ("Element" & component'Img & " size : " &
170                  CT.int2str (SZC));
171               TIO.Put_Line ("Element" & component'Img & " wkt  : " &
172                  SD.Well_Known_Text (NGM));
173            end;
174         end loop;
175      end;
176   end;
177   CON.DR.disconnect;
178
179end Spatial3;
180