stream_vector.c 11 KB

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