<div dir="ltr"><div>Hi everyone,</div><div><br></div><div>Sorry for multiple emails on this, but wanted to ping this list again to see if there is anything obvious I'm missing or should check regarding this issue. I've reiterated context/the problem/sample sql code below, and if there's other info that would be helpful, please let me know.</div><div><br></div><div>Thanks! Sincerely,</div><div>Mike<br></div><div><br></div><div># To reiterate: <br></div><div>## The goal/issue:</div><div>I'm trying to calculate # of pixels from a categorical raster, by value, within distinct polygons of a vector layer. I have code, below, that seems to work accurately for small polygons, though I'm getting inaccuracies in large polygons - the addition of some pixels, including some from a value that aren't actually contained within a focal polygon. (I'm comparing to available calculations for the same overlay, along with results from QGIS Zonal Histogram tool). I'd like to get this working for this specific overlay, but then be able to apply the SQL code to comparable situations.</div><div><br></div><div>##Data:</div><div>The polygons are parcels, ranging quite widely in size;</div><div>The raster dataset is a 6" land cover dataset loaded as an in-db raster via raster2pgsql;<br></div><div>
<span class="gmail-pl-c">raster2pgsql -s 2263 -d -C -t 128x128 -M -I -l 4,16 "landcover_2010_nyc_05ft.img" base_rasters.landcover6in | psql -h localhost -U postgres -d dbname -v ON_ERROR_STOP=1</span>

<br></div><div><br></div><div>## System Info: <br></div><div>I'm running  PostGIS 2.4.4 with PostgreSQL v 10.3 on Windows 7 x64</div><div><br></div><div>## Two sets of sample code that give the same result:</div><div>1) <br></div><div><span class="gmail-im">SELECT  bbl, (pvc).VALUE, SUM((pvc).COUNT) AS tot_pix<br> FROM base_rasters.landcover6in<br>  INNER join  results_scratch.polys_test<br>  ON ST_Intersects(landcover6in.<wbr>rast, polys_test.geom_2263), <br></span>    ST_ValueCount(ST_Clip(<wbr>landcover6in.rast,polys_test.<wbr>geom_2263),1, TRUE, ARRAY[1, 2, 3, 4, 5, 6, 7]) AS pvc<br>  GROUP BY (pvc).VALUE, bbl<br> ORDER BY bbl, (pvc).VALUE;

<br></div><div><br></div><div>2) <br></div><div>
 SELECT<br>   bbl, (value_count).value, SUM((value_count).count) AS count<br>  FROM<br>    (<br>    select<br>    bbl,<br>      rid,<br>      ST_ValueCount(<br>        ST_Union(ST_Clip(rast, geom_2263, TRUE)), 1, TRUE, ARRAY[1, 2, 3, 4, 5, 6, 7]<br>      ) value_count<br>    FROM<br>      (SELECT bbl, geom_2263 FROM results_scratch.polys_test) v,<br>      (SELECT rid, rast FROM base_rasters.landcover6in) r<br>    WHERE ST_Intersects(rast, geom_2263)<br>    GROUP BY bbl, rid, geom_2263<br>    ) i<br>  GROUP BY bbl, value<br>  ORDER BY bbl, value

<br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 22, 2018 at 5:12 PM, Michael Treglia <span dir="ltr"><<a href="mailto:mtreglia@gmail.com" target="_blank">mtreglia@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hi again all,<br></div><div><br></div><div>Sorry for the multiple messages on this - realizing the query I posted was somewhat off from what I intended - below are examples that are getting at what I'm going for but exhibiting the issue I described (sometimes including pixels in counts aren't actually be within polygons [i.e., the categorical value isn't actually within the polygon based on visual inspection & this same analysis with other tools]).</div><div><br></div><div>Simpler/quicker:</div><div><br></div><div><span class="">  SELECT  bbl, (pvc).VALUE, SUM((pvc).COUNT) AS tot_pix<br> FROM base_rasters.landcover6in<br>  INNER join  results_scratch.polys_test<br>  ON ST_Intersects(landcover6in.<wbr>rast, polys_test.geom_2263), <br></span>    ST_ValueCount(ST_Clip(<wbr>landcover6in.rast,polys_test.<wbr>geom_2263),1, TRUE, ARRAY[1, 2, 3, 4, 5, 6, 7]) AS pvc<br>  GROUP BY (pvc).VALUE, bbl<br> ORDER BY bbl, (pvc).VALUE;<br> </div><div><br></div><div><br></div><div>A longer, less efficient version that gives the same results (but unions the clipped raster tiles):</div><div><br></div><div><br></div><div> SELECT<br>   bbl, (value_count).value, SUM((value_count).count) AS count<br>  FROM<br>    (<br>    select<br>    bbl,<br>      rid,<br>      ST_ValueCount(<br>        ST_Union(ST_Clip(rast, geom_2263, TRUE)), 1, TRUE, ARRAY[1, 2, 3, 4, 5, 6, 7]<br>      ) value_count<br>    FROM<br>      (SELECT bbl, geom_2263 FROM results_scratch.polys_test) v,<br>      (SELECT rid, rast FROM base_rasters.landcover6in) r<br>    WHERE ST_Intersects(rast, geom_2263)<br>    GROUP BY bbl, rid, geom_2263<br>    ) i<br>  GROUP BY bbl, value<br>  ORDER BY bbl, value<br></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 21, 2018 at 4:23 PM, Michael Treglia <span dir="ltr"><<a href="mailto:mtreglia@gmail.com" target="_blank">mtreglia@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hi all,</div><div><br></div><div>I'm basically trying to compute # of pixels of land cover type by polygon, for lots of polygons. <br></div><div><br></div><div>I'm working with a query a query like this:<br></div><div></div><div>SELECT  bbl, (pvc).VALUE, SUM((pvc).COUNT) AS tot_pix<br> FROM base_rasters.landcover6in<br>  INNER join  results_scratch.polys_test<br>  ON ST_Intersects(landcover6in.ras<wbr>t, polys_test.geom_2263), <br>    ST_ValueCount(ST_Clip(landcove<wbr>r6in.rast,polys_test.geom_<wbr>2263),1) AS pvc<br>  GROUP BY (pvc).VALUE, bbl<br> ORDER BY (pvc).VALUE;</div><div><br></div><div>For smaller polygons, spot-checking, it looks like I'm generally getting the right results. However, for larger polygons, not always. For example, though a polygon might not have roads, I'm getting non-0 counts for road pixels within a polygon (polygons have unique identifiers as 'bbl').  The total area of pixels counted ends up being larger than the polygon (larger than would be attributable to differences between polygons edges & pixels)<br></div><div><br></div><div>I'm thinking it's an issue when there are multiple raster tiles included... but not entirely sure. Any suggestions on whether there's something off in this query that might be causing an issue like I describe?</div><div><br></div><div>Thanks in advance for any suggestions!</div><div>Mike<br></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>