<div dir="ltr"><div><div>[cc'ing the list]<br><br></div>One way to do the spatially variable shift is to do what I suggested earlier, but instead of the last step (computing average), interpolate a surface from the differences at each point using, e.g., v.surf.rst with zcolumn option set to the difference column computed earlier. For the average, the assumption was that the shift is everywhere the same. Here, the assumption is that you can interpolate in between the points, i.e. that the interpolated values are meaningful. This assumption might be broken e.g. when some abrupt surface change influenced the vertical shift of the lidar points in a specific area/around certain GPS point (unlikely case).<br><br></div>To actually shift the data, you need to either do the calculation in the attribute table (using the aforementioned modules such as v.db.update) or more simply, and likely more efficiently, apply the shift to a raster with binned elevations from r.in.lidar using r.mapcalc (same expression as before, just with a raster map name instead of a constant).<br><br><div><div></div><div><div><div><div><div class="gmail_extra"><div class="gmail_quote">On Wed, Dec 27, 2017 at 5:22 PM, Shane Carey <span dir="ltr"><<a href="mailto:careyshan@gmail.com" target="_blank">careyshan@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Oh super Vaclav, is there a way of doing a spatially variable shift or can you only do a block shift?<br><br></div>Thanks for your help :-)<br></div><div class="gmail_extra"><div><div class="gmail-h5"><br><div class="gmail_quote">On Wed, Dec 27, 2017 at 4:42 PM, Vaclav Petras <span dir="ltr"><<a href="mailto:wenzeslaus@gmail.com" target="_blank">wenzeslaus@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><span><div class="gmail_extra"><div class="gmail_quote">On Tue, Dec 19, 2017 at 3:29 AM, Shane Carey <span dir="ltr"><<a href="mailto:careyshan@gmail.com" target="_blank">careyshan@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br><div dir="auto">I
 have some LiDAR data that was not levelled properly and I was wondering
 does anybody know of a way of levelling the las files to gps points?</div><br></blockquote></div></div><div class="gmail_extra"><br></div></span><div class="gmail_extra">Hi,</div><div class="gmail_extra"><br></div><div class="gmail_extra">if
 the issue is really just vertical (which is usually the case), you can 
use v.transform zshift to shift by the given value. For rasters, e.g. 
DEM based on binning the lidar points with r.in.lidar, you can use 
r.mapcalc to shift it (e.g. expression "new = old + 2").</div><div class="gmail_extra"><br></div><div class="gmail_extra">The
 shift can be determined by binning (or even interpolating) the points, 
followed by querying raster using the GPS points as a vector using 
v.what.rast, and then by computing the difference using v.db.addcolumn 
and v.db.update. Finally, you can average the difference using 
v.db.univar. One (average) values will be usually good enough for lidar 
point cloud, for UAV point cloud, spatially variable shift might be 
needed.<span class="gmail-m_-8684713459506635613HOEnZb"><font color="#888888"><br></font></span></div><span class="gmail-m_-8684713459506635613HOEnZb"><font color="#888888"><div class="gmail_extra"><br></div><div class="gmail_extra">Vaclav<br></div><div class="gmail_extra"><br></div></font></span></div>
</blockquote></div></div></div></div></blockquote></div></div></div></div></div></div></div></div>