|
@@ -4,10 +4,11 @@
|
|
|
* MODULE: v.net.path
|
|
|
*
|
|
|
* AUTHOR(S): Radim Blazek
|
|
|
- *
|
|
|
+ * Stepan Turek <stepan.turek seznam.cz> (turns support)
|
|
|
+ *
|
|
|
* PURPOSE: Shortest path on vector network
|
|
|
*
|
|
|
- * COPYRIGHT: (C) 2002 by the GRASS Development Team
|
|
|
+ * COPYRIGHT: (C) 2002, 2014 by the GRASS Development Team
|
|
|
*
|
|
|
* This program is free software under the
|
|
|
* GNU General Public License (>=v2).
|
|
@@ -20,17 +21,18 @@
|
|
|
#include <grass/vector.h>
|
|
|
#include <grass/glocale.h>
|
|
|
|
|
|
-int path(struct Map_info *, struct Map_info *, char *, int, double, int);
|
|
|
+int path(struct Map_info *, struct Map_info *, char *, int, double, int,
|
|
|
+ int, int);
|
|
|
|
|
|
int main(int argc, char **argv)
|
|
|
{
|
|
|
- struct Option *input_opt, *output_opt, *afield_opt, *nfield_opt, *afcol,
|
|
|
- *abcol, *ncol, *type_opt;
|
|
|
+ struct Option *input_opt, *output_opt, *afield_opt, *nfield_opt,
|
|
|
+ *tfield_opt, *tucfield_opt, *afcol, *abcol, *ncol, *type_opt;
|
|
|
struct Option *max_dist, *file_opt;
|
|
|
- struct Flag *geo_f, *segments_f;
|
|
|
+ struct Flag *geo_f, *segments_f, *turntable_f;
|
|
|
struct GModule *module;
|
|
|
struct Map_info In, Out;
|
|
|
- int type, afield, nfield, geo;
|
|
|
+ int type, afield, nfield, tfield, tucfield, geo;
|
|
|
double maxdist;
|
|
|
|
|
|
/* Initialize the GIS calls */
|
|
@@ -48,16 +50,19 @@ int main(int argc, char **argv)
|
|
|
type_opt = G_define_standard_option(G_OPT_V_TYPE);
|
|
|
type_opt->options = "line,boundary";
|
|
|
type_opt->answer = "line,boundary";
|
|
|
+ type_opt->required = YES;
|
|
|
type_opt->label = _("Arc type");
|
|
|
|
|
|
afield_opt = G_define_standard_option(G_OPT_V_FIELD);
|
|
|
afield_opt->key = "alayer";
|
|
|
afield_opt->answer = "1";
|
|
|
+ afield_opt->required = YES;
|
|
|
afield_opt->label = _("Arc layer");
|
|
|
|
|
|
nfield_opt = G_define_standard_option(G_OPT_V_FIELD);
|
|
|
nfield_opt->key = "nlayer";
|
|
|
nfield_opt->answer = "2";
|
|
|
+ nfield_opt->required = YES;
|
|
|
nfield_opt->label = _("Node layer");
|
|
|
|
|
|
file_opt = G_define_standard_option(G_OPT_F_INPUT);
|
|
@@ -66,24 +71,26 @@ int main(int argc, char **argv)
|
|
|
file_opt->description = _("Name of file containing start and end points. "
|
|
|
"If not given, read from stdin");
|
|
|
|
|
|
-
|
|
|
afcol = G_define_option();
|
|
|
afcol->key = "afcolumn";
|
|
|
afcol->type = TYPE_STRING;
|
|
|
afcol->required = NO;
|
|
|
afcol->description = _("Arc forward/both direction(s) cost column");
|
|
|
+ afcol->guisection = _("Costs");
|
|
|
|
|
|
abcol = G_define_option();
|
|
|
abcol->key = "abcolumn";
|
|
|
abcol->type = TYPE_STRING;
|
|
|
abcol->required = NO;
|
|
|
abcol->description = _("Arc backward direction cost column");
|
|
|
+ abcol->guisection = _("Costs");
|
|
|
|
|
|
ncol = G_define_option();
|
|
|
ncol->key = "ncolumn";
|
|
|
ncol->type = TYPE_STRING;
|
|
|
ncol->required = NO;
|
|
|
ncol->description = _("Node cost column");
|
|
|
+ ncol->guisection = _("Costs");
|
|
|
|
|
|
max_dist = G_define_option();
|
|
|
max_dist->key = "dmax";
|
|
@@ -97,6 +104,22 @@ int main(int argc, char **argv)
|
|
|
"and error message is printed. To speed up the process, keep this "
|
|
|
"value as low as possible.");
|
|
|
|
|
|
+ tfield_opt = G_define_standard_option(G_OPT_V_FIELD);
|
|
|
+ tfield_opt->key = "tlayer";
|
|
|
+ tfield_opt->answer = "3";
|
|
|
+ tfield_opt->label = _("Turntable layer");
|
|
|
+ tfield_opt->description =
|
|
|
+ _("If the -t flag is given, the parameter is required");
|
|
|
+ tfield_opt->guisection = _("Turntable");
|
|
|
+
|
|
|
+ tucfield_opt = G_define_standard_option(G_OPT_V_FIELD);
|
|
|
+ tucfield_opt->key = "tuclayer";
|
|
|
+ tucfield_opt->answer = "4";
|
|
|
+ tucfield_opt->label = _("Layer with unique categories used in turntable");
|
|
|
+ tucfield_opt->description =
|
|
|
+ _("If the -t flag is given, the parameter is required");
|
|
|
+ tucfield_opt->guisection = _("Turntable");
|
|
|
+
|
|
|
geo_f = G_define_flag();
|
|
|
geo_f->key = 'g';
|
|
|
geo_f->description =
|
|
@@ -107,12 +130,16 @@ int main(int argc, char **argv)
|
|
|
segments_f->description = _("Write output as original input segments, "
|
|
|
"not each path as one line.");
|
|
|
|
|
|
+ turntable_f = G_define_flag();
|
|
|
+ turntable_f->key = 't';
|
|
|
+ turntable_f->description = _("Use turntable"
|
|
|
+ "(tuclayer and tlayer are required with this flag).");
|
|
|
+
|
|
|
+
|
|
|
if (G_parser(argc, argv))
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
|
|
type = Vect_option_to_types(type_opt);
|
|
|
- afield = atoi(afield_opt->answer);
|
|
|
- nfield = atoi(nfield_opt->answer);
|
|
|
maxdist = atof(max_dist->answer);
|
|
|
|
|
|
if (geo_f->answer) {
|
|
@@ -130,6 +157,11 @@ int main(int argc, char **argv)
|
|
|
if (Vect_open_old(&In, input_opt->answer, "") < 0)
|
|
|
G_fatal_error(_("Unable to open vector map <%s>"), input_opt->answer);
|
|
|
|
|
|
+ afield = Vect_get_field_number(&In, afield_opt->answer);
|
|
|
+ nfield = Vect_get_field_number(&In, nfield_opt->answer);
|
|
|
+ tfield = Vect_get_field_number(&In, tfield_opt->answer);
|
|
|
+ tucfield = Vect_get_field_number(&In, tucfield_opt->answer);
|
|
|
+
|
|
|
if (1 > Vect_open_new(&Out, output_opt->answer, Vect_is_3d(&In))) {
|
|
|
Vect_close(&In);
|
|
|
G_fatal_error(_("Unable to create vector map <%s>"),
|
|
@@ -137,10 +169,16 @@ int main(int argc, char **argv)
|
|
|
}
|
|
|
Vect_hist_command(&Out);
|
|
|
|
|
|
- Vect_net_build_graph(&In, type, afield, nfield, afcol->answer,
|
|
|
- abcol->answer, ncol->answer, geo, 0);
|
|
|
+ if (turntable_f->answer)
|
|
|
+ Vect_net_ttb_build_graph(&In, type, afield, nfield, tfield, tucfield,
|
|
|
+ afcol->answer, abcol->answer, ncol->answer,
|
|
|
+ geo, 0);
|
|
|
+ else
|
|
|
+ Vect_net_build_graph(&In, type, afield, nfield, afcol->answer,
|
|
|
+ abcol->answer, ncol->answer, geo, 0);
|
|
|
|
|
|
- path(&In, &Out, file_opt->answer, nfield, maxdist, segments_f->answer);
|
|
|
+ path(&In, &Out, file_opt->answer, nfield, maxdist, segments_f->answer,
|
|
|
+ tucfield, turntable_f->answer);
|
|
|
|
|
|
Vect_close(&In);
|
|
|
|