123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- /****************************************************************************
- *
- * MODULE: r.buffer
- *
- * AUTHOR(S): Michael Shapiro - CERL
- *
- * PURPOSE: This program creates distance zones from non-zero
- * cells in a grid layer. Distances are specified in
- * meters (on the command-line). Window does not have to
- * have square cells. Works both for planimetric
- * (UTM, State Plane) and lat-long.
- *
- * COPYRIGHT: (C) 2005 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
- * for details.
- *
- ****************************************************************************/
- #include <stdlib.h>
- #include "distance.h"
- #include <grass/glocale.h>
- static int cmp(const void *, const void *);
- static int scan_dist(char *, double *);
- int parse_distances(char **zone_list, double to_meters)
- {
- double dist;
- double ew2 = 0.0;
- int i;
- int count;
- for (count = 0; zone_list[count]; count++) ;
- if (count <= 0)
- return 0;
- /* create an array to hold the distances */
- distances = (struct Distance *)G_calloc(count, sizeof(struct Distance));
- /* scan the command line for the distances */
- if (window.proj != PROJECTION_LL) {
- ew2 = window.ew_res * window.ew_res;
- ns_to_ew_squared = window.ns_res * window.ns_res / ew2;
- }
- for (i = 0; i < count; i++) {
- if (!scan_dist(zone_list[i], &dist)) {
- G_warning(_("%s: %s - illegal distance specification"),
- pgm_name, zone_list[i]);
- return 0;
- }
- else {
- dist *= (to_meters * meters_to_grid);
- if (window.proj != PROJECTION_LL)
- dist = dist * dist / ew2;
- distances[i].dist = dist;
- }
- distances[i].label = zone_list[i];
- }
- /* sort the distances in increasing order */
- qsort(distances, count, sizeof(struct Distance), cmp);
- return count;
- }
- static int cmp(const void *aa, const void *bb)
- {
- const struct Distance *a = aa, *b = bb;
- if (a->dist < b->dist)
- return -1;
- return a->dist > b->dist;
- }
- static int scan_dist(char *s, double *dist)
- {
- char dummy[2];
- *dummy = 0;
- if (sscanf(s, "%lf%1s", dist, dummy) != 1)
- return 0;
- if (*dummy)
- return 0;
- if (*dist <= 0.0)
- return 0;
- return 1;
- }
|