Пример #1
0
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;
}
Пример #2
0
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;
}