get_wind.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include <math.h>
  2. #include <grass/glocale.h>
  3. #include "global.h"
  4. int georef_window(struct Cell_head *w1, struct Cell_head *w2, int order, double res)
  5. {
  6. double n, e, ad;
  7. struct _corner {
  8. double n, e;
  9. } nw, ne, se, sw;
  10. /* extends */
  11. if (order == 0)
  12. I_georef_tps(w1->west, w1->north, &e, &n, E12_t, N12_t, &cp, 1);
  13. else
  14. I_georef(w1->west, w1->north, &e, &n, E12, N12, order);
  15. w2->north = w2->south = n;
  16. w2->west = w2->east = e;
  17. nw.n = n;
  18. nw.e = e;
  19. if (order == 0)
  20. I_georef_tps(w1->east, w1->north, &e, &n, E12_t, N12_t, &cp, 1);
  21. else
  22. I_georef(w1->east, w1->north, &e, &n, E12, N12, order);
  23. ne.n = n;
  24. ne.e = e;
  25. if (n > w2->north)
  26. w2->north = n;
  27. if (n < w2->south)
  28. w2->south = n;
  29. if (e > w2->east)
  30. w2->east = e;
  31. if (e < w2->west)
  32. w2->west = e;
  33. if (order == 0)
  34. I_georef_tps(w1->west, w1->south, &e, &n, E12_t, N12_t, &cp, 1);
  35. else
  36. I_georef(w1->west, w1->south, &e, &n, E12, N12, order);
  37. sw.n = n;
  38. sw.e = e;
  39. if (n > w2->north)
  40. w2->north = n;
  41. if (n < w2->south)
  42. w2->south = n;
  43. if (e > w2->east)
  44. w2->east = e;
  45. if (e < w2->west)
  46. w2->west = e;
  47. if (order == 0)
  48. I_georef_tps(w1->east, w1->south, &e, &n, E12_t, N12_t, &cp, 1);
  49. else
  50. I_georef(w1->east, w1->south, &e, &n, E12, N12, order);
  51. se.n = n;
  52. se.e = e;
  53. if (n > w2->north)
  54. w2->north = n;
  55. if (n < w2->south)
  56. w2->south = n;
  57. if (e > w2->east)
  58. w2->east = e;
  59. if (e < w2->west)
  60. w2->west = e;
  61. /* resolution */
  62. if (res > 0)
  63. w2->ew_res = w2->ns_res = res;
  64. else {
  65. /* this results in ugly res values, and ns_res != ew_res */
  66. /* and is no good for rotation */
  67. /*
  68. w2->ns_res = (w2->north - w2->south) / w1->rows;
  69. w2->ew_res = (w2->east - w2->west) / w1->cols;
  70. */
  71. /* alternative: account for rotation and order > 1 */
  72. /* N-S extends along western and eastern edge */
  73. w2->ns_res = (sqrt((nw.n - sw.n) * (nw.n - sw.n) +
  74. (nw.e - sw.e) * (nw.e - sw.e)) +
  75. sqrt((ne.n - se.n) * (ne.n - se.n) +
  76. (ne.e - se.e) * (ne.e - se.e))) / (2.0 * w1->rows);
  77. /* E-W extends along northern and southern edge */
  78. w2->ew_res = (sqrt((nw.n - ne.n) * (nw.n - ne.n) +
  79. (nw.e - ne.e) * (nw.e - ne.e)) +
  80. sqrt((sw.n - se.n) * (sw.n - se.n) +
  81. (sw.e - se.e) * (sw.e - se.e))) / (2.0 * w1->cols);
  82. /* make ew_res = ns_res */
  83. w2->ns_res = (w2->ns_res + w2->ew_res) / 2.0;
  84. w2->ew_res = w2->ns_res;
  85. /* nice round values */
  86. if (w2->ns_res > 1) {
  87. if (w2->ns_res < 10) {
  88. /* round to first decimal */
  89. w2->ns_res = (int)(w2->ns_res * 10 + 0.5) / 10.0;
  90. w2->ew_res = w2->ns_res;
  91. }
  92. else {
  93. /* round to integer */
  94. w2->ns_res = (int)(w2->ns_res + 0.5);
  95. w2->ew_res = w2->ns_res;
  96. }
  97. }
  98. }
  99. /* adjust extends */
  100. ad = w2->north > 0 ? 0.5 : -0.5;
  101. w2->north = (int) (ceil(w2->north / w2->ns_res) + ad) * w2->ns_res;
  102. ad = w2->south > 0 ? 0.5 : -0.5;
  103. w2->south = (int) (floor(w2->south / w2->ns_res) + ad) * w2->ns_res;
  104. ad = w2->east > 0 ? 0.5 : -0.5;
  105. w2->east = (int) (ceil(w2->east / w2->ew_res) + ad) * w2->ew_res;
  106. ad = w2->west > 0 ? 0.5 : -0.5;
  107. w2->west = (int) (floor(w2->west / w2->ew_res) + ad) * w2->ew_res;
  108. w2->rows = (w2->north - w2->south + w2->ns_res / 2.0) / w2->ns_res;
  109. w2->cols = (w2->east - w2->west + w2->ew_res / 2.0) / w2->ew_res;
  110. G_message(_("Region N=%f S=%f E=%f W=%f"), w2->north, w2->south,
  111. w2->east, w2->west);
  112. G_message(_("Resolution EW=%f NS=%f"), w2->ew_res, w2->ns_res);
  113. return 0;
  114. }