stream_vector.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. #include "local_proto.h"
  2. int create_sector_vector(char *out_vector, int number_of_streams, int radians)
  3. {
  4. int i, j, k;
  5. int r, c, d;
  6. int start, stop;
  7. float northing, easting;
  8. struct Map_info Out;
  9. struct line_pnts *Segments;
  10. struct line_cats *Cats;
  11. STREAM *SA = stream_attributes; /* for better code readability */
  12. struct field_info *Fi;
  13. dbString table_name, db_sql, val_string;
  14. dbDriver *driver;
  15. dbHandle handle;
  16. char *cat_col_name = "cat";
  17. char buf[1000];
  18. int sector_category, segment, sector, order;
  19. double direction, azimuth, length, stright, sinusoid;
  20. double elev_min, elev_max, drop, gradient;
  21. Segments = Vect_new_line_struct();
  22. Cats = Vect_new_cats_struct();
  23. if (Vect_open_new(&Out, out_vector, 0) < 0)
  24. G_fatal_error(_("Unable to create vector map <%s>"), out_vector);
  25. Vect_reset_line(Segments);
  26. Vect_reset_cats(Cats);
  27. for (i = 1; i < number_of_streams; ++i) {
  28. stop = 1;
  29. for (j = 0; j < SA[i].number_of_sectors; ++j) {
  30. start = stop;
  31. stop = (j == SA[i].number_of_sectors - 1) ?
  32. SA[i].sector_breakpoints[j] +
  33. 1 : SA[i].sector_breakpoints[j] + 1;
  34. Vect_cat_set(Cats, 1, SA[i].sector_cats[j]);
  35. for (k = start; k <= stop; ++k) {
  36. if (SA[i].points[k] == -1) {
  37. d = abs(SA[i].last_cell_dir);
  38. r = NR(d);
  39. c = NC(d);
  40. }
  41. else {
  42. r = (int)SA[i].points[k] / ncols;
  43. c = (int)SA[i].points[k] % ncols;
  44. }
  45. easting = window.west + (c + .5) * window.ew_res;
  46. northing = window.north - (r + .5) * window.ns_res;
  47. Vect_append_point(Segments, easting, northing, 0);
  48. }
  49. Vect_write_line(&Out, GV_LINE, Segments, Cats);
  50. Vect_reset_line(Segments);
  51. Vect_reset_cats(Cats);
  52. }
  53. }
  54. /* add attributes */
  55. db_init_string(&db_sql);
  56. db_init_string(&val_string);
  57. db_init_string(&table_name);
  58. db_init_handle(&handle);
  59. Fi = Vect_default_field_info(&Out, 1, NULL, GV_1TABLE);
  60. driver = db_start_driver_open_database(Fi->driver, Fi->database);
  61. if (driver == NULL) {
  62. G_fatal_error(_("Unable to start driver <%s>"), Fi->driver);
  63. }
  64. /* create table */
  65. sprintf(buf, "create table %s (%s integer, "
  66. "segment integer, "
  67. "sector integer, "
  68. "s_order integer, "
  69. "direction double precision, "
  70. "azimuth double precision, "
  71. "length double precision, "
  72. "stright double precision, "
  73. "sinusoid double precision, "
  74. "elev_min double precision, "
  75. "elev_max double precision, "
  76. "s_drop double precision, "
  77. "gradient double precision)", Fi->table, cat_col_name);
  78. db_set_string(&db_sql, buf);
  79. if (db_execute_immediate(driver, &db_sql) != DB_OK) {
  80. db_close_database(driver);
  81. db_shutdown_driver(driver);
  82. G_fatal_error(_("Unable to create table: '%s'"), db_get_string(&db_sql));
  83. }
  84. if (db_create_index2(driver, Fi->table, cat_col_name) != DB_OK)
  85. G_warning(_("Unable to create create index on table <%s>"), Fi->table);
  86. if (db_grant_on_table(driver, Fi->table,
  87. DB_PRIV_SELECT, DB_GROUP | DB_PUBLIC) != DB_OK)
  88. G_fatal_error(_("Unable to grant privileges on table <%s>"), Fi->table);
  89. db_begin_transaction(driver);
  90. for (i = 1; i < number_of_streams; ++i) {
  91. stop = 1;
  92. for (j = 0; j < SA[i].number_of_sectors; ++j) {
  93. start = stop;
  94. stop = SA[i].sector_breakpoints[j];
  95. /* calculate and add parameters */
  96. sector_category = SA[i].sector_cats[j];
  97. segment = SA[i].stream;
  98. sector = j + 1;
  99. order = SA[i].order;
  100. direction = SA[i].sector_directions[j];
  101. azimuth = direction <= PI ? direction : direction - PI;
  102. length = SA[i].sector_lengths[j];
  103. stright = SA[i].sector_strights[j];
  104. sinusoid = length / stright;
  105. elev_max = SA[i].elevation[start];
  106. elev_min = SA[i].elevation[stop];
  107. drop = elev_max - elev_min;
  108. gradient = drop / length;
  109. if (!radians) {
  110. direction = RAD2DEG(direction);
  111. azimuth = RAD2DEG(azimuth);
  112. }
  113. sprintf(buf, "insert into %s values( %d, %d, %d, %d, "
  114. "%f, %f, %f, %f, %f, "
  115. "%f, %f, %f, %f)", Fi->table, sector_category, segment, sector, order, /*4 */
  116. direction, azimuth, length, stright, sinusoid, /*9 */
  117. elev_max, elev_min, drop, gradient); /*13 */
  118. db_set_string(&db_sql, buf);
  119. if (db_execute_immediate(driver, &db_sql) != DB_OK) {
  120. db_close_database(driver);
  121. db_shutdown_driver(driver);
  122. G_fatal_error(_("Unable to inset new row: '%s'"),
  123. db_get_string(&db_sql));
  124. }
  125. }
  126. }
  127. db_commit_transaction(driver);
  128. db_close_database_shutdown_driver(driver);
  129. Vect_map_add_dblink(&Out, 1, NULL, Fi->table,
  130. cat_col_name, Fi->database, Fi->driver);
  131. Vect_hist_command(&Out);
  132. Vect_build(&Out);
  133. Vect_close(&Out);
  134. return 0;
  135. }
  136. int create_segment_vector(char *out_vector, int number_of_streams,
  137. int radians)
  138. {
  139. int i, k;
  140. int r, c, d;
  141. float northing, easting;
  142. struct Map_info Out;
  143. struct line_pnts *Segments;
  144. struct line_cats *Cats;
  145. STREAM *SA = stream_attributes; /* for better code readability */
  146. struct field_info *Fi;
  147. dbString table_name, db_sql, val_string;
  148. dbDriver *driver;
  149. dbHandle handle;
  150. char *cat_col_name = "cat";
  151. char buf[1000];
  152. /* variables to store table attributes */
  153. int last;
  154. int segment, next_segment, order, next_order;
  155. double direction, azimuth, length, stright, sinusoid;
  156. double elev_min, elev_max, drop, gradient;
  157. double out_direction, out_azimuth, out_length, out_drop, out_gradient;
  158. double tangent_dir, tangent_azimuth, next_direction, next_azimuth;
  159. Segments = Vect_new_line_struct();
  160. Cats = Vect_new_cats_struct();
  161. if (Vect_open_new(&Out, out_vector, 0) < 0)
  162. G_fatal_error(_("Unable to create vector map <%s>"), out_vector);
  163. Vect_reset_line(Segments);
  164. Vect_reset_cats(Cats);
  165. for (i = 1; i < number_of_streams; ++i) {
  166. Vect_cat_set(Cats, 1, SA[i].stream);
  167. for (k = 1; k < SA[i].number_of_cells; ++k) {
  168. if (SA[i].points[k] == -1) {
  169. d = abs(SA[i].last_cell_dir);
  170. r = NR(d);
  171. c = NC(d);
  172. }
  173. else {
  174. r = (int)SA[i].points[k] / ncols;
  175. c = (int)SA[i].points[k] % ncols;
  176. }
  177. easting = window.west + (c + .5) * window.ew_res;
  178. northing = window.north - (r + .5) * window.ns_res;
  179. Vect_append_point(Segments, easting, northing, 0);
  180. }
  181. Vect_write_line(&Out, GV_LINE, Segments, Cats);
  182. Vect_reset_line(Segments);
  183. Vect_reset_cats(Cats);
  184. }
  185. /* add attributes */
  186. db_init_string(&db_sql);
  187. db_init_string(&val_string);
  188. db_init_string(&table_name);
  189. db_init_handle(&handle);
  190. Fi = Vect_default_field_info(&Out, 1, NULL, GV_1TABLE);
  191. driver = db_start_driver_open_database(Fi->driver, Fi->database);
  192. if (driver == NULL) {
  193. G_fatal_error(_("Unable to start driver <%s>"), Fi->driver);
  194. }
  195. /* create table */
  196. sprintf(buf, "create table %s (%s integer, "
  197. "segment integer, "
  198. "next_segment integer, "
  199. "s_order integer, "
  200. "next_order integer, "
  201. "direction double precision, "
  202. "azimuth double precision, "
  203. "length double precision, "
  204. "stright double precision, "
  205. "sinusoid double precision, "
  206. "elev_min double precision, "
  207. "elev_max double precision, "
  208. "s_drop double precision, "
  209. "gradient double precision, "
  210. "out_direction double precision, "
  211. "out_azimuth double precision, "
  212. "out_length double precision, "
  213. "out_drop double precision, "
  214. "out_gradient double precision, "
  215. "tangent_dir double precision, "
  216. "tangent_azimuth double precision, "
  217. "next_direction double precision, "
  218. "next_azimuth double precision)", Fi->table, cat_col_name);
  219. db_set_string(&db_sql, buf);
  220. if (db_execute_immediate(driver, &db_sql) != DB_OK) {
  221. db_close_database(driver);
  222. db_shutdown_driver(driver);
  223. G_fatal_error(_("Unable to create table '%s'"), db_get_string(&db_sql));
  224. }
  225. if (db_create_index2(driver, Fi->table, cat_col_name) != DB_OK)
  226. G_warning(_("Unable to create index on table <%s>"), Fi->table);
  227. if (db_grant_on_table(driver, Fi->table,
  228. DB_PRIV_SELECT, DB_GROUP | DB_PUBLIC) != DB_OK)
  229. G_fatal_error(_("Unable grant privileges on table <%s>"), Fi->table);
  230. db_begin_transaction(driver);
  231. for (i = 1; i < number_of_streams; ++i) {
  232. /* calculate and add parameters */
  233. segment = SA[i].stream;
  234. next_segment = SA[i].next_stream;
  235. order = SA[i].order;
  236. next_order = next_segment == -1 ? -1 : SA[next_segment].order;
  237. direction = SA[i].direction;
  238. azimuth = direction <= PI ? direction : direction - PI;
  239. length = SA[i].length;
  240. stright = SA[i].stright;
  241. sinusoid = length / stright;
  242. elev_max = SA[i].elevation[1];
  243. elev_min = SA[i].elevation[SA[i].number_of_cells - 1];
  244. drop = SA[i].drop;
  245. gradient = drop / length;
  246. last = SA[i].number_of_sectors - 1;
  247. out_direction = SA[i].sector_directions[last];
  248. out_azimuth =
  249. out_direction <= PI ? out_direction : out_direction - PI;
  250. out_length = SA[i].sector_lengths[last];
  251. out_drop = SA[i].sector_drops[last];
  252. out_gradient = out_drop / out_length;
  253. tangent_dir = SA[i].tangent;
  254. tangent_azimuth = tangent_dir <= PI ? tangent_dir : tangent_dir - PI;
  255. next_direction = SA[i].continuation;
  256. next_azimuth =
  257. next_direction <= PI ? next_direction : next_direction - PI;
  258. if (!radians) {
  259. direction = RAD2DEG(direction);
  260. azimuth = RAD2DEG(azimuth);
  261. out_direction = RAD2DEG(out_direction);
  262. out_azimuth = RAD2DEG(out_azimuth);
  263. tangent_dir = RAD2DEG(tangent_dir);
  264. tangent_azimuth = RAD2DEG(tangent_azimuth);
  265. next_direction = RAD2DEG(next_direction);
  266. next_azimuth = RAD2DEG(next_azimuth);
  267. }
  268. sprintf(buf, "insert into %s values( %d, %d, %d, %d, %d, "
  269. "%f, %f, %f, %f, %f, "
  270. "%f, %f, %f, %f, "
  271. "%f, %f, %f, %f, %f, "
  272. "%f, %f, %f, %f)", Fi->table, i, segment, next_segment, order, next_order, /*5 */
  273. direction, azimuth, length, stright, sinusoid, /*10 */
  274. elev_max, elev_min, drop, gradient, /*14 */
  275. out_direction, out_azimuth, out_length, out_drop, out_gradient, /*19 */
  276. tangent_dir, tangent_azimuth, next_direction, next_azimuth); /*23 */
  277. db_set_string(&db_sql, buf);
  278. if (db_execute_immediate(driver, &db_sql) != DB_OK) {
  279. db_close_database(driver);
  280. db_shutdown_driver(driver);
  281. G_fatal_error(_("Unable to insert new row: '%s'"),
  282. db_get_string(&db_sql));
  283. }
  284. }
  285. db_commit_transaction(driver);
  286. db_close_database_shutdown_driver(driver);
  287. Vect_map_add_dblink(&Out, 1, NULL, Fi->table,
  288. cat_col_name, Fi->database, Fi->driver);
  289. Vect_hist_command(&Out);
  290. Vect_build(&Out);
  291. Vect_close(&Out);
  292. return 0;
  293. }