4
\brief Vector subroutines
6
(C) 2008, 2010 by the GRASS Development Team
8
This program is free software under the GNU General Public
9
License (>=v2). Read the file COPYING that comes with GRASS
12
\author Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
4
\brief Vector subroutines
6
(C) 2008-2013 by the GRASS Development Team
8
This program is free software under the GNU General Public
9
License (>=v2). Read the file COPYING that comes with GRASS
12
\author Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
15
15
#include <stdlib.h>
16
16
#include <string.h>
18
#include <grass/vector.h>
19
#include <grass/dbmi.h>
18
20
#include <grass/glocale.h>
20
22
#include "local_proto.h"
22
24
static int load_vectors(const struct Option *, const struct Option *,
23
const struct Option *, const struct Option *, int, nv_data *);
25
const struct Option *, const struct Option *, int,
26
\brief Load vector maps (lines)
28
\param params module parameters
31
\return number of loaded vectors
29
\brief Load vector maps (lines)
31
\param params module parameters
34
\return number of loaded vectors
33
36
int load_vlines(const struct GParams *params, nv_data * data)
35
38
return load_vectors(params->elev_map, params->elev_const,
104
\brief Set vector lines mode
106
\param params parameters
107
\brief Set vector lines mode
109
\param params parameters
111
114
int vlines_set_attrb(const struct GParams *params)
113
int i, color, width, flat, height;
116
int i, layer, color, width, flat, height;
114
117
int *vect_list, nvects;
120
char *color_column, *width_column;
121
struct Colors colors;
116
123
vect_list = GV_get_vect_list(&nvects);
118
125
for (i = 0; i < nvects; i++) {
119
/* mode -- use memory by default */
126
check_map(params, i, TRUE, &layer, NULL);
120
128
color = Nviz_color_from_str(params->vline_color->answers[i]);
129
color_column = params->vline_color_column->answers ?
130
params->vline_color_column->answers[i] : NULL;
121
131
width = atoi(params->vline_width->answers[i]);
132
width_column = params->vline_width_column->answers ?
133
params->vline_width_column->answers[i] : NULL;
122
135
if (strcmp(params->vline_mode->answers[i], "flat") == 0)
126
if (GV_set_vectmode(vect_list[i], 1, color, width, flat) < 0)
140
/* style (mode -- use memory by default) */
141
if (GV_set_style(vect_list[i], TRUE, color, width, flat) < 0)
144
/* check for vector color table */
145
have_colors = Vect_read_colors(params->vlines->answers[i], "",
148
if (have_colors || color_column || width_column)
149
if (GV_set_style_thematic(vect_list[i], layer, color_column,
151
have_colors ? &colors : NULL) < 0)
130
155
height = atoi(params->vline_height->answers[i]);
139
\brief Set vector points mode
141
\param params parameters
164
\brief Set vector points style
166
\param params parameters
146
171
int vpoints_set_attrb(const struct GParams *params)
173
int i, layer, have_colors, with_z;
149
174
int *site_list, nsites;
150
175
int marker, color, width;
177
char *marker_str, *color_column, *size_column, *width_column,
180
struct Colors colors;
154
182
site_list = GP_get_site_list(&nsites);
156
184
for (i = 0; i < nsites; i++) {
185
check_map(params, i, FALSE, &layer, &with_z);
157
187
color = Nviz_color_from_str(params->vpoint_color->answers[i]);
188
color_column = params->vpoint_color_column->answers ?
189
params->vpoint_color_column->answers[i] : NULL;
158
190
size = atof(params->vpoint_size->answers[i]);
191
size_column = params->vpoint_size_column->answers ?
192
params->vpoint_size_column->answers[i] : NULL;
159
193
width = atoi(params->vpoint_width->answers[i]);
194
width_column = params->vpoint_width_column->answers ?
195
params->vpoint_width_column->answers[i] : NULL;
160
196
marker_str = params->vpoint_marker->answers[i];
162
if (strcmp(marker_str, "x") == 0)
164
else if (strcmp(marker_str, "sphere") == 0)
166
else if (strcmp(marker_str, "diamond") == 0)
168
else if (strcmp(marker_str, "cube") == 0)
170
else if (strcmp(marker_str, "box") == 0)
172
else if (strcmp(marker_str, "gyro") == 0)
174
else if (strcmp(marker_str, "aster") == 0)
176
else if (strcmp(marker_str, "histogram") == 0)
177
marker = ST_HISTOGRAM;
179
G_fatal_error(_("Unknown icon marker"));
181
GP_set_sitemode(site_list[i], ST_ATT_NONE,
182
color, width, size, marker);
184
/* GP_set_style(site_list[i], color, width, size, marker); */
197
marker_column = params->vpoint_marker_column->answers ?
198
params->vpoint_marker_column->answers[i] : NULL;
199
marker = GP_str_to_marker(marker_str);
202
if (strcmp(params->vpoint_mode->answers[i], "surface") == 0)
203
GP_set_zmode(site_list[i], FALSE);
205
GP_set_zmode(site_list[i], TRUE);
208
if (GP_set_style(site_list[i], color, width, size, marker) < 0)
211
/* check for vector color table */
212
have_colors = Vect_read_colors(params->vpoints->answers[i], "",
215
if (have_colors || color_column || width_column ||
216
size_column || marker_column) {
217
if (GP_set_style_thematic(site_list[i], layer, color_column,
218
width_column, size_column,
220
have_colors ? &colors : NULL) < 0)
229
\brief Check vector map
231
\param params parameters
232
\param index answers array index
233
\param vlines TRUE for lines otherwise points
234
\param[out] field number
235
\param[out] WITH_Z for 3D maps
237
\return 0 on success otherwise 1
239
int check_map(const struct GParams *params, int index, int vlines,
240
int *field, int *with_z)
244
const char *map, *layer, *color, *size, *width, *marker;
245
struct field_info *Fi;
254
map = params->vlines->answers[index];
255
layer = params->vline_layer->answers[index];
256
color = params->vline_color_column->answers ?
257
params->vline_color_column->answers[index] : NULL;
259
width = params->vline_width_column->answers ?
260
params->vline_width_column->answers[index] : NULL;
264
map = params->vpoints->answers[index];
265
layer = params->vpoint_layer->answers[index];
266
color = params->vpoint_color_column->answers ?
267
params->vpoint_color_column->answers[index] : NULL;
268
size = params->vpoint_size_column->answers ?
269
params->vpoint_size_column->answers[index] : NULL;
270
width = params->vpoint_width_column->answers ?
271
params->vpoint_width_column->answers[index] : NULL;
272
marker = params->vpoint_marker_column->answers ?
273
params->vpoint_marker_column->answers[index] : NULL;
279
if (1 > Vect_open_old(&Map, map, ""))
280
G_fatal_error(_("Unable to open vector map <%s>"), map);
281
Vect_set_error_handler_io(&Map, NULL);
284
*with_z = Vect_is_3d(&Map);
287
Fi = Vect_get_field2(&Map, layer);
291
driver = db_start_driver_open_database(Fi->driver, Fi->database);
293
G_fatal_error(_("Unable to open database <%s> by driver <%s>"),
294
Fi->database, Fi->driver);
295
db_set_error_handler_driver(driver);
298
db_get_column(driver, Fi->table, color, &column);
300
G_fatal_error(_("Column <%s> in table <%s> not found"),
303
if (db_column_Ctype(driver, Fi->table, color) != DB_C_TYPE_STRING)
304
G_fatal_error(_("Data type of color column must be character"));
307
db_get_column(driver, Fi->table, size, &column);
309
G_fatal_error(_("Column <%s> in table <%s> not found"),
312
type = db_column_Ctype(driver, Fi->table, size);
313
if (type != DB_C_TYPE_INT && type != DB_C_TYPE_DOUBLE)
314
G_fatal_error(_("Data type of size column must be numeric"));
317
db_get_column(driver, Fi->table, width, &column);
319
G_fatal_error(_("Column <%s> in table <%s> not found"),
322
type = db_column_Ctype(driver, Fi->table, width);
323
if (type != DB_C_TYPE_INT && type != DB_C_TYPE_DOUBLE)
324
G_fatal_error(_("Data type of width column must be numeric"));
327
db_get_column(driver, Fi->table, marker, &column);
329
G_fatal_error(_("Column <%s> in table <%s> not found"),
332
type = db_column_Ctype(driver, Fi->table, marker);
333
if (db_column_Ctype(driver, Fi->table, marker) !=
335
G_fatal_error(_("Data type of marker column must be character"));
338
db_close_database_shutdown_driver(driver);