123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 |
- /*!
- \file lib/gis/units.c
- \brief GIS Library - Units management and conversion
-
- (C) 2001-2010 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.
-
- \author Original author CERL
- \author Adopted for libgis by Martin Landa <landa.martin gmail.com> (2010)
- \author Temporal units and unit type check from Soeren gebbert <soerengebbert googlemail.com> (2012)
- */
- #include <string.h>
- #include <grass/gis.h>
- #include <grass/glocale.h>
- /*!
- \brief Units conversion from meters to units
- Units codes (gis.h):
- - U_METERS
- - U_KILOMETERS
- - U_MILES
- - U_FEET
- - U_USFEET
- Returns a factor which converts meters to units (by multiplication).
-
- \param units units code
- \return factor
- */
- double G_meters_to_units_factor(int units)
- {
- switch (units) {
- case U_METERS:
- return 1.0;
- break;
-
- case U_KILOMETERS:
- return 1.0e-3;
- break;
-
- case U_MILES:
- return 6.21371192237334e-4; /* 1 / (0.0254 * 12 * 5280) */
- break;
-
- case U_FEET:
- return 3.28083989501312; /* 1 / (0.0254 * 12) */
- break;
-
- case U_USFEET:
- return 3.28083333333333; /* 1 / (1200/3937) */
- break;
-
- default:
- return 1.0;
- break;
- }
-
- return 1.0;
- }
- /*!
- \brief Units conversion from square meters to square units
- Units codes (gis.h):
- - U_METERS
- - U_KILOMETERS
- - U_ACRES
- - U_HECTARES
- - U_MILES
- - U_FEET
- - U_USFEET
- Returns a factor which converts square meters to square units (by
- multiplication).
-
- \param units units code
- \return factor
- */
- double G_meters_to_units_factor_sq(int units)
- {
- switch (units) {
- case U_METERS:
- return 1.0;
- break;
-
- case U_KILOMETERS:
- return 1.0e-6;
- break;
-
- case U_ACRES:
- return 2.47105381467165e-4; /* 640 acres in a sq mile */
- break;
-
- case U_HECTARES:
- return 1.0e-4;
- break;
-
- case U_MILES:
- return 3.86102158542446e-7; /* 1 / (0.0254 * 12 * 5280)^2 */
- break;
-
- case U_FEET:
- return 10.7639104167097; /* 1 / (0.0254 * 12)^2 */
- break;
-
- case U_USFEET:
- return 10.7638673611111; /* 1 / (1200/3937)^2 */
- break;
-
- default:
- return 1.0;
- break;
- }
-
- return 1.0;
- }
- /** \brief Check if the unit is of spatial type
-
- \param units units code from gis.h
-
- \return 1 if True, 0 otherwise
- */
- int G_is_units_type_spatial(int units)
- {
- switch (units) {
- case U_METERS:
- return 1;
- case U_KILOMETERS:
- return 1;
- case U_HECTARES:
- return 1;
- case U_ACRES:
- return 1;
- case U_MILES:
- return 1;
- case U_FEET:
- return 1;
- case U_USFEET:
- return 1;
- case U_RADIANS:
- return 1;
- case U_DEGREES:
- return 1;
- }
- return 0;
- }
- /** \brief Check if the unit is of temporal type
-
- \param units units code from gis.h
-
- \return 1 if True, 0 otherwise
- */
- int G_is_units_type_temporal(int units)
- {
- switch (units) {
- case U_YEARS:
- return 1;
- case U_MONTHS:
- return 1;
- case U_DAYS:
- return 1;
- case U_HOURS:
- return 1;
- case U_MINUTES:
- return 1;
- case U_SECONDS:
- return 1;
- }
- return 0;
- }
- /*!
- \brief Get localized units name
- Units codes (gis.h):
- - U_METERS
- - U_KILOMETERS
- - U_ACRES
- - U_HECTARES
- - U_MILES
- - U_FEET
- - U_USFEET
- \param units units code
- \param plural plural form if true
- \param square area units if true
- \return units name
- \return NULL if units not found
- */
- const char *G_get_units_name(int units, int plural, int square)
- {
- switch (units) {
- case U_UNKNOWN:
- if (square)
- return plural ? _("square units") : _("square unit");
- else
- return plural ? _("units") : _("unit");
- break;
-
- case U_METERS:
- if (square)
- return plural ? _("square meters") : _("square meter");
- else
- return plural ? _("meters") : _("meter");
- break;
-
- case U_KILOMETERS:
- if (square)
- return plural ? _("square kilometers") : _("square kilometer");
- else
- return plural ? _("kilometers") : _("kilometer");
- break;
-
- case U_ACRES:
- if (square)
- return plural ? _("acres") : _("acre");
- else
- return G_get_units_name(G_units(G_database_unit_name(1)),
- plural, square);
- break;
-
- case U_HECTARES:
- if (square)
- return plural ? _("hectares") : _("hectare");
- else
- return G_get_units_name(G_units(G_database_unit_name(1)),
- plural, square);
- break;
-
- case U_MILES:
- if (square)
- return plural ? _("square miles") : _("square mile");
- else
- return plural ? _("miles") : _("mile");
- break;
-
- case U_FEET:
- if (square)
- return plural ? _("square feet") : _("square foot");
- else
- return plural ? _("feet") : _("foot");
- break;
- case U_USFEET:
- if (square)
- return plural ? _("square US feet") : _("square US foot");
- else
- return plural ? _("US feet") : _("US foot");
- break;
- case U_DEGREES:
- if (square)
- return plural ? _("square degrees") : _("square degree");
- else
- return plural ? _("degrees") : _("degree");
- break;
-
- case U_YEARS:
- return plural ? _("years") : _("year");
- break;
-
- case U_MONTHS:
- return plural ? _("months") : _("month");
- break;
-
- case U_DAYS:
- return plural ? _("days") : _("day");
- break;
-
- case U_HOURS:
- return plural ? _("hours") : _("hour");
- break;
-
- case U_MINUTES:
- return plural ? _("minutes") : _("minute");
- break;
-
- case U_SECONDS:
- return plural ? _("seconds") : _("second");
- break;
- }
-
- return NULL;
- }
- /*!
- \brief Get units code by name
- Units codes (gis.h):
- - U_METERS
- - U_KILOMETERS
- - U_ACRES
- - U_HECTARES
- - U_MILES
- - U_FEET
- - U_USFEET
- - ...
- - U_YEARS
- - ...
- \param units_name units name (singular or plural form)
- \return units code
- \return U_UNKNOWN if not found
- */
- int G_units(const char *units_name)
- {
- if (units_name == NULL) {
- return G_units(G_database_unit_name(1));
- }
-
- if (strcasecmp(units_name, "meter") == 0 ||
- strcasecmp(units_name, "meters") == 0)
- return U_METERS;
- else if (strcasecmp(units_name, "kilometer") == 0 ||
- strcasecmp(units_name, "kilometers") == 0)
- return U_KILOMETERS;
- else if (strcasecmp(units_name, "acre") == 0 ||
- strcasecmp(units_name, "acres") == 0)
- return U_ACRES;
- else if (strcasecmp(units_name, "hectare") == 0 ||
- strcasecmp(units_name, "hectares") == 0)
- return U_HECTARES;
- else if (strcasecmp(units_name, "mile") == 0 ||
- strcasecmp(units_name, "miles") == 0)
- return U_MILES;
- else if (strcasecmp(units_name, "foot") == 0 ||
- strcasecmp(units_name, "feet") == 0)
- return U_FEET;
- else if (strcasecmp(units_name, "foot_us") == 0 ||
- strcasecmp(units_name, "foot_uss") == 0)
- return U_USFEET;
- else if (strcasecmp(units_name, "degree") == 0 ||
- strcasecmp(units_name, "degrees") == 0)
- return U_DEGREES;
- else if (strcasecmp(units_name, "year") == 0 ||
- strcasecmp(units_name, "years") == 0)
- return U_YEARS;
- else if (strcasecmp(units_name, "month") == 0 ||
- strcasecmp(units_name, "months") == 0)
- return U_MONTHS;
- else if (strcasecmp(units_name, "day") == 0 ||
- strcasecmp(units_name, "days") == 0)
- return U_DAYS;
- else if (strcasecmp(units_name, "hour") == 0 ||
- strcasecmp(units_name, "hours") == 0)
- return U_HOURS;
- else if (strcasecmp(units_name, "minute") == 0 ||
- strcasecmp(units_name, "minutes") == 0)
- return U_MINUTES;
- else if (strcasecmp(units_name, "secons") == 0 ||
- strcasecmp(units_name, "seconds") == 0)
- return U_SECONDS;
- return U_UNKNOWN;
- }
|