int G3d_readRange(const char *name, const char *mapset, struct FPRange *drange) /* adapted from G_read_fp_range */ { int fd; char xname[GNAME_MAX], xmapset[GMAPSET_MAX]; char buf[GNAME_MAX + sizeof(G3D_DIRECTORY) + 2], buf2[GMAPSET_MAX + sizeof(G3D_RANGE_ELEMENT) + 2]; char xdr_buf[100]; DCELL dcell1, dcell2; XDR xdr_str; G_init_fp_range(drange); fd = -1; if (G__name_is_fully_qualified(name, xname, xmapset)) { sprintf(buf, "%s/%s", G3D_DIRECTORY, xname); sprintf(buf2, "%s@%s", G3D_RANGE_ELEMENT, xmapset); /* == range@mapset */ } else { sprintf(buf, "%s/%s", G3D_DIRECTORY, name); sprintf(buf2, "%s", G3D_RANGE_ELEMENT); } if (G_find_file2(buf, buf2, mapset)) { fd = G_open_old(buf, buf2, mapset); if (fd < 0) goto error; if (read(fd, xdr_buf, 2 * G3D_XDR_DOUBLE_LENGTH) != 2 * G3D_XDR_DOUBLE_LENGTH) return 2; xdrmem_create(&xdr_str, xdr_buf, (u_int) G3D_XDR_DOUBLE_LENGTH * 2, XDR_DECODE); /* if the f_range file exists, but empty */ if (!xdr_double(&xdr_str, &dcell1) || !xdr_double(&xdr_str, &dcell2)) goto error; G_update_fp_range(dcell1, drange); G_update_fp_range(dcell2, drange); close(fd); return 1; } error: if (fd > 0) close(fd); G_warning("can't read range file for [%s in %s]", name, mapset); return -1; }
int QgsGrassGisLib::G_read_fp_range( const char *name, const char *mapset, struct FPRange *drange ) { Q_UNUSED( mapset ); Raster rast = raster( name ); // TODO (no solution): Problem: GRASS has precise min/max values available, // in QGIS we can calculate, but it would be slow, so we are using estimated // values, which may result in wrong output // Hopefully the range is not crutial for most modules, but it is problem certanly // for r.rescale .. more? // TODO: estimate only for large rasters warning( "The module needs input raster values range, estimated values used." ); int sampleSize = 250000; QgsRasterBandStats stats = rast.provider->bandStatistics( rast.band, QgsRasterBandStats::Min | QgsRasterBandStats::Max, rast.provider->extent(), sampleSize ); G_init_fp_range( drange ); // Attention: r.stats prints wrong results if range is wrong G_update_fp_range( stats.minimumValue, drange ); G_update_fp_range( stats.maximumValue, drange ); return 1; }
int G3d_range_init(G3D_Map * map) { return G_init_fp_range(&(map->range)); }