units.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  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. \author Temporal units and unit type check from Soeren gebbert <soerengebbert googlemail.com> (2012)
  10. */
  11. #include <string.h>
  12. #include <grass/gis.h>
  13. #include <grass/glocale.h>
  14. /*!
  15. \brief Units conversion to meters
  16. Units codes (gis.h):
  17. - U_METERS
  18. - U_KILOMETERS
  19. - U_MILES
  20. - U_FEET
  21. Returns a factor which converts the grid unit to meters (by
  22. multiplication).
  23. \param units units code
  24. \return factor
  25. */
  26. double G_units_to_meters_factor(int units)
  27. {
  28. switch (units) {
  29. case U_METERS:
  30. return 1.0;
  31. break;
  32. case U_KILOMETERS:
  33. return 1.0e-3;
  34. break;
  35. case U_MILES:
  36. return 6.21371192237334e-4; /* 1 / (0.0254 * 12 * 5280) */
  37. break;
  38. case U_FEET:
  39. return 3.28083989501312; /* 1 / (0.0254 * 12) */
  40. break;
  41. default:
  42. return 1.0;
  43. break;
  44. }
  45. return 1.0;
  46. }
  47. /*!
  48. \brief Units conversion to square meters
  49. Units codes (gis.h):
  50. - U_METERS
  51. - U_KILOMETERS
  52. - U_ACRES
  53. - U_HECTARES
  54. - U_MILES
  55. - U_FEET
  56. Returns a factor which converts the grid unit to square meters (by
  57. multiplication).
  58. \param units units code
  59. \return factor
  60. */
  61. double G_units_to_meters_factor_sq(int units)
  62. {
  63. switch (units) {
  64. case U_METERS:
  65. return 1.0;
  66. break;
  67. case U_KILOMETERS:
  68. return 1.0e-6;
  69. break;
  70. case U_ACRES:
  71. return 2.47105381467165e-4; /* 640 acres in a sq mile */
  72. break;
  73. case U_HECTARES:
  74. return 1.0e-4;
  75. break;
  76. case U_MILES:
  77. return 3.86102158542446e-7; /* 1 / (0.0254 * 12 * 5280)^2 */
  78. break;
  79. case U_FEET:
  80. return 10.7639104167097; /* 1 / (0.0254 * 12)^2 */
  81. break;
  82. default:
  83. return 1.0;
  84. break;
  85. }
  86. return 1.0;
  87. }
  88. /** \brief Check if the unit is of spatial type
  89. \param units units code from gis.h
  90. \return 1 if True, 0 otherwise
  91. */
  92. int G_is_units_type_spatial(int units)
  93. {
  94. switch (units) {
  95. case U_METERS:
  96. return 1;
  97. case U_KILOMETERS:
  98. return 1;
  99. case U_HECTARES:
  100. return 1;
  101. case U_ACRES:
  102. return 1;
  103. case U_MILES:
  104. return 1;
  105. case U_FEET:
  106. return 1;
  107. case U_RADIANS:
  108. return 1;
  109. case U_DEGREES:
  110. return 1;
  111. }
  112. return 0;
  113. }
  114. /** \brief Check if the unit is of temporal type
  115. \param units units code from gis.h
  116. \return 1 if True, 0 otherwise
  117. */
  118. int G_is_units_type_temporal(int units)
  119. {
  120. switch (units) {
  121. case U_YEARS:
  122. return 1;
  123. case U_MONTHS:
  124. return 1;
  125. case U_DAYS:
  126. return 1;
  127. case U_HOURS:
  128. return 1;
  129. case U_MINUTES:
  130. return 1;
  131. case U_SECONDS:
  132. return 1;
  133. }
  134. return 0;
  135. }
  136. /*!
  137. \brief Get localized units name
  138. Units codes (gis.h):
  139. - U_METERS
  140. - U_KILOMETERS
  141. - U_ACRES
  142. - U_HECTARES
  143. - U_MILES
  144. - U_FEET
  145. \param units units code
  146. \param plural plural form if true
  147. \param square area units if true
  148. \return units name
  149. \return NULL if units not found
  150. */
  151. const char *G_get_units_name(int units, int plural, int square)
  152. {
  153. switch (units) {
  154. case U_UNKNOWN:
  155. if (square)
  156. return plural ? _("square units") : _("square unit");
  157. else
  158. return plural ? _("units") : _("unit");
  159. break;
  160. case U_METERS:
  161. if (square)
  162. return plural ? _("square meters") : _("square meter");
  163. else
  164. return plural ? _("meters") : _("meter");
  165. break;
  166. case U_KILOMETERS:
  167. if (square)
  168. return plural ? _("square kilometers") : _("square kilometer");
  169. else
  170. return plural ? _("kilometers") : _("kilometer");
  171. break;
  172. case U_ACRES:
  173. if (square)
  174. return plural ? _("acres") : _("acre");
  175. else
  176. return G_get_units_name(G_units(G_database_unit_name(1)),
  177. plural, square);
  178. break;
  179. case U_HECTARES:
  180. if (square)
  181. return plural ? _("hectares") : _("hectare");
  182. else
  183. return G_get_units_name(G_units(G_database_unit_name(1)),
  184. plural, square);
  185. break;
  186. case U_MILES:
  187. if (square)
  188. return plural ? _("square miles") : _("square mile");
  189. else
  190. return plural ? _("miles") : _("mile");
  191. break;
  192. case U_FEET:
  193. if (square)
  194. return plural ? _("square feet") : _("square foot");
  195. else
  196. return plural ? _("feet") : _("foot");
  197. break;
  198. case U_DEGREES:
  199. if (square)
  200. return plural ? _("square degrees") : _("square degree");
  201. else
  202. return plural ? _("degrees") : _("degree");
  203. break;
  204. case U_YEARS:
  205. return plural ? _("years") : _("year");
  206. break;
  207. case U_MONTHS:
  208. return plural ? _("months") : _("month");
  209. break;
  210. case U_DAYS:
  211. return plural ? _("days") : _("day");
  212. break;
  213. case U_HOURS:
  214. return plural ? _("hours") : _("hour");
  215. break;
  216. case U_MINUTES:
  217. return plural ? _("minutes") : _("minute");
  218. break;
  219. case U_SECONDS:
  220. return plural ? _("seconds") : _("second");
  221. break;
  222. }
  223. return NULL;
  224. }
  225. /*!
  226. \brief Get units code by name
  227. Units codes (gis.h):
  228. - U_METERS
  229. - U_KILOMETERS
  230. - U_ACRES
  231. - U_HECTARES
  232. - U_MILES
  233. - U_FEET
  234. - ...
  235. - U_YEARS
  236. - ...
  237. \param units_name units name (singular or plural form)
  238. \return units code
  239. \return U_UNKNOWN if not found
  240. */
  241. int G_units(const char *units_name)
  242. {
  243. if (units_name == NULL) {
  244. return G_units(G_database_unit_name(1));
  245. }
  246. if (strcasecmp(units_name, "meter") == 0 ||
  247. strcasecmp(units_name, "meters") == 0)
  248. return U_METERS;
  249. else if (strcasecmp(units_name, "kilometer") == 0 ||
  250. strcasecmp(units_name, "kilometers") == 0)
  251. return U_KILOMETERS;
  252. else if (strcasecmp(units_name, "acre") == 0 ||
  253. strcasecmp(units_name, "acres") == 0)
  254. return U_ACRES;
  255. else if (strcasecmp(units_name, "hectare") == 0 ||
  256. strcasecmp(units_name, "hectares") == 0)
  257. return U_HECTARES;
  258. else if (strcasecmp(units_name, "mile") == 0 ||
  259. strcasecmp(units_name, "miles") == 0)
  260. return U_MILES;
  261. else if (strcasecmp(units_name, "foot") == 0 ||
  262. strcasecmp(units_name, "feet") == 0)
  263. return U_FEET;
  264. else if (strcasecmp(units_name, "degree") == 0 ||
  265. strcasecmp(units_name, "degrees") == 0)
  266. return U_DEGREES;
  267. else if (strcasecmp(units_name, "year") == 0 ||
  268. strcasecmp(units_name, "years") == 0)
  269. return U_YEARS;
  270. else if (strcasecmp(units_name, "month") == 0 ||
  271. strcasecmp(units_name, "months") == 0)
  272. return U_MONTHS;
  273. else if (strcasecmp(units_name, "day") == 0 ||
  274. strcasecmp(units_name, "days") == 0)
  275. return U_DAYS;
  276. else if (strcasecmp(units_name, "hour") == 0 ||
  277. strcasecmp(units_name, "hours") == 0)
  278. return U_HOURS;
  279. else if (strcasecmp(units_name, "minute") == 0 ||
  280. strcasecmp(units_name, "minutes") == 0)
  281. return U_MINUTES;
  282. else if (strcasecmp(units_name, "secons") == 0 ||
  283. strcasecmp(units_name, "seconds") == 0)
  284. return U_SECONDS;
  285. return U_UNKNOWN;
  286. }