write.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include <math.h>
  2. #include <grass/vector.h>
  3. #include <grass/glocale.h>
  4. #include "local_proto.h"
  5. static struct line_cats *PCats;
  6. static struct line_pnts *PPoints;
  7. static int point_cat = 1;
  8. void write_point(struct Map_info *Out, double x, double y, double z,
  9. int line_cat, double along, dbDriver *driver, struct field_info *Fi)
  10. {
  11. G_debug(3, "write_point()");
  12. if (!PPoints) {
  13. PCats = Vect_new_cats_struct();
  14. PPoints = Vect_new_line_struct();
  15. }
  16. else {
  17. Vect_reset_line(PPoints);
  18. Vect_reset_cats(PCats);
  19. }
  20. /* Write point */
  21. Vect_append_point(PPoints, x, y, z);
  22. if (line_cat > 0) {
  23. Vect_cat_set(PCats, 1, line_cat);
  24. Vect_cat_set(PCats, 2, point_cat);
  25. }
  26. else {
  27. Vect_cat_set(PCats, 2, point_cat);
  28. }
  29. Vect_write_line(Out, GV_POINT, PPoints, PCats);
  30. /* Attributes */
  31. if (Fi) {
  32. char buf[DB_SQL_MAX];
  33. dbString stmt;
  34. db_init_string(&stmt);
  35. if (line_cat > 0)
  36. sprintf(buf, "insert into %s values ( %d, %d, %.15g )", Fi->table,
  37. point_cat, line_cat, along);
  38. else
  39. sprintf(buf, "insert into %s values ( %d, %.15g )", Fi->table,
  40. point_cat, along);
  41. db_append_string(&stmt, buf);
  42. if (db_execute_immediate(driver, &stmt) != DB_OK) {
  43. G_warning(_("Unable to insert new record: '%s'"),
  44. db_get_string(&stmt));
  45. }
  46. }
  47. point_cat++;
  48. }
  49. void write_line(struct Map_info *Out, struct line_pnts *LPoints, int cat,
  50. int vertex, int interpolate, double dmax,
  51. dbDriver *driver, struct field_info *Fi)
  52. {
  53. if (vertex == GV_VERTEX || vertex == GV_NODE) { /* use line vertices */
  54. double along;
  55. int vert;
  56. along = 0;
  57. for (vert = 0; vert < LPoints->n_points; vert++) {
  58. G_debug(3, "vert = %d", vert);
  59. if (vertex == GV_VERTEX ||
  60. (vertex == GV_NODE &&
  61. (vert == 0 || vert == LPoints->n_points - 1))) {
  62. write_point(Out, LPoints->x[vert], LPoints->y[vert],
  63. LPoints->z[vert], cat, along, driver, Fi);
  64. }
  65. if (vert < LPoints->n_points - 1) {
  66. double dx, dy, dz, len;
  67. dx = LPoints->x[vert + 1] - LPoints->x[vert];
  68. dy = LPoints->y[vert + 1] - LPoints->y[vert];
  69. dz = LPoints->z[vert + 1] - LPoints->z[vert];
  70. len = hypot(hypot(dx, dy), dz);
  71. /* interpolate segment */
  72. if (interpolate && vert < (LPoints->n_points - 1)) {
  73. int i, n;
  74. double x, y, z, dlen;
  75. if (len > dmax) {
  76. n = len / dmax + 1; /* number of segments */
  77. dx /= n;
  78. dy /= n;
  79. dz /= n;
  80. dlen = len / n;
  81. for (i = 1; i < n; i++) {
  82. x = LPoints->x[vert] + i * dx;
  83. y = LPoints->y[vert] + i * dy;
  84. z = LPoints->z[vert] + i * dz;
  85. write_point(Out, x, y, z, cat, along + i * dlen,
  86. driver, Fi);
  87. }
  88. }
  89. }
  90. along += len;
  91. }
  92. }
  93. }
  94. else { /* do not use vertices */
  95. int i, n;
  96. double len, dlen, along, x, y, z;
  97. len = Vect_line_length(LPoints);
  98. n = len / dmax + 1; /* number of segments */
  99. dlen = len / n; /* length of segment */
  100. G_debug(3, "n = %d len = %f dlen = %f", n, len, dlen);
  101. for (i = 0; i <= n; i++) {
  102. if (i > 0 && i < n) {
  103. along = i * dlen;
  104. Vect_point_on_line(LPoints, along, &x, &y, &z, NULL, NULL);
  105. }
  106. else { /* first and last vertex */
  107. if (i == 0) {
  108. along = 0;
  109. x = LPoints->x[0];
  110. y = LPoints->y[0];
  111. z = LPoints->z[0];
  112. }
  113. else { /* last */
  114. along = len;
  115. x = LPoints->x[LPoints->n_points - 1];
  116. y = LPoints->y[LPoints->n_points - 1];
  117. z = LPoints->z[LPoints->n_points - 1];
  118. }
  119. }
  120. G_debug(3, " i = %d along = %f", i, along);
  121. write_point(Out, x, y, z, cat, along, driver, Fi);
  122. }
  123. }
  124. }