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