units.c 7.5 KB

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