<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Oct 10, 2014 at 1:44 PM, Glynn Clements <span dir="ltr"><<a href="mailto:glynn@gclements.plus.com" target="_blank">glynn@gclements.plus.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
Paulo van Breugel wrote:<br>
<br>
> > Perhaps a vector point just hits the extents of the computational region<br>
> > or map?<br>
><br>
> You are right that the extends do not match completely. But I was under the<br>
> impression that points outside the region simply got skipped?<br>
<br>
</span>I believe that *ought* to happen. The question is whether the fix<br>
should go into v.what.rast or libraster.<br>
<span class=""><br>
> For example, if I reduce the region to a small area, and run<br>
> v.what.rast, I get the warning message "WARNING: 2287133 points<br>
> outside current region were skipped", after which the it happily<br>
> continues to run updating the points that are within the region<br>
> bounds, as per below.<br>
<br>
</span>The behaviour of Rast_get_row() etc is that requesting a row which is<br>
outside of the map's bounds returns a row of nulls, but requesting a<br>
row which is outside of the current region is a fatal error.<br>
<br>
The former is just how raster maps are conceived. Conceptually, a<br>
raster map has infinite extent, but all non-null values are contained<br>
within a finite region. A raster map's stored bounds provide a loose<br>
bound on the region containing the non-null values, as well as<br>
avoiding requiring infinite disk space for each map.<br></blockquote><div><br></div><div>Yes, the way grass handles points outside the region makes sense to me; it follows the general philosophy of grass to ignore what is outside the region.<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
The latter indicates a programming error. Any module which accesses a<br>
raster map first specifies (implicitly or explicitly) a finite grid of<br>
sample locations. Subsequent Rast_get_row() etc calls return a<br>
one-dimensional array of values obtained by sampling the map at the<br>
locations for one row of the grid. The error occurs when the program<br>
requests data for a row which doesn't exist in the sampling grid which<br>
it specified.<br></blockquote><div><br></div><div>What would make sense to me is if for those points to update the table with a NULL value, as that is what it really is (considering that all values within the defined region are valid). <br><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
It would be fairly straightfoward to work around the issue within<br>
libraster, by making compute_window_row() just return 0 instead of<br>
raising a fatal error. But this could mask more significant issues,<br>
resulting in modules silently returning wrong results.<br>
<br>
Personally, I feel that v.what.rast should be fixed. Specifically, the<br>
code<br>
<br>
        row = Rast_northing_to_row(Points->y[0], &window);<br>
        col = Rast_easting_to_col(Points->x[0], &window);<br>
<br>
should be followed by:<br>
<br>
        if (col < 0 || col >= window.cols || row < 0 || row >= window.rows)<br>
            continue;<br>
<br>
The Vect_point_in_box() call just above that code doesn't appear to be<br>
sufficient in the case where the point lies either on the boundary of<br>
the region or just inside.<br>
<br>
This is partly because Vect_point_in_box() uses >= and <= rather than<br>
> and < (i.e. a point on the boundary is considered inside), and<br>
partly because Rast_northing_to_row() etc are affected by rounding<br>
error (window.north - window.south is not necessarily equal to<br>
window.ns_res * window.rows, similarly for the horizontal direction).<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Glynn Clements <<a href="mailto:glynn@gclements.plus.com">glynn@gclements.plus.com</a>><br>
</font></span></blockquote></div><br></div></div>