[postgis-users] Raster pixel value
Andreas Forø Tollefsen
andreasft at gmail.com
Mon Dec 19 01:53:03 PST 2011
Updated to latest trunk, and now it works.
However, I ran into a new "division by zero" error. This halts the query.
Could it be that something is divided by integer rather than decimal in the
query, or what else causes this:
ERROR: division by zero
CONTEXT: PL/pgSQL function "raster_summarystatsfinal" line 5 at assignment
********** Error **********
ERROR: division by zero
SQL state: 22012
Context: PL/pgSQL function "raster_summarystatsfinal" line 5 at assignment
Best,
Andreas
2011/12/19 Tom van Tilburg <tom.van.tilburg at gmail.com>
> Andreas,
>
> If you got the latest ST_Clip from the repository, I found this
> information with it:
>
> "Addition of C-based ST_MinPossibleValue to replace the existing
> ST_MinPossibleVal which uses hard-coded values. Updated dependent functions
> and scripts/plpgsql to use new function. Deleted
> scripts/plpgsql/st_minpossibleval.sql to stop people from using it.
> Associated ticket is #1298 <http://trac.osgeo.org/postgis/ticket/1298>."
>
> Probably this means you need the very newest version of rtpostgis with the
> minpossiblevalue included in C. Not sure wheter is available for windows
> yet.
> At the moment I don't have time to test but I have the feeling this new
> function in C might make things quicker and perhaps fix the error with
> nodata values I mentioned earlier. Let me know.
>
> Regards,
> Tom
>
>
> On 19-12-2011 10:01, Andreas Forø Tollefsen wrote:
>
> Hi Tom,
>
> I tried both functions. The St_AreaWeightedSummaryStats() works great, but
> it takes a lot of time to complete.
>
> However, the ST_Clip() i cannot manage to get working. Seems like
> something is broken. Any idea what can cause this error?
> I installed the latest ST_SummaryStatsAgg() and ST_Clip() from
> http://trac.osgeo.org/postgis/browser/trunk/raster/scripts/plpgsql
>
> The query:
> SELECT foo2.gid,
> (ss).count,
> (ss).sum,
> (ss).mean,
> (ss).min,
> (ss).max
> FROM
> (SELECT foo.gid, ST_SummaryStatsAgg(gv) ss
> FROM (SELECT p.gid, ST_Clip(r.rast, p.cell) gv
> FROM access r, priogrid_land p
> WHERE ST_Intersects(r.rast, p.cell)
> ) foo
> GROUP BY foo.gid
> ) foo2
>
> Results in:
>
> ERROR: function st_minpossiblevalue(text) does not exist
> LINE 1: ...esce(nodata, ST_BandNodataValue(rast, bandstart), ST_MinPoss...
> ^
> HINT: No function matches the given name and argument types. You might
> need to add explicit type casts.
> QUERY: SELECT coalesce(nodata, ST_BandNodataValue(rast, bandstart),
> ST_MinPossibleValue(newpixtype))
> CONTEXT: PL/pgSQL function "st_clip" line 31 at assignment
>
> ********** Error **********
>
> ERROR: function st_minpossiblevalue(text) does not exist
> SQL state: 42883
> Hint: No function matches the given name and argument types. You might
> need to add explicit type casts.
> Context: PL/pgSQL function "st_clip" line 31 at assignment
>
>
>
> 2011/12/6 Tom van Tilburg <tom.van.tilburg at gmail.com>
>
>> Andreas,
>>
>> I didn't have time to reproduce your problem yet. Did you have any succes
>> by yourself on this issue?
>> Could it have something to do with counting the non-data values as value?
>> This is what I experience with a similar function (ST_Clip) that
>> consequently gave me the value '0' instead of the nodata value. The result
>> of that is that the mean was often lower than expected.
>>
>> Perhaps you could rewrite your previous example to something with
>> auto-generated values in the script. That saves time in reproducing.
>>
>> Cheers,
>> Tom
>>
>>
>>
>> On 25-11-2011 18:11, Andreas Forø Tollefsen wrote:
>>
>> Update:
>>
>> I think my suspicion is correct. If I do a ST_Summarystats().sum and
>> divide this on 36 my MAX value will be 1.
>> Hence, I think the number of values counted and the number of
>> observations counted is not equal.
>>
>> New query:
>> DROP TABLE IF EXISTS mountain_phil_cell;
>>
>> SELECT
>> a.gid As gid,
>> (ST_SummaryStats((ST_Union(ST_MapAlgebraExpr(ST_AsRaster(a.cell, b.rast,
>> '32BF'), b.rast, 'rast2', '32BF','INTERSECTION','0','0',0))).rast,
>> false)).sum / 36 As avgmnt
>> INTO mountain_phil_cell
>> FROM
>> priogrid_land a LEFT JOIN
>> mountain_phil b
>> ON ST_Intersects(a.cell, b.rast)
>> GROUP BY a.gid
>> ORDER BY a.gid;
>>
>>
>> 2011/11/25 Andreas Forø Tollefsen <andreasft at gmail.com>
>>
>>> A small note regarding this issue.
>>>
>>> My problem is that I never get a mean value of 1 even if all pixels
>>> inside the geometry is one.
>>>
>>> Could this be because: 6x6 pixels goes into one polygon when visually
>>> controlling. If each pixel has the value 1, then this will be calculated as
>>> 36 / 36 = 1. However, if it calculates the sum to be 36 and divide by a
>>> number higher than 36 pixels, then the result will always be below 1.
>>> What i am thinking is that while it sums up the pixel values correctly,
>>> it does not count only the 36 pixels, but also neighboring pixels.
>>> Therefore: 1+1+1+1...n36 / Number of pixels higher than 36 will always lead
>>> to a number lower than 1.
>>>
>>> Anyone who knows the functions well could probably answer this.
>>>
>>> Best regards,
>>> Andreas
>>>
>>>
>>> 2011/11/25 Andreas Forø Tollefsen <andreasft at gmail.com>
>>>
>>>> Could this have to do with the tiling of the raster?
>>>> I will try to run the same query with a untiled mountain raster to see
>>>> if that changes anything.
>>>>
>>>> Btw. When loading a tiled postgis raster into qgis it shows up with
>>>> many artifacts and no data areas. The same raster untiled does not show up
>>>> the same way.
>>>> Qgis bug?
>>>>
>>>> Andreas
>>>>
>>>> 2011/11/25 Andreas Forø Tollefsen <andreasft at gmail.com>
>>>>
>>>>> Hi,
>>>>>
>>>>> Thanks for all of the suggestions. I will do some more testing.
>>>>> However, as for suggestion 1 i think the pixel size should be the same as
>>>>> the original raster or am I wrong?
>>>>>
>>>>> Both the mean_mnt_bin raster and the priogrid_land shapefile can be
>>>>> downloaded as zip (2 mb) here:
>>>>> http://gisintersect.com/mean_mnt_bin.zip
>>>>> http://gisintersect.com/priogrid_land.zip
>>>>>
>>>>> Any help on getting the correct values would be very much
>>>>> appreciated.
>>>>>
>>>>> My query:
>>>>> DROP TABLE IF EXISTS mountain_cell;
>>>>>
>>>>> SELECT
>>>>> a.gid As id,
>>>>> (ST_SummaryStats((ST_Union(ST_MapAlgebraExpr(ST_AsRaster(a.cell,
>>>>> b.rast, '32BF'), b.rast, 'rast2', '32BF','INTERSECTION','0','0',0))).rast,
>>>>> false)).mean As avgmnt
>>>>> INTO mountain_cell
>>>>> FROM
>>>>> priogrid_land a LEFT JOIN
>>>>> mountain b
>>>>> ON ST_Intersects(a.cell, b.rast)
>>>>> GROUP BY a.gid
>>>>> ORDER BY a.gid;
>>>>>
>>>>
>>>>
>>>
>>
>>
>> _______________________________________________
>> postgis-users mailing listpostgis-users at postgis.refractions.nethttp://postgis.refractions.net/mailman/listinfo/postgis-users
>>
>>
>>
>> _______________________________________________
>> postgis-users mailing list
>> postgis-users at postgis.refractions.net
>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>
>>
>
>
> _______________________________________________
> postgis-users mailing listpostgis-users at postgis.refractions.nethttp://postgis.refractions.net/mailman/listinfo/postgis-users
>
>
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20111219/45131207/attachment.html>
More information about the postgis-users
mailing list