vector.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. /*!
  2. \file vector.c
  3. \brief Vector subroutines
  4. (C) 2008, 2010-2011 by the GRASS Development Team
  5. This program is free software under the GNU General Public
  6. License (>=v2). Read the file COPYING that comes with GRASS
  7. for details.
  8. \author Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
  9. */
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <grass/vector.h>
  13. #include <grass/dbmi.h>
  14. #include <grass/glocale.h>
  15. #include "local_proto.h"
  16. static int load_vectors(const struct Option *, const struct Option *,
  17. const struct Option *, const struct Option *, int, nv_data *);
  18. /*!
  19. \brief Load vector maps (lines)
  20. \param params module parameters
  21. \param data nviz data
  22. \return number of loaded vectors
  23. */
  24. int load_vlines(const struct GParams *params, nv_data * data)
  25. {
  26. return load_vectors(params->elev_map, params->elev_const,
  27. params->vlines, params->vline_pos,
  28. MAP_OBJ_VECT, data);
  29. }
  30. /*!
  31. \brief Load vector maps (points)
  32. \param params module parameters
  33. \param data nviz data
  34. \return number of loaded vectors
  35. */
  36. int load_vpoints(const struct GParams *params, nv_data * data)
  37. {
  38. return load_vectors(params->elev_map, params->elev_const,
  39. params->vpoints, params->vpoint_pos,
  40. MAP_OBJ_SITE, data);
  41. }
  42. int load_vectors(const struct Option *elev_map,
  43. const struct Option *elev_const, const struct Option *vect,
  44. const struct Option *position,
  45. int map_obj_type, nv_data * data)
  46. {
  47. int i, id;
  48. int nvects;
  49. const char *mapset;
  50. double x, y, z;
  51. if ((!elev_map->answer || elev_const->answer) && GS_num_surfs() == 0) { /* load base surface if no loaded */
  52. int *surf_list, nsurf;
  53. Nviz_new_map_obj(MAP_OBJ_SURF, NULL, 0.0, data);
  54. surf_list = GS_get_surf_list(&nsurf);
  55. GS_set_att_const(surf_list[0], ATT_TRANSP, 255);
  56. }
  57. nvects = 0;
  58. for (i = 0; vect->answers[i]; i++) {
  59. mapset = G_find_vector2(vect->answers[i], "");
  60. if (mapset == NULL) {
  61. G_fatal_error(_("Vector map <%s> not found"), vect->answers[i]);
  62. }
  63. id = Nviz_new_map_obj(map_obj_type,
  64. G_fully_qualified_name(vect->answers[i], mapset),
  65. 0.0, data);
  66. /* set position */
  67. x = atof(position->answers[i*3+0]);
  68. y = atof(position->answers[i*3+1]);
  69. z = atof(position->answers[i*3+2]);
  70. if (map_obj_type == MAP_OBJ_VECT)
  71. GV_set_trans(id, x, y, z);
  72. else
  73. GP_set_trans(id, x, y, z);
  74. nvects++;
  75. }
  76. return nvects;
  77. }
  78. /*!
  79. \brief Set vector lines mode
  80. \param params parameters
  81. \return 1 on success
  82. \return 0 on failure
  83. */
  84. int vlines_set_attrb(const struct GParams *params)
  85. {
  86. int i, layer, color, width, flat, height;
  87. int *vect_list, nvects;
  88. int have_colors;
  89. char *color_column, *width_column;
  90. struct Colors colors;
  91. vect_list = GV_get_vect_list(&nvects);
  92. for (i = 0; i < nvects; i++) {
  93. layer = check_thematic(params, TRUE);
  94. color = Nviz_color_from_str(params->vline_color->answers[i]);
  95. color_column = params->vline_color_column->answers ?
  96. params->vline_color_column->answers[i] : NULL;
  97. width = atoi(params->vline_width->answers[i]);
  98. width_column = params->vline_width_column->answers ?
  99. params->vline_width_column->answers[i] : NULL;
  100. if (strcmp(params->vline_mode->answers[i], "flat") == 0)
  101. flat = 1;
  102. else
  103. flat = 0;
  104. /* style (mode -- use memory by default) */
  105. if (GV_set_style(vect_list[i], TRUE, color, width, flat) < 0)
  106. return 0;
  107. /* check for vector color table */
  108. have_colors = Vect_read_colors(params->vlines->answers[i], "",
  109. &colors);
  110. if (have_colors || color_column || width_column)
  111. if (GV_set_style_thematic(vect_list[i], layer, color_column,
  112. width_column, have_colors ? &colors : NULL) < 0)
  113. return 0;
  114. /* height */
  115. height = atoi(params->vline_height->answers[i]);
  116. if (height > 0)
  117. GV_set_trans(vect_list[i], 0.0, 0.0, height);
  118. }
  119. return 1;
  120. }
  121. /*!
  122. \brief Set vector points style
  123. \param params parameters
  124. \return 1 on success
  125. \return 0 on failure
  126. */
  127. int vpoints_set_attrb(const struct GParams *params)
  128. {
  129. int i, layer, have_colors;
  130. int *site_list, nsites;
  131. int marker, color, width;
  132. float size;
  133. char *marker_str, *color_column, *size_column, *width_column, *marker_column;
  134. struct Colors colors;
  135. site_list = GP_get_site_list(&nsites);
  136. for (i = 0; i < nsites; i++) {
  137. layer = check_thematic(params, FALSE);
  138. color = Nviz_color_from_str(params->vpoint_color->answers[i]);
  139. color_column = params->vpoint_color_column->answers ?
  140. params->vpoint_color_column->answers[i] : NULL;
  141. size = atof(params->vpoint_size->answers[i]);
  142. size_column = params->vpoint_size_column->answers ?
  143. params->vpoint_size_column->answers[i] : NULL;
  144. width = atoi(params->vpoint_width->answers[i]);
  145. width_column = params->vpoint_width_column->answers ?
  146. params->vpoint_width_column->answers[i] : NULL;
  147. marker_str = params->vpoint_marker->answers[i];
  148. marker_column = params->vpoint_marker_column->answers ?
  149. params->vpoint_marker_column->answers[i] : NULL;
  150. marker = GP_str_to_marker(marker_str);
  151. if (GP_set_style(site_list[i], color, width, size, marker) < 0)
  152. return 0;
  153. /* check for vector color table */
  154. have_colors = Vect_read_colors(params->vpoints->answers[i], "",
  155. &colors);
  156. if (have_colors || color_column || width_column ||
  157. size_column || marker_column) {
  158. if (GP_set_style_thematic(site_list[i], layer, color_column,
  159. width_column, size_column, marker_column,
  160. have_colors ? &colors : NULL) < 0)
  161. return 0;
  162. }
  163. }
  164. return 1;
  165. }
  166. int check_thematic(const struct GParams *params, int vlines)
  167. {
  168. int i, type;
  169. struct Map_info Map;
  170. struct Option *map, *layer, *color, *size, *width, *marker;
  171. struct field_info *Fi;
  172. dbDriver *driver;
  173. dbColumn *column;
  174. Fi = NULL;
  175. if (vlines) {
  176. map = params->vlines;
  177. layer = params->vline_layer;
  178. color = params->vline_color_column;
  179. size = NULL;
  180. width = params->vline_width_column;
  181. marker = NULL;
  182. }
  183. else {
  184. map = params->vpoints;
  185. layer = params->vpoint_layer;
  186. color = params->vpoint_color_column;
  187. size = params->vpoint_size_column;
  188. width = params->vpoint_width_column;
  189. marker = params->vpoint_marker_column;
  190. }
  191. for (i = 0; map->answers[i]; i++) {
  192. if (1 > Vect_open_old(&Map, map->answers[i], ""))
  193. G_fatal_error(_("Unable to open vector map <%s>"), map->answers[i]);
  194. Fi = Vect_get_field2(&Map, layer->answers[i]);
  195. if (!Fi)
  196. continue;
  197. driver = db_start_driver_open_database(Fi->driver, Fi->database);
  198. if (!driver)
  199. G_fatal_error(_("Unable to open database <%s> by driver <%s>"),
  200. Fi->database, Fi->driver);
  201. if (color->answers && color->answers[i]) {
  202. db_get_column(driver, Fi->table, color->answers[i], &column);
  203. if (!column)
  204. G_fatal_error(_("Column <%s> in table <%s> not found"),
  205. color->answers[i], Fi->table);
  206. if (db_column_Ctype(driver, Fi->table, color->answers[i]) != DB_C_TYPE_STRING)
  207. G_fatal_error(_("Data type of color column must be character"));
  208. }
  209. if (size && size->answers && size->answers[i]) {
  210. db_get_column(driver, Fi->table, size->answers[i], &column);
  211. if (!column)
  212. G_fatal_error(_("Column <%s> in table <%s> not found"),
  213. size->answers[i], Fi->table);
  214. type = db_column_Ctype(driver, Fi->table, size->answers[i]);
  215. if (type != DB_C_TYPE_INT && type != DB_C_TYPE_DOUBLE)
  216. G_fatal_error(_("Data type of size column must be numeric"));
  217. }
  218. if (width->answers && width->answers[i]) {
  219. db_get_column(driver, Fi->table, width->answers[i], &column);
  220. if (!column)
  221. G_fatal_error(_("Column <%s> in table <%s> not found"),
  222. width->answers[i], Fi->table);
  223. type = db_column_Ctype(driver, Fi->table, width->answers[i]);
  224. if (type != DB_C_TYPE_INT && type != DB_C_TYPE_DOUBLE)
  225. G_fatal_error(_("Data type of width column must be numeric"));
  226. }
  227. if (marker && marker->answers && marker->answers[i]) {
  228. db_get_column(driver, Fi->table, marker->answers[i], &column);
  229. if (!column)
  230. G_fatal_error(_("Column <%s> in table <%s> not found"),
  231. marker->answers[i], Fi->table);
  232. type = db_column_Ctype(driver, Fi->table, marker->answers[i]);
  233. if (db_column_Ctype(driver, Fi->table, marker->answers[i]) != DB_C_TYPE_STRING)
  234. G_fatal_error(_("Data type of marker column must be character"));
  235. }
  236. }
  237. if (Fi)
  238. return Fi->number;
  239. return 1;
  240. }