/*------------------------------------------------------------------------------------------------*/ void P_Sparse_Points(struct Map_info *Out, struct Cell_head *Elaboration, BOUND_BOX General, BOUND_BOX Overlap, double **obs, double *param, int *line_num, double pe, double pn, double overlap, int nsplx, int nsply, int num_points, int bilin, struct line_cats *categories, dbDriver * driver, double mean, char *tab_name) { int i; char buf[1024]; dbString sql; double interpolation, csi, eta, weight; struct line_pnts *point; point = Vect_new_line_struct(); db_begin_transaction(driver); for (i = 0; i < num_points; i++) { if (Vect_point_in_box(obs[i][0], obs[i][1], mean, &General)) { /*Here mean is just for asking if obs point is in box */ if (bilin) interpolation = dataInterpolateBilin(obs[i][0], obs[i][1], pe, pn, nsplx, nsply, Elaboration->west, Elaboration->south, param); else interpolation = dataInterpolateBicubic(obs[i][0], obs[i][1], pe, pn, nsplx, nsply, Elaboration->west, Elaboration->south, param); interpolation += mean; Vect_copy_xyz_to_pnts(point, &obs[i][0], &obs[i][1], &interpolation, 1); if (Vect_point_in_box(obs[i][0], obs[i][1], interpolation, &Overlap)) { /*(5) */ Vect_write_line(Out, GV_POINT, point, categories); } else { db_init_string(&sql); sprintf(buf, "INSERT INTO %s (ID, X, Y, Interp)", tab_name); db_append_string(&sql, buf); sprintf(buf, " VALUES ("); db_append_string(&sql, buf); sprintf(buf, "%d, %f, %f, ", line_num[i], obs[i][0], obs[i][1]); db_append_string(&sql, buf); if ((*point->x > Overlap.E) && (*point->x < General.E)) { if ((*point->y > Overlap.N) && (*point->y < General.N)) { /*(3) */ csi = (General.E - *point->x) / overlap; eta = (General.N - *point->y) / overlap; weight = csi * eta; *point->z = weight * interpolation; sprintf(buf, "%lf", *point->z); db_append_string(&sql, buf); sprintf(buf, ")"); db_append_string(&sql, buf); if (db_execute_immediate(driver, &sql) != DB_OK) G_fatal_error(_("Unable to access table <%s>"), buf); } else if ((*point->y < Overlap.S) && (*point->y > General.S)) { /*(1) */ csi = (General.E - *point->x) / overlap; eta = (*point->y - General.S) / overlap; weight = csi * eta; *point->z = weight * interpolation; sprintf(buf, "%lf", *point->z); db_append_string(&sql, buf); sprintf(buf, ")"); db_append_string(&sql, buf); if (db_execute_immediate(driver, &sql) != DB_OK) G_fatal_error(_("Unable to access table <%s>"), buf); } else if ((*point->y <= Overlap.N) && (*point->y >= Overlap.S)) { /*(1) */ weight = (General.E - *point->x) / overlap; *point->z = weight * interpolation; sprintf(buf, "%lf", *point->z); db_append_string(&sql, buf); sprintf(buf, ")"); db_append_string(&sql, buf); if (db_execute_immediate(driver, &sql) != DB_OK) G_fatal_error(_("Unable to access table <%s>"), buf); } } else if ((*point->x < Overlap.W) && (*point->x > General.W)) { if ((*point->y > Overlap.N) && (*point->y < General.N)) { /*(4) */ csi = (*point->x - General.W) / overlap; eta = (General.N - *point->y) / overlap; weight = eta * csi; *point->z = weight * interpolation; sprintf(buf, "%lf", *point->z); db_append_string(&sql, buf); sprintf(buf, ")"); db_append_string(&sql, buf); if (db_execute_immediate(driver, &sql) != DB_OK) G_fatal_error(_("Unable to access table <%s>"), buf); } else if ((*point->y < Overlap.S) && (*point->y > General.S)) { /*(2) */ csi = (*point->x - General.W) / overlap; eta = (*point->y - General.S) / overlap; weight = csi * eta; *point->z = weight * interpolation; sprintf(buf, "%lf", *point->z); db_append_string(&sql, buf); sprintf(buf, ")"); db_append_string(&sql, buf); if (db_execute_immediate(driver, &sql) != DB_OK) G_fatal_error(_("Unable to access table <%s>"), buf); } else if ((*point->y >= Overlap.S) && (*point->y <= Overlap.N)) { /*(2) */ weight = (*point->x - General.W) / overlap; *point->z = weight * interpolation; sprintf(buf, "%lf", *point->z); db_append_string(&sql, buf); sprintf(buf, ")"); db_append_string(&sql, buf); if (db_execute_immediate(driver, &sql) != DB_OK) G_fatal_error(_("Unable to access table <%s>"), buf); } } else if ((*point->x >= Overlap.W) && (*point->x <= Overlap.E)){ if ((*point->y > Overlap.N) && (*point->y < General.N)) { /*(3) */ weight = (General.N - *point->y) / overlap; *point->z = weight * interpolation; sprintf(buf, "%lf", *point->z); db_append_string(&sql, buf); sprintf(buf, ")"); db_append_string(&sql, buf); if (db_execute_immediate(driver, &sql) != DB_OK) G_fatal_error(_("Unable to access table <%s>"), buf); } else if ((*point->y < Overlap.S) && (*point->y > General.S)) { /*(1) */ weight = (*point->y - General.S) / overlap; *point->z = (1 - weight) * interpolation; sprintf(buf, "%lf", *point->z); db_append_string(&sql, buf); sprintf(buf, ")"); db_append_string(&sql, buf); if (db_execute_immediate(driver, &sql) != DB_OK) G_fatal_error(_("Unable to access table <%s>"), buf); } } } } /*IF*/ } /*FOR*/ db_commit_transaction(driver); return; }
int P_Sparse_Raster_Points(SEGMENT *out_seg, struct Cell_head *Elaboration, struct Cell_head *Original, struct bound_box General, struct bound_box Overlap, struct Point *obs, double *param, double pe, double pn, double overlap, int nsplx, int nsply, int num_points, int bilin, double mean) { int i, row, col; double X, Y, interpolation, csi, eta, weight, dval; int points_in_box = 0; /* Reading points inside output region and inside general box */ /* all points available here are inside the output box, * selected by P_Read_Raster_Region_Nulls(), no check needed */ for (i = 0; i < num_points; i++) { X = obs[i].coordX; Y = obs[i].coordY; /* X,Y are cell center cordinates, MUST be inside General box */ row = (int) (floor(Rast_northing_to_row(Y, Original)) + 0.1); col = (int) (floor((X - Original->west) / Original->ew_res) + 0.1); if (row < 0 || row >= Original->rows) { G_fatal_error("row index out of range"); continue; } if (col < 0 || col >= Original->cols) { G_fatal_error("col index out of range"); continue; } points_in_box++; G_debug(3, "P_Sparse_Raster_Points: interpolate point %d...", i); if (bilin) interpolation = dataInterpolateBilin(X, Y, pe, pn, nsplx, nsply, Elaboration->west, Elaboration->south, param); else interpolation = dataInterpolateBicubic(X, Y, pe, pn, nsplx, nsply, Elaboration->west, Elaboration->south, param); interpolation += mean; if (Vect_point_in_box(X, Y, interpolation, &Overlap)) { /* (5) */ dval = interpolation; } else { Segment_get(out_seg, &dval, row, col); if ((X > Overlap.E) && (X < General.E)) { if ((Y > Overlap.N) && (Y < General.N)) { /* (3) */ csi = (General.E - X) / overlap; eta = (General.N - Y) / overlap; weight = csi * eta; interpolation *= weight; dval += interpolation; } else if ((Y < Overlap.S) && (Y > General.S)) { /* (1) */ csi = (General.E - X) / overlap; eta = (Y - General.S) / overlap; weight = csi * eta; interpolation *= weight; dval = interpolation; } else if ((Y >= Overlap.S) && (Y <= Overlap.N)) { /* (1) */ weight = (General.E - X ) / overlap; interpolation *= weight; dval = interpolation; } } else if ((X < Overlap.W) && (X > General.W)) { if ((Y > Overlap.N) && (Y < General.N)) { /* (4) */ csi = (X - General.W) / overlap; eta = (General.N - Y) / overlap; weight = eta * csi; interpolation *= weight; dval += interpolation; } else if ((Y < Overlap.S) && (Y > General.S)) { /* (2) */ csi = (X - General.W) / overlap; eta = (Y - General.S) / overlap; weight = csi * eta; interpolation *= weight; dval += interpolation; } else if ((Y >= Overlap.S) && (Y <= Overlap.N)) { /* (2) */ weight = (X - General.W) / overlap; interpolation *= weight; dval += interpolation; } } else if ((X >= Overlap.W) && (X <= Overlap.E)) { if ((Y > Overlap.N) && (Y < General.N)) { /* (3) */ weight = (General.N - Y) / overlap; interpolation *= weight; dval += interpolation; } else if ((Y < Overlap.S) && (Y > General.S)) { /* (1) */ weight = (Y - General.S) / overlap; interpolation *= weight; dval = interpolation; } } } /* end not in overlap */ Segment_put(out_seg, &dval, row, col); } /* for num_points */ return 1; }
void classification(struct Map_info *Out, struct Cell_head Elaboration, struct bound_box General, struct bound_box Overlap, double **obs, double *parBilin, double *parBicub, double mean, double alpha, double gradHigh, double gradLow, double overlap, int *line_num, int num_points, dbDriver * driver, char *tabint_name, char *tab_name) { int i, edge; double interpolation, weight, residual, eta, csi, gradient[2]; extern int nsplx, nsply, line_out_counter; extern double stepN, stepE; struct line_pnts *point; struct line_cats *categories; point = Vect_new_line_struct(); categories = Vect_new_cats_struct(); db_begin_transaction(driver); for (i = 0; i < num_points; i++) { /* Sparse points */ G_percent(i, num_points, 2); Vect_reset_line(point); Vect_reset_cats(categories); if (Vect_point_in_box(obs[i][0], obs[i][1], mean, &General)) { interpolation = dataInterpolateBicubic(obs[i][0], obs[i][1], stepE, stepN, nsplx, nsply, Elaboration.west, Elaboration.south, parBicub); interpolation += mean; Vect_copy_xyz_to_pnts(point, &obs[i][0], &obs[i][1], &obs[i][2], 1); Get_Gradient(Elaboration, obs[i][0], obs[i][1], parBilin, gradient); *point->z += mean; /*Vect_cat_set (categories, F_INTERPOLATION, line_out_counter); */ if (Vect_point_in_box(obs[i][0], obs[i][1], interpolation, &Overlap)) { /*(5) */ residual = *point->z - interpolation; edge = edge_detection(Elaboration, Overlap, parBilin, *point->x, *point->y, gradient, alpha, residual, gradHigh, gradLow); Vect_cat_set(categories, F_EDGE_DETECTION_CLASS, edge); Vect_cat_set(categories, F_INTERPOLATION, line_out_counter); Vect_write_line(Out, GV_POINT, point, categories); Insert_Interpolation(interpolation, line_out_counter, driver, tabint_name); line_out_counter++; } else { if ((*point->x > Overlap.E) && (*point->x < General.E)) { if ((*point->y > Overlap.N) && (*point->y < General.N)) { /*(3) */ csi = (General.E - *point->x) / overlap; eta = (General.N - *point->y) / overlap; weight = csi * eta; gradient[0] *= weight; gradient[1] *= weight; interpolation *= weight; if (Select(&gradient[0], &gradient[1], &interpolation, line_num[i], driver, tab_name) != DB_OK) G_fatal_error(_("Impossible to read from aux table")); if (UpDate(gradient[0], gradient[1], interpolation, line_num[i], driver, tab_name) != DB_OK) G_fatal_error(_("Impossible to update aux table")); } else if ((*point->y < Overlap.S) && (*point->y > General.S)) { /*(1) */ csi = (General.E - *point->x) / overlap; eta = (*point->y - General.S) / overlap; weight = csi * eta; gradient[0] *= weight; gradient[1] *= weight; interpolation *= weight; if (Insert(gradient[0], gradient[1], interpolation, line_num[i], driver, tab_name) != DB_OK) G_fatal_error(_("Impossible to write to aux table")); } else if ((*point->y <= Overlap.N) && (*point->y >= Overlap.S)) { /*(1) */ weight = (General.E - *point->x) / overlap; gradient[0] *= weight; gradient[1] *= weight; interpolation *= weight; if (Insert(gradient[0], gradient[1], interpolation, line_num[i], driver, tab_name) != DB_OK) G_fatal_error(_("Impossible to write to aux table")); } } else if ((*point->x < Overlap.W) && (*point->x > General.W)) { if ((*point->y > Overlap.N) && (*point->y < General.N)) { /*(4) */ csi = (*point->x - General.W) / overlap; eta = (General.N - *point->y) / overlap; weight = eta * csi; gradient[0] *= weight; gradient[1] *= weight; interpolation *= weight; if (Select(&gradient[0], &gradient[1], &interpolation, line_num[i], driver, tab_name) != DB_OK) G_fatal_error(_("Impossible to read from aux table")); residual = *point->z - interpolation; edge = edge_detection(Elaboration, Overlap, parBilin, *point->x, *point->y, gradient, alpha, residual, gradHigh, gradLow); Vect_cat_set(categories, F_EDGE_DETECTION_CLASS, edge); Vect_cat_set(categories, F_INTERPOLATION, line_out_counter); Vect_write_line(Out, GV_POINT, point, categories); Insert_Interpolation(interpolation, line_out_counter, driver, tabint_name); line_out_counter++; } else if ((*point->y < Overlap.S) && (*point->y > General.S)) { /*(2) */ csi = (*point->x - General.W) / overlap; eta = (*point->y - General.S) / overlap; weight = csi * eta; gradient[0] *= weight; gradient[1] *= weight; interpolation *= weight; if (Select(&gradient[0], &gradient[1], &interpolation, line_num[i], driver, tab_name) != DB_OK) G_fatal_error(_("Impossible to read from aux table")); if (UpDate(gradient[0], gradient[1], interpolation, line_num[i], driver, tab_name) != DB_OK) G_fatal_error(_("Impossible to update aux table")); } else if ((*point->y <= Overlap.N) && (*point->y >= Overlap.S)) { /*(2) */ weight = (*point->x - General.W) / overlap; gradient[0] *= weight; gradient[1] *= weight; interpolation *= weight; if (Select(&gradient[0], &gradient[1], &interpolation, line_num[i], driver, tab_name) != DB_OK) G_fatal_error(_("Impossible to read from aux table")); residual = *point->z - interpolation; edge = edge_detection(Elaboration, Overlap, parBilin, *point->x, *point->y, gradient, alpha, residual, gradHigh, gradLow); Vect_cat_set(categories, F_EDGE_DETECTION_CLASS, edge); Vect_cat_set(categories, F_INTERPOLATION, line_out_counter); Vect_write_line(Out, GV_POINT, point, categories); Insert_Interpolation(interpolation, line_out_counter, driver, tabint_name); line_out_counter++; } } else if ((*point->x <= Overlap.E) && (*point->x >= Overlap.W)) { if ((*point->y > Overlap.N) && (*point->y < General.N)) { /*(3) */ weight = (General.N - *point->y) / overlap; gradient[0] *= weight; gradient[1] *= weight; interpolation *= weight; if (Select(&gradient[0], &gradient[1], &interpolation, line_num[i], driver, tab_name) != DB_OK) G_fatal_error(_("Impossible to read from aux table")); residual = *point->z - interpolation; edge = edge_detection(Elaboration, Overlap, parBilin, *point->x, *point->y, gradient, alpha, residual, gradHigh, gradLow); Vect_cat_set(categories, F_EDGE_DETECTION_CLASS, edge); Vect_cat_set(categories, F_INTERPOLATION, line_out_counter); Vect_write_line(Out, GV_POINT, point, categories); Insert_Interpolation(interpolation, line_out_counter, driver, tabint_name); line_out_counter++; } else if ((*point->y < Overlap.S) && (*point->y > General.S)) { /*(1) */ weight = (*point->y - General.S) / overlap; gradient[0] *= weight; gradient[1] *= weight; interpolation *= weight; if (Insert(gradient[0], gradient[1], interpolation, line_num[i], driver, tab_name) != DB_OK) G_fatal_error(_("Impossible to write to aux table")); } /*else (1) */ } /*else */ } } /*end if obs */ } /*end for */ G_percent(num_points, num_points, 2); /* finish it */ db_commit_transaction(driver); Vect_destroy_line_struct(point); Vect_destroy_cats_struct(categories); }