|
@@ -23,6 +23,8 @@ static double dist, e, n;
|
|
|
int main(int argc, char *argv[])
|
|
|
{
|
|
|
char *name, *outfile;
|
|
|
+ const char *unit;
|
|
|
+ double factor;
|
|
|
int fd, projection;
|
|
|
FILE *fp, *coor_fp;
|
|
|
double res;
|
|
@@ -38,7 +40,7 @@ int main(int argc, char *argv[])
|
|
|
struct
|
|
|
{
|
|
|
struct Option *opt1, *profile, *res, *output, *null_str, *coord_file;
|
|
|
- struct Flag *g, *c;
|
|
|
+ struct Flag *g, *c, *m;
|
|
|
}
|
|
|
parm;
|
|
|
struct GModule *module;
|
|
@@ -98,6 +100,11 @@ int main(int argc, char *argv[])
|
|
|
parm.c->description =
|
|
|
_("Output RRR:GGG:BBB color values for each profile point");
|
|
|
|
|
|
+ parm.m = G_define_flag();
|
|
|
+ parm.m->key = 'm';
|
|
|
+ parm.m->label = _("Use meters instead of current location units");
|
|
|
+ parm.m->description =
|
|
|
+ _("Meters are used always in latlon locations");
|
|
|
|
|
|
if (G_parser(argc, argv))
|
|
|
exit(EXIT_FAILURE);
|
|
@@ -116,18 +123,29 @@ int main(int argc, char *argv[])
|
|
|
|
|
|
G_get_window(&window);
|
|
|
projection = G_projection();
|
|
|
+
|
|
|
+ /* get conversion factor to current units */
|
|
|
+ unit = G_database_unit_name(1);
|
|
|
+ factor = G_database_units_to_meters_factor();
|
|
|
+ /* keep meters in case of latlon */
|
|
|
+ if (parm.m->answer || projection == 3)
|
|
|
+ {
|
|
|
+ factor = 1;
|
|
|
+ unit = "meters";
|
|
|
+ }
|
|
|
+
|
|
|
if (parm.res->answer) {
|
|
|
res = atof(parm.res->answer);
|
|
|
/* Catch bad resolution ? */
|
|
|
if (res <= 0)
|
|
|
- G_fatal_error(_("Illegal resolution! [%g]"), res);
|
|
|
+ G_fatal_error(_("Illegal resolution %g [%s]"), res / factor, unit);
|
|
|
}
|
|
|
else {
|
|
|
/* Do average of EW and NS res */
|
|
|
res = (window.ew_res + window.ns_res) / 2;
|
|
|
}
|
|
|
|
|
|
- G_message(_("Using resolution [%g]"), res);
|
|
|
+ G_message(_("Using resolution: %g [%s]"), res / factor, unit);
|
|
|
|
|
|
G_begin_distance_calculations();
|
|
|
|
|
@@ -158,14 +176,14 @@ int main(int argc, char *argv[])
|
|
|
/* Done with file */
|
|
|
|
|
|
/* Show message giving output format */
|
|
|
- G_message(_("Output Format:"));
|
|
|
+ G_message(_("Output columns:"));
|
|
|
if (coords == 1)
|
|
|
sprintf(formatbuff,
|
|
|
- _("[Easting] [Northing] [Along Track Dist.(m)] [Elevation]"));
|
|
|
+ _("Easting, Northing, Along track dist. [%s], Elevation"), unit);
|
|
|
else
|
|
|
- sprintf(formatbuff, _("[Along Track Dist.(m)] [Elevation]"));
|
|
|
+ sprintf(formatbuff, _("Along track dist. [%s], Elevation"), unit);
|
|
|
if (clr)
|
|
|
- strcat(formatbuff, _(" [RGB Color]"));
|
|
|
+ strcat(formatbuff, _(" RGB color"));
|
|
|
G_message(formatbuff);
|
|
|
|
|
|
/* Get Profile Start Coords */
|
|
@@ -186,8 +204,8 @@ int main(int argc, char *argv[])
|
|
|
G_fatal_error(_("Invalid coordinates %s %s"), ebuf, nbuf);
|
|
|
|
|
|
if (havefirst)
|
|
|
- do_profile(e1, e2, n1, n2, name, coords, res, fd, data_type,
|
|
|
- fp, null_string);
|
|
|
+ do_profile(e1, e2, n1, n2, coords, res, fd, data_type,
|
|
|
+ fp, null_string, unit, factor);
|
|
|
e1 = e2;
|
|
|
n1 = n2;
|
|
|
havefirst = TRUE;
|
|
@@ -211,8 +229,8 @@ int main(int argc, char *argv[])
|
|
|
n2 = n1;
|
|
|
|
|
|
/* Get profile info */
|
|
|
- do_profile(e1, e2, n1, n2, name, coords, res, fd, data_type, fp,
|
|
|
- null_string);
|
|
|
+ do_profile(e1, e2, n1, n2, coords, res, fd, data_type, fp,
|
|
|
+ null_string, unit, factor);
|
|
|
}
|
|
|
else {
|
|
|
for (i = 0; i <= k - 2; i += 2) {
|
|
@@ -225,8 +243,8 @@ int main(int argc, char *argv[])
|
|
|
G_projection());
|
|
|
|
|
|
/* Get profile info */
|
|
|
- do_profile(e1, e2, n1, n2, name, coords, res, fd, data_type,
|
|
|
- fp, null_string);
|
|
|
+ do_profile(e1, e2, n1, n2, coords, res, fd, data_type,
|
|
|
+ fp, null_string, unit, factor);
|
|
|
|
|
|
}
|
|
|
}
|
|
@@ -243,9 +261,9 @@ int main(int argc, char *argv[])
|
|
|
|
|
|
/* Calculate the Profile Now */
|
|
|
/* Establish parameters */
|
|
|
-int do_profile(double e1, double e2, double n1, double n2, char *name,
|
|
|
+int do_profile(double e1, double e2, double n1, double n2,
|
|
|
int coords, double res, int fd, int data_type, FILE * fp,
|
|
|
- char *null_string)
|
|
|
+ char *null_string, const char *unit, double factor)
|
|
|
{
|
|
|
float rows, cols, LEN;
|
|
|
double Y, X, AZI;
|
|
@@ -254,7 +272,7 @@ int do_profile(double e1, double e2, double n1, double n2, char *name,
|
|
|
rows = n1 - n2;
|
|
|
|
|
|
LEN = G_distance(e1, n1, e2, n2);
|
|
|
- G_message(_("Approx. transect length [%f] m"), LEN);
|
|
|
+ G_message(_("Approx. transect length: %f [%s]"), LEN / factor, unit);
|
|
|
|
|
|
if (!G_point_in_region(e2, n2))
|
|
|
G_warning(_("Endpoint coordinates are outside of current region settings"));
|
|
@@ -264,7 +282,7 @@ int do_profile(double e1, double e2, double n1, double n2, char *name,
|
|
|
/* Special case for no movement */
|
|
|
e = e1;
|
|
|
n = n1;
|
|
|
- read_rast(e, n, dist, fd, coords, data_type, fp, null_string);
|
|
|
+ read_rast(e, n, dist / factor, fd, coords, data_type, fp, null_string);
|
|
|
}
|
|
|
|
|
|
if (rows >= 0 && cols < 0) {
|
|
@@ -280,7 +298,7 @@ int do_profile(double e1, double e2, double n1, double n2, char *name,
|
|
|
dist -= G_distance(e, n, e1, n1);
|
|
|
}
|
|
|
for (e = e1, n = n1; e < e2 || n > n2; e += X, n -= Y) {
|
|
|
- read_rast(e, n, dist, fd, coords, data_type, fp, null_string);
|
|
|
+ read_rast(e, n, dist / factor, fd, coords, data_type, fp, null_string);
|
|
|
/* d+=res; */
|
|
|
dist += G_distance(e - X, n + Y, e, n);
|
|
|
}
|
|
@@ -302,7 +320,7 @@ int do_profile(double e1, double e2, double n1, double n2, char *name,
|
|
|
*/
|
|
|
}
|
|
|
for (e = e1, n = n1; e < e2 || n < n2; e += X, n += Y) {
|
|
|
- read_rast(e, n, dist, fd, coords, data_type, fp, null_string);
|
|
|
+ read_rast(e, n, dist / factor, fd, coords, data_type, fp, null_string);
|
|
|
/* d+=res; */
|
|
|
dist += G_distance(e - X, n - Y, e, n);
|
|
|
}
|
|
@@ -321,7 +339,7 @@ int do_profile(double e1, double e2, double n1, double n2, char *name,
|
|
|
dist -= G_distance(e, n, e1, n1);
|
|
|
}
|
|
|
for (e = e1, n = n1; e > e2 || n > n2; e -= X, n -= Y) {
|
|
|
- read_rast(e, n, dist, fd, coords, data_type, fp, null_string);
|
|
|
+ read_rast(e, n, dist / factor, fd, coords, data_type, fp, null_string);
|
|
|
/* d+=res; */
|
|
|
dist += G_distance(e + X, n + Y, e, n);
|
|
|
}
|
|
@@ -340,7 +358,7 @@ int do_profile(double e1, double e2, double n1, double n2, char *name,
|
|
|
dist -= G_distance(e, n, e1, n1);
|
|
|
}
|
|
|
for (e = e1, n = n1; e > e2 || n < n2; e -= X, n += Y) {
|
|
|
- read_rast(e, n, dist, fd, coords, data_type, fp, null_string);
|
|
|
+ read_rast(e, n, dist / factor, fd, coords, data_type, fp, null_string);
|
|
|
/* d+=res; */
|
|
|
dist += G_distance(e + X, n - Y, e, n);
|
|
|
}
|