units.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. /*!
  2. \file gis/units.c
  3. \brief GIS Library - Units management and conversion
  4. (C) 2001-2010 by the GRASS Development Team
  5. This program is free software under the GNU General Public License
  6. (>=v2). Read the file COPYING that comes with GRASS for details.
  7. \author Original author CERL
  8. \author Adopted for libgis by Martin Landa <landa.martin gmail.com> (2010)
  9. */
  10. #include <string.h>
  11. #include <grass/gis.h>
  12. #include <grass/glocale.h>
  13. /*!
  14. \brief Units conversion to meters
  15. Units codes (gis.h):
  16. - U_METERS
  17. - U_KILOMETERS
  18. - U_MILES
  19. - U_FEET
  20. Returns a factor which converts the grid unit to meters (by
  21. multiplication).
  22. \param units units code
  23. \return factor
  24. */
  25. double G_units_to_meters_factor(int units)
  26. {
  27. switch (units) {
  28. case U_METERS:
  29. return 1.0;
  30. break;
  31. case U_KILOMETERS:
  32. return 1.0e-3;
  33. break;
  34. case U_MILES:
  35. return 6.21371192237334e-4; /* 1 / (0.0254 * 12 * 5280) */
  36. break;
  37. case U_FEET:
  38. return 3.28083989501312; /* 1 / (0.0254 * 12) */
  39. break;
  40. default:
  41. return 1.0;
  42. break;
  43. }
  44. return 1.0;
  45. }
  46. /*!
  47. \brief Units conversion to square meters
  48. Units codes (gis.h):
  49. - U_METERS
  50. - U_KILOMETERS
  51. - U_ACRES
  52. - U_HECTARES
  53. - U_MILES
  54. - U_FEET
  55. Returns a factor which converts the grid unit to square meters (by
  56. multiplication).
  57. \param units units code
  58. \return factor
  59. */
  60. double G_units_to_meters_factor_sq(int units)
  61. {
  62. switch (units) {
  63. case U_METERS:
  64. return 1.0;
  65. break;
  66. case U_KILOMETERS:
  67. return 1.0e-6;
  68. break;
  69. case U_ACRES:
  70. return 2.47105381467165e-4; /* 640 acres in a sq mile */
  71. break;
  72. case U_HECTARES:
  73. return 1.0e-4;
  74. break;
  75. case U_MILES:
  76. return 3.86102158542446e-7; /* 1 / (0.0254 * 12 * 5280)^2 */
  77. break;
  78. case U_FEET:
  79. return 10.7639104167097; /* 1 / (0.0254 * 12)^2 */
  80. break;
  81. default:
  82. return 1.0;
  83. break;
  84. }
  85. return 1.0;
  86. }
  87. /*!
  88. \brief Get localized units name
  89. Units codes (gis.h):
  90. - U_METERS
  91. - U_KILOMETERS
  92. - U_ACRES
  93. - U_HECTARES
  94. - U_MILES
  95. - U_FEET
  96. \param units units code
  97. \param plural plural form if true
  98. \param square area units if true
  99. \return units name
  100. \return NULL if units not found
  101. */
  102. const char *G_get_units_name(int units, int plural, int square)
  103. {
  104. switch (units) {
  105. case U_UNKNOWN:
  106. if (square)
  107. return plural ? _("square units") : _("square unit");
  108. else
  109. return plural ? _("units") : _("unit");
  110. break;
  111. case U_METERS:
  112. if (square)
  113. return plural ? _("square meters") : _("square meter");
  114. else
  115. return plural ? _("meters") : _("meter");
  116. break;
  117. case U_KILOMETERS:
  118. if (square)
  119. return plural ? _("square kilometers") : _("square kilometer");
  120. else
  121. return plural ? _("kilometers") : _("kilometer");
  122. break;
  123. case U_ACRES:
  124. if (square)
  125. return plural ? _("acres") : _("acre");
  126. else
  127. return G_get_units_name(G_units(G_database_unit_name(1)),
  128. plural, square);
  129. break;
  130. case U_HECTARES:
  131. if (square)
  132. return plural ? _("hectares") : _("hectare");
  133. else
  134. return G_get_units_name(G_units(G_database_unit_name(1)),
  135. plural, square);
  136. break;
  137. case U_MILES:
  138. if (square)
  139. return plural ? _("square miles") : _("square mile");
  140. else
  141. return plural ? _("miles") : _("mile");
  142. break;
  143. case U_FEET:
  144. if (square)
  145. return plural ? _("square feet") : _("square foot");
  146. else
  147. return plural ? _("feet") : _("foot");
  148. break;
  149. case U_DEGREES:
  150. if (square)
  151. return plural ? _("square degrees") : _("square degree");
  152. else
  153. return plural ? _("degrees") : _("degree");
  154. break;
  155. }
  156. return NULL;
  157. }
  158. /*!
  159. \brief Get units code by name
  160. Units codes (gis.h):
  161. - U_METERS
  162. - U_KILOMETERS
  163. - U_ACRES
  164. - U_HECTARES
  165. - U_MILES
  166. - U_FEET
  167. \param units_name units name (singular or plural form)
  168. \return units code
  169. \return U_UNKNOWN if not found
  170. */
  171. int G_units(const char *units_name)
  172. {
  173. if (units_name == NULL) {
  174. return G_units(G_database_unit_name(1));
  175. }
  176. if (strcasecmp(units_name, "meter") == 0 ||
  177. strcasecmp(units_name, "meters") == 0)
  178. return U_METERS;
  179. else if (strcasecmp(units_name, "kilometer") == 0 ||
  180. strcasecmp(units_name, "kilometers") == 0)
  181. return U_KILOMETERS;
  182. else if (strcasecmp(units_name, "acre") == 0 ||
  183. strcasecmp(units_name, "acres") == 0)
  184. return U_ACRES;
  185. else if (strcasecmp(units_name, "hectare") == 0 ||
  186. strcasecmp(units_name, "hectares") == 0)
  187. return U_HECTARES;
  188. else if (strcasecmp(units_name, "mile") == 0 ||
  189. strcasecmp(units_name, "miles") == 0)
  190. return U_MILES;
  191. else if (strcasecmp(units_name, "foot") == 0 ||
  192. strcasecmp(units_name, "feet") == 0)
  193. return U_FEET;
  194. else if (strcasecmp(units_name, "degree") == 0 ||
  195. strcasecmp(units_name, "degrees") == 0)
  196. return U_DEGREES;
  197. return U_UNKNOWN;
  198. }