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