Browse Source

d.geodesic: hardcoded miles changed to units choice; new screenshot (related to trac https://trac.osgeo.org/grass/ticket/2417); d.rhumbline: minor sync with d.geodesic

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@63798 15284696-431f-4ddb-bdfa-cd5b030d7da7
Markus Neteler 10 years ago
parent
commit
1fa7a4e4a4

+ 10 - 17
display/d.geodesic/d.geodesic.html

@@ -8,20 +8,12 @@ within the boundaries of the user's current geographic region.
 
 <h2>OPTIONS</h2>
 
-This program can be run either interactively or non-interactively. 
-If the user types <b>d.geodesic</b> on the command line and runs it without other program 
-parameters, the mouse will be activated; the user is asked to use 
-the mouse to indicate the starting and ending points of each geodesic line 
-to be drawn. The default line color (black) and text color (red) 
-will be used. 
-
-<p>Alternately, the user can specify the starting and ending coordinates 
-of the geodesic, line color, and text color on the command line, 
-and run the program non-interactively. 
-
-<p>Once the user indicates the starting and ending coordinates 
-of the geodesic, the line and its length (in miles) are displayed to 
-the user's graphics monitor. If the text color is set to <em>none</em>,
+By default black line color and red text color will be used. 
+
+<p>
+By indicating the starting and ending coordinates 
+of the geodesic, the line and its length (by default in meters) are displayed to 
+the graphical output. If the text color is set to <em>none</em>,
 the great circle distance is not displayed.
 
 <h2>EXAMPLE</h2>
@@ -33,10 +25,11 @@ A geodesic line if shown over the political map of the world
 g.region vector=country_boundaries -p
 d.mon wx0
 d.vect country_boundaries type=area
+# show additionally a 20 degree grid
+d.grid 20
+
 d.geodesic coordinates=55:58W,33:18S,26:43E,60:37N \
-  line_color=yellow text_color=red
-# show additionally 10 degree grid
-d.grid 10
+  line_color=yellow text_color=red units=kilometers
 </pre></div>
 
 <p><center>

BIN
display/d.geodesic/d_geodesic.png


+ 1 - 1
display/d.geodesic/local_proto.h

@@ -1 +1 @@
-void plot(double, double, double, double, int, int);
+void plot(double, double, double, double, int, int, double, const char *);

+ 22 - 7
display/d.geodesic/main.c

@@ -11,7 +11,7 @@
  *               Jan-Oliver Wagner <jan intevation.de>
  * PURPOSE:      displays a geodesic line in the active frame on the user's 
  *               graphics monitor
- * COPYRIGHT:    (C) 1999-2006 by the GRASS Development Team
+ * COPYRIGHT:    (C) 1999-2014 by the GRASS Development Team
  *
  *               This program is free software under the GNU General Public
  *               License (>=v2). Read the file COPYING that comes with GRASS
@@ -31,10 +31,13 @@ int main(int argc, char *argv[])
     int text_color;
     double lon1, lat1, lon2, lat2;
     char *deftcolor;
+    const char *unit;
+    int unit_id;
+    double factor;
     struct GModule *module;
     struct
     {
-	struct Option *lcolor, *tcolor, *coor;
+	struct Option *lcolor, *tcolor, *coor, *units;
     } parm;
 
     G_gisinit(argv[0]);
@@ -42,6 +45,8 @@ int main(int argc, char *argv[])
     module = G_define_module();
     G_add_keyword(_("display"));
     G_add_keyword(_("distance"));
+    G_add_keyword(_("great circle"));
+    G_add_keyword(_("shortest path"));
     module->description =
 	_("Displays a geodesic line, tracing the shortest distance "
 	"between two geographic points along a great circle, in "
@@ -60,13 +65,23 @@ int main(int argc, char *argv[])
     parm.tcolor->key = "text_color";
     parm.tcolor->label = _("Text color");
     parm.tcolor->answer = NULL;
-    
+
+    parm.units = G_define_standard_option(G_OPT_M_UNITS);
+    parm.units->options = "meters,kilometers,feet,miles";
+    parm.units->label = parm.units->description;
+    parm.units->answer = "meters";
+
     if (G_parser(argc, argv))
 	exit(EXIT_FAILURE);
 
-
     if (G_projection() != PROJECTION_LL)
-	G_fatal_error(_("Location is not %s"), G__projection_name(PROJECTION_LL));
+	G_fatal_error(_("Location is not %s"),
+		      G__projection_name(PROJECTION_LL));
+
+    /* get conversion factor and unit name */
+    unit_id = G_units(parm.units->answer);
+    factor = 1. / G_meters_to_units_factor(unit_id);
+    unit = G_get_units_name(unit_id, 1, 0);
 
     if (parm.coor->answers[0] == NULL)
 	G_fatal_error(_("No coordinates given"));
@@ -103,8 +118,8 @@ int main(int argc, char *argv[])
     else
 	text_color = D_translate_color(parm.tcolor->answer);
 
-    plot(lon1, lat1, lon2, lat2, line_color, text_color);
-    
+    plot(lon1, lat1, lon2, lat2, line_color, text_color, factor, unit);
+
     D_save_command(G_recreate_command());
     D_close_driver();
 

+ 5 - 6
display/d.geodesic/plot.c

@@ -1,13 +1,11 @@
+#include <stdio.h>
 #include <string.h>
-#include <grass/display.h>
 #include <grass/gis.h>
-#include <stdio.h>
+#include <grass/display.h>
 #include "local_proto.h"
 
-#define METERS_TO_MILES(x) ((x) * 6.213712e-04)
-
 void plot(double lon1, double lat1, double lon2, double lat2,
-     int line_color, int text_color)
+	  int line_color, int text_color, double factor, const char *unit)
 {
     double distance;
     double text_x, text_y;
@@ -33,6 +31,7 @@ void plot(double lon1, double lat1, double lon2, double lat2,
 	for (i = 0; i <= nsteps; i++) {
 	    double lon = lon1 + (lon2 - lon1) * i / nsteps;
 	    double lat = G_geodesic_lat_from_lon(lon);
+
 	    if (i == 0)
 		D_move_abs(lon, lat);
 	    else
@@ -58,7 +57,7 @@ void plot(double lon1, double lat1, double lon2, double lat2,
 	D_text_size(10, 10);
 
 	distance = G_geodesic_distance(lon1, lat1, lon2, lat2);
-	sprintf(buf, "%.0f miles", METERS_TO_MILES(distance));
+	sprintf(buf, "%.0f %s", distance / factor, unit);
 
 	D_pos_abs(text_x, text_y);
 	D_get_text_box(buf, &t, &b, &l, &r);

+ 20 - 5
display/d.rhumbline/main.c

@@ -17,7 +17,8 @@
  *               for details.
  *
  *****************************************************************************/
-/* TODO: implement G_rhumbline_distance() in libgis 
+/* TODO: implement G_rhumbline_distance() in libgis
+ * see also d.geodesic
  */
 
 #include <stdlib.h>
@@ -56,9 +57,15 @@ int main(int argc, char *argv[])
     parm.lcolor->label = _("Line color");
 
 #ifdef CAN_DO_DISTANCES
-    parm.tcolor = G_define_option(G_OPT_M_COORDS);
+    parm.tcolor = G_define_standard_option(G_OPT_C);
     parm.tcolor->key = "text_color";
     parm.tcolor->label = _("Text color");
+    parm.tcolor->answer = NULL;
+
+    parm.units = G_define_standard_option(G_OPT_M_UNITS);
+    parm.units->options = "meters,kilometers,feet,miles";
+    parm.units->label = parm.units->description;
+    parm.units->answer = "meters";
 #endif
 
     if (G_parser(argc, argv))
@@ -68,6 +75,13 @@ int main(int argc, char *argv[])
 	G_fatal_error(_("Location is not %s"),
 		      G__projection_name(PROJECTION_LL));
 
+#ifdef CAN_DO_DISTANCES
+    /* get conversion factor and unit name */
+    unit_id = G_units(parm.units->answer);
+    factor = 1. / G_meters_to_units_factor(unit_id);
+    unit = G_get_units_name(unit_id, 1, 0);
+#endif
+
     if (parm.coor->answers[0] == NULL)
 	G_fatal_error(_("No coordinates given"));
 
@@ -98,10 +112,11 @@ int main(int argc, char *argv[])
 	deftcolor = DEFAULT_FG_COLOR;
 
     if (parm.tcolor->answer == NULL)
-	parm.tcolor->answer = deftcolor;
-    text_color = D_translate_color(parm.tcolor->answer);
-    if (!text_color)
 	text_color = D_translate_color(deftcolor);
+    else if (strcmp(parm.tcolor->answer, "none") == 0)
+	text_color = -1;
+    else
+	text_color = D_translate_color(parm.tcolor->answer);
 #endif
 
     plot(lon1, lat1, lon2, lat2, line_color, text_color);