]> granicus.if.org Git - postgis/commitdiff
Fixed handling of pixel value check for NODATA
authorBborie Park <bkpark at ucdavis.edu>
Tue, 3 Jul 2012 23:40:40 +0000 (23:40 +0000)
committerBborie Park <bkpark at ucdavis.edu>
Tue, 3 Jul 2012 23:40:40 +0000 (23:40 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@10028 b70326c6-7e19-0410-871a-916f4a2858ee

raster/rt_core/rt_api.c
raster/rt_pg/rt_pg.c

index 65a96b14bf6c6b82883121272884735c72b6a4f8..ebc39bbf81920543073f5d687432e3f98029dfbd 100644 (file)
@@ -2325,6 +2325,10 @@ int rt_band_get_nearest_pixel(
                }
        }
 
+       /* no NODATA, exclude is FALSE */
+       if (!band->hasnodata)
+               exclude_nodata_value = FALSE;
+
        /* determine the maximum distance to prevent an infinite loop */
        if (!distance) {
                int a, b;
@@ -2502,6 +2506,9 @@ rt_band_get_pixel_of_value(
        assert(NULL != band);
        assert(NULL != pixels);
 
+       if (!band->hasnodata)
+               exclude_nodata_value = FALSE;
+
        for (x = 0; x < band->width; x++) {
                for (y = 0; y < band->height; y++) {
                        err = rt_band_get_pixel(band, x, y, &pixval);
@@ -5706,7 +5713,10 @@ rt_raster_gdal_polygonize(
 
        if (exclude_nodata_value) {
                iBandHasNodataValue = rt_band_get_hasnodata_flag(band);
-               if (iBandHasNodataValue) dBandNoData = rt_band_get_nodata(band);
+               if (iBandHasNodataValue)
+                       dBandNoData = rt_band_get_nodata(band);
+               else
+                       exclude_nodata_value = FALSE;
        }
 
        /*****************************************************
index 9cac44dbd9feccbc28df70ce02c1481287367acd..a8f6c386a5bf4057a64acd6749073e8d25c5806b 100644 (file)
@@ -2557,8 +2557,12 @@ Datum RASTER_getPixelPolygons(PG_FUNCTION_ARGS)
                                }
 
                                hasnodata = rt_band_get_hasnodata_flag(band);
-                               if (hasnodata)
+                               if (hasnodata) {
                                        nodataval = rt_band_get_nodata(band);
+                                       POSTGIS_RT_DEBUGF(4, "(hasnodata, nodataval) = (%d, %f)", hasnodata, nodataval);
+                               }
+                               else
+                                       exclude_nodata_value = FALSE;
                        }
                        while (0);
                }
@@ -2613,8 +2617,10 @@ Datum RASTER_getPixelPolygons(PG_FUNCTION_ARGS)
                                        SRF_RETURN_DONE(funcctx);
                                }
                                pix[pixcount].geom = (LWGEOM *) poly;
+                               /*
                                POSTGIS_RT_DEBUGF(4, "poly @ %p", poly);
                                POSTGIS_RT_DEBUGF(4, "geom @ %p", pix[pixcount].geom);
+                               */
 
                                /* x, y */
                                pix[pixcount].x = x;
@@ -2638,7 +2644,8 @@ Datum RASTER_getPixelPolygons(PG_FUNCTION_ARGS)
                                        }
 
                                        if (
-                                               !exclude_nodata_value || (
+                                               !exclude_nodata_value ||
+                                               !hasnodata || (
                                                        exclude_nodata_value &&
                                                        (hasnodata != FALSE) && (
                                                                FLT_NEQ(pix[pixcount].value, nodataval) &&
@@ -2648,11 +2655,13 @@ Datum RASTER_getPixelPolygons(PG_FUNCTION_ARGS)
                                        ) {
                                                pix[pixcount].nodata = 0;
                                        }
-                                       else
+                                       else {
                                                pix[pixcount].nodata = 1;
+                                       }
                                }
-                               else
+                               else {
                                        pix[pixcount].nodata = 1;
+                               }
 
                                pixcount++;
                        }
@@ -3089,7 +3098,8 @@ Datum RASTER_nearestValue(PG_FUNCTION_ARGS)
 
                /* value at point, return value */
                if (
-                       !exclude_nodata_value || (
+                       !exclude_nodata_value || 
+                       !rt_band_get_hasnodata_flag(band) || (
                                exclude_nodata_value &&
                                rt_band_get_hasnodata_flag(band) && (
                                        FLT_NEQ(value, rt_band_get_nodata(band)) &&
@@ -3324,7 +3334,8 @@ Datum RASTER_neighborhood(PG_FUNCTION_ARGS)
 
        /* add pixel to neighborhood */
        if (
-               !exclude_nodata_value || (
+               !exclude_nodata_value || 
+               !rt_band_get_hasnodata_flag(band) || (
                        exclude_nodata_value &&
                        (rt_band_get_hasnodata_flag(band) != FALSE) && (
                                FLT_NEQ(pixval, rt_band_get_nodata(band)) &&