int print_d_label(double x) { char *label, tmp[40]; DCELL dtmp; dtmp = x; G_squeeze(label = Rast_get_d_cat(&dtmp, &cats)); sprintf(tmp, "%.10f", x); G_trim_decimal(tmp); fprintf(stdout, "%s%s%s\n", tmp, fs, label); return 0; }
/* write_area - make table of area equivalences and write attribute file */ int write_area(struct area_table *a_list, /* list of areas */ struct equiv_table *e_list, /* list of equivalences between areas */ int n_areas, /* lengths of e_list, a_list */ int n_equiv) { struct line_pnts *points = Vect_new_line_struct(); int n, i; struct area_table *p; char *temp_buf; int cat; int catNum; double x, y; total_areas = 0; if (n_equiv < n_areas) { equivs = (int *)G_malloc(n_areas * sizeof(int)); n = n_equiv; } else { equivs = (int *)G_malloc(n_equiv * sizeof(int)); n = n_areas; } for (i = 0; i < n; i++) { if ((e_list + i)->mapped) equivs[i] = (e_list + i)->where; else { total_areas++; equivs[i] = i; } } if (n < n_areas) { for (i = n; i < n_areas; i++) { total_areas++; equivs[i] = i; } } catNum = 1; G_important_message(_("Writing areas...")); for (i = 0, p = a_list; i < n_areas; i++, p++) { G_percent(i, n_areas, 3); if (equivs[i] == i && p->width > 0 && !Rast_is_d_null_value(&(p->cat))) { char buf[1000]; if (value_flag) { /* raster value */ cat = (int)p->cat; } else { /* sequence */ cat = catNum; catNum++; } x = cell_head.west + (p->col + (p->width / 2.0)) * cell_head.ew_res; y = cell_head.north - (p->row + 0.5) * cell_head.ns_res; switch (data_type) { case CELL_TYPE: G_debug(3, "vector x = %.3f, y = %.3f, cat = %d; raster cat = %d", x, y, cat, (int)p->cat); break; case FCELL_TYPE: G_debug(3, "vector x = %.3f, y = %.3f, cat = %d; raster cat = %f", x, y, cat, (float)p->cat); break; case DCELL_TYPE: G_debug(3, "vector x = %.3f, y = %.3f, cat = %d; raster cat = %lf", x, y, cat, p->cat); break; } Vect_reset_line(points); Vect_append_point(points, x, y, 0.0); Vect_reset_cats(Cats); Vect_cat_set(Cats, 1, cat); Vect_write_line(&Map, GV_CENTROID, points, Cats); if (driver != NULL && !value_flag) { sprintf(buf, "insert into %s values (%d, ", Fi->table, cat); db_set_string(&sql, buf); switch (data_type) { case CELL_TYPE: sprintf(buf, "%d", (int)p->cat); break; case FCELL_TYPE: case DCELL_TYPE: sprintf(buf, "%f", p->cat); break; } db_append_string(&sql, buf); if (has_cats) { temp_buf = Rast_get_d_cat(&p->cat, &RastCats); db_set_string(&label, temp_buf); db_double_quote_string(&label); sprintf(buf, ", '%s'", db_get_string(&label)); db_append_string(&sql, buf); } db_append_string(&sql, ")"); G_debug(3, "%s", db_get_string(&sql)); if (db_execute_immediate(driver, &sql) != DB_OK) G_fatal_error(_("Cannot insert new row: %s"), db_get_string(&sql)); } } } G_percent(1, 1, 1); return 0; }
/*! \brief Get categories/labels Formats label as in d.what.rast -> (catval) catlabel \param filename raster map name \param drow \param dcol \param catstr category string \return 1 on success \return 0 on failure */ int Gs_get_cat_label(const char *filename, int drow, int dcol, char *catstr) { struct Categories cats; const char *mapset; CELL *buf; DCELL *dbuf; RASTER_MAP_TYPE map_type; int fd = -1; if ((mapset = G_find_raster2(filename, "")) == NULL) { G_warning(_("Raster map <%s> not found"), filename); return 0; } if (-1 != Rast_read_cats(filename, mapset, &cats)) { fd = Rast_open_old(filename, mapset); map_type = Rast_get_map_type(fd); if (map_type == CELL_TYPE) { buf = Rast_allocate_c_buf(); Rast_get_c_row(fd, buf, drow); if (Rast_is_c_null_value(&buf[dcol])) { sprintf(catstr, "(NULL) %s", Rast_get_c_cat(&buf[dcol], &cats)); } else { sprintf(catstr, "(%d) %s", buf[dcol], Rast_get_c_cat(&buf[dcol], &cats)); } G_free(buf); } else { /* fp map */ dbuf = Rast_allocate_d_buf(); Rast_get_d_row(fd, dbuf, drow); if (Rast_is_d_null_value(&dbuf[dcol])) { sprintf(catstr, "(NULL) %s", Rast_get_d_cat(&dbuf[dcol], &cats)); } else { sprintf(catstr, "(%g) %s", dbuf[dcol], Rast_get_d_cat(&dbuf[dcol], &cats)); } G_free(dbuf); } } else { strcpy(catstr, "no category label"); return 0; } /* TODO: may want to keep these around for multiple queries */ Rast_free_cats(&cats); if (fd >= 0) Rast_close(fd); return (1); }