1 /*
2 * exec.c --
3 *
4 * Loop through all files to be rectified and do the retification.
5 * Handles things like support files.
6 */
7
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include <string.h>
11 #include <sys/types.h>
12 #include <sys/stat.h>
13 #include <fcntl.h>
14 #include <time.h>
15 #include <unistd.h>
16 #include <math.h>
17 #include "global.h"
18
exec_rectify(struct Ortho_Image_Group * group,int * ref_list,char * extension,char * interp_method,char * angle_map)19 int exec_rectify(struct Ortho_Image_Group *group, int *ref_list,
20 char *extension, char *interp_method, char *angle_map)
21 {
22 char *name;
23 char *mapset;
24 char *result;
25 char *type = "raster";
26 int n;
27 struct Colors colr;
28 struct Categories cats;
29 struct History hist;
30 int colr_ok, cats_ok;
31 time_t start_time, rectify_time;
32 double aver_z;
33 int elevfd;
34 struct cache *ebuffer;
35
36 G_debug(1, "Open elevation raster: ");
37
38 /* open elevation raster */
39 select_target_env();
40 G_set_window(&target_window);
41 G_debug(1, "target window: rs=%d cs=%d n=%f s=%f w=%f e=%f\n",
42 target_window.rows, target_window.cols, target_window.north,
43 target_window.south, target_window.west, target_window.east);
44
45 elevfd = Rast_open_old(elev_name, elev_mapset);
46 if (elevfd < 0) {
47 G_fatal_error(_("Could not open elevation raster"));
48 return 1;
49 }
50 ebuffer = readcell(elevfd, seg_mb_elev, 1);
51 select_target_env();
52 Rast_close(elevfd);
53
54 /* get an average elevation of the control points */
55 /* this is used only if target cells have no elevation */
56 get_aver_elev(&group->control_points, &aver_z);
57
58 G_message("-----------------------------------------------");
59
60 /* rectify each file */
61 for (n = 0; n < group->group_ref.nfiles; n++) {
62 if (!ref_list[n])
63 continue;
64
65 name = group->group_ref.file[n].name;
66 mapset = group->group_ref.file[n].mapset;
67 result =
68 G_malloc(strlen(group->group_ref.file[n].name) + strlen(extension) + 1);
69 strcpy(result, group->group_ref.file[n].name);
70 strcat(result, extension);
71
72 G_debug(2, "ORTHO RECTIFYING:");
73 G_debug(2, "NAME %s", name);
74 G_debug(2, "MAPSET %s", mapset);
75 G_debug(2, "RESULT %s", result);
76 G_debug(2, "select_current_env...");
77
78 select_current_env();
79
80 cats_ok = Rast_read_cats(name, mapset, &cats) >= 0;
81 colr_ok = Rast_read_colors(name, mapset, &colr) > 0;
82
83 /* Initialze History */
84 if (Rast_read_history(name, mapset, &hist) < 0)
85 Rast_short_history(result, type, &hist);
86 G_debug(2, "reading was fine...");
87
88 time(&start_time);
89
90 G_debug(2, "Starting the rectification...");
91
92 if (rectify(group, name, mapset, ebuffer, aver_z, result, interp_method)) {
93 G_debug(2, "Done. Writing results...");
94 select_target_env();
95 if (cats_ok) {
96 Rast_write_cats(result, &cats);
97 Rast_free_cats(&cats);
98 }
99 if (colr_ok) {
100 Rast_write_colors(result, G_mapset(), &colr);
101 Rast_free_colors(&colr);
102 }
103 /* Write out History */
104 Rast_command_history(&hist);
105 Rast_write_history(result, &hist);
106
107 select_current_env();
108 time(&rectify_time);
109 report(rectify_time - start_time, 1);
110 }
111 else
112 report(0, 0);
113
114 G_free(result);
115 }
116
117 close(ebuffer->fd);
118 release_cache(ebuffer);
119
120 if (angle_map) {
121 camera_angle(group, angle_map);
122 }
123
124 return 0;
125 }
126