3
#include <grass/vector.h>
4
#include <grass/glocale.h>
7
static int find_node(struct Map_info *, int, int);
9
static void field2n(struct line_cats *, int);
12
* \brief Create network arcs (edge) based on given point vector map (nodes)
14
* \param file input file defining arcs
15
* \param Points input vector point map
16
* \param Out output vector map
17
* \param afield arcs layer
18
* \param nfield nodes layer
20
* \return number of new arcs
22
int create_arcs(FILE * file, struct Map_info *Pnts,
23
struct Map_info *Out, int afield, int nfield)
30
struct line_pnts *points, *points2;
31
struct line_cats *cats;
33
points = Vect_new_line_struct();
34
points2 = Vect_new_line_struct();
35
points = Vect_new_line_struct();
36
cats = Vect_new_cats_struct();
40
while (G_getl2(buff, sizeof(buff) - 1, file)) {
41
if (sscanf(buff, "%d%d%d", &lcat, &fcat, &tcat) != 3)
42
G_fatal_error(_("Error reading file: '%s'"), buff);
44
node1 = find_node(Pnts, afield, fcat);
45
node2 = find_node(Pnts, afield, tcat);
47
if (node1 < 1 || node2 < 1) {
48
G_warning(_("Skipping arc %d"), lcat);
53
Vect_read_line(Pnts, points, cats, node1);
54
field2n(cats, nfield);
55
Vect_write_line(Out, GV_POINT, points, cats);
56
Vect_read_line(Pnts, points2, cats, node2);
57
field2n(cats, nfield);
58
Vect_write_line(Out, GV_POINT, points2, cats);
59
Vect_append_points(points, points2, GV_FORWARD);
62
Vect_reset_cats(cats);
63
Vect_cat_set(cats, afield, lcat);
64
Vect_write_line(Out, GV_LINE, points, cats);
69
Vect_destroy_line_struct(points);
70
Vect_destroy_cats_struct(cats);
75
int find_node(struct Map_info *Pnts, int field, int cat)
77
static struct ilist *list;
80
list = Vect_new_list();
83
Vect_cidx_find_all(Pnts, field, GV_POINT, cat, list);
84
if (list->n_values < 1) {
85
G_warning(_("No point with category %d found"), cat);
88
if (list->n_values > 1) {
89
G_warning(_("More points with category %d found"), cat);
93
return list->value[0];
96
void field2n(struct line_cats *cats, int nfield)
100
for (n = 0; n < cats->n_cats; n++) {
101
cats->field[n] = nfield;