<div dir="ltr">Merci beaucoup Rémi!<div><br></div><div>Thank you for the wonderful info and alternatives, this is exactly what we needed and will keep us busy for a while. More than I expected!</div><div><br></div><div>Regards,</div><div>JF  <br><br><div class="gmail_quote"><div dir="ltr">On Wed, May 11, 2016 at 2:19 PM Rémi Cura <<a href="mailto:remi.cura@gmail.com">remi.cura@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:monospace,monospace">Hey,<br></div><div class="gmail_default" style="font-family:monospace,monospace">currently updating points inside patches is little bit of a pain,<br></div><div class="gmail_default" style="font-family:monospace,monospace">you need to explode the patch to points, convert the point to array,<br></div><div class="gmail_default" style="font-family:monospace,monospace">change the value for every point, then reform the patches.<br></div><div class="gmail_default" style="font-family:monospace,monospace">I'll suppose the classification attribute class_id is in position 7.<br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">WITH my_patch AS (-- spatial join. Should be very fast, both table indexed<br></div><div class="gmail_default" style="font-family:monospace,monospace">    SELECT patch_id, patch<br></div><div class="gmail_default" style="font-family:monospace,monospace">    FROM patch_table, polygon_table <br></div><div class="gmail_default" style="font-family:monospace,monospace">    WHERE ST_Intersects(patch::geometry,geom)=TRUE<br>)<br></div><div class="gmail_default" style="font-family:monospace,monospace">, my_points AS ( --converting patch to point. Note that could have been done directly in the previous CTE<br></div><div class="gmail_default" style="font-family:monospace,monospace">    SELECT patch_id, point[1:6]|| my_new_class_id||point[8:n_dims] AS updated_array<br></div><div class="gmail_default" style="font-family:monospace,monospace">    FROM my_patch, pc_explode(patch) as pt, pc_get(pt) as point<br></div><div class="gmail_default" style="font-family:monospace,monospace">)<br></div><div class="gmail_default" style="font-family:monospace,monospace">, updated_patch AS (<br></div><div class="gmail_default" style="font-family:monospace,monospace">    SELECT patch_id, pc_patch(updated_array,XX) AS n_patch<br></div><div class="gmail_default" style="font-family:monospace,monospace">    FROM my_points <br></div><div class="gmail_default" style="font-family:monospace,monospace">    GROUP BY patch_id <br></div><div class="gmail_default" style="font-family:monospace,monospace">)<br></div><div class="gmail_default" style="font-family:monospace,monospace">UPDATE ...<br><br></div><div class="gmail_default" style="font-family:monospace,monospace">Actually, I would do this in python outside the database (if necessary using shapely).<br></div><div class="gmail_default" style="font-family:monospace,monospace">Why? Because it would be much faster (basically, when you use pc-explode you are screwed)<br>.<br></div><div class="gmail_default" style="font-family:monospace,monospace">If doing this in base, I would probably embed the query in a plpgsql function to force the index use.<br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">We could discuss this more but there are many solutions and they strongly depend on your requirement.<br></div><div class="gmail_default" style="font-family:monospace,monospace">For instance Pgpointcloud would be easy to extend (in C) to update a whole dimension at a time (setting all point class_id for instance).<br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">In another direction, it may be a better idea to not store the classification per point, but per patch (all points in one patch would have the same class).<br></div><div class="gmail_default" style="font-family:monospace,monospace">To enforce this you would need to split/merge your patches when necessary, which is fairly easy.<br></div><div class="gmail_default" style="font-family:monospace,monospace">It would be much much faster, and would probably makes more sense for your application (especially if you plan to access your point by tree_id).<br><br></div><div class="gmail_default" style="font-family:monospace,monospace">If you need python ressources (like read write patches in binary, and examples):<br><a href="https://github.com/Remi-C/PPPP_utilities/tree/master/pointcloud" target="_blank">https://github.com/Remi-C/PPPP_utilities/tree/master/pointcloud</a><br><br></div><div class="gmail_default" style="font-family:monospace,monospace">You may be interested by my working paper on classification at patch level (<a href="http://arxiv.org/abs/1602.06920" target="_blank">http://arxiv.org/abs/1602.06920</a>), although only a part of the paper is not about classification,<br>and I'm affraid this paper is a pain to understand (working on this).<br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">Cheers,<br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">Rémi C<br></div></div><div class="gmail_extra"><br><div class="gmail_quote"></div></div><div class="gmail_extra"><div class="gmail_quote">2016-05-11 18:43 GMT+02:00 Jean-Francois Prieur <span dir="ltr"><<a href="mailto:jfprieur@gmail.com" target="_blank">jfprieur@gmail.com</a>></span>:<br></div></div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Wow thank you for your quick reply.<div><br></div><div>Yes, you have the gist of it, although we do classification outside of the database (using random forest), so it is really just assigining the crown id (from the polygon shapefile) to all the points in the patch(es) that fall under it. That way, we can easily pull all the points from a specific crown by ID and not spatial join. The part I am having an issue with (the shapefiles and point cloud is already in PostGIS/pgPointCloud) is:</div><span><div><br></div><div><span style="font-family:'helvetica neue',helvetica,arial,sans-serif">"then write SQL to update the points inside the crown polygons."</span></div><div><br></div></span><div>I am not seeing the SQL needed to do this, it is probably trivial.<br></div><div><br></div><div>Thanks a lot for that ressource as well, it is similar to what we do and seems to be full of examples. We are trying to identfy species at the individual tree level using ALS and multispectral imagery or multispectral lidar.</div><div><br></div><div>Thanks,</div><div>JF</div></div><div><div><br><div class="gmail_quote"><div dir="ltr">On Wed, May 11, 2016 at 12:12 PM Howard Butler <<a href="mailto:howard@hobu.co" target="_blank">howard@hobu.co</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
> On May 11, 2016, at 11:03 AM, Jean-Francois Prieur <<a href="mailto:jfprieur@gmail.com" target="_blank">jfprieur@gmail.com</a>> wrote:<br>
><br>
> Hello,<br>
><br>
> Newbie to PostGIS/PGPointCLoud, used to work with MySQL many moons ago so know just enough to be dangerous!<br>
><br>
> I am working in remote sensing research , precision forestry to be specific.<br>
><br>
> We use ALS data and tree crown segmentation on the resulting canopy height models to segment individual trees. We then use the shapefile to extract the points from the las files. This is done using Python, it works but it is a slow process and we have to redo it when we want to update the info on our points.<br>
><br>
> We are looking into doing a lot of this in PostGIS and have succesfully imported our las files using the awesome documentation provided. So we have a working pipeline LAS->PDAL->pgPointCloud and can perform all kinds of queries on the data so that part works.<br>
><br>
> We can do the spatial join between the shapefiles containing all our individual crowns (there can be thousands) and then extracting all the points under those. What we would like to do is update all the points selected under a crown with that crowns ID so we do not have to do these spatial joins all the time eg. we can just query the crown number and get the points that way. We can select all the points, we just cannot update the points with the proper info. The spatial join is quite long with thousands of crowns, we would like to only run it once, update the points with the proper crown ID and then work with the data that way.<br>
><br>
> I believe part of the solution is the shema used in the pipeline process, I think we would have to add a field in a new schema for the crownid which could then be updated with the crown id. Just not quite sure how to get there.<br>
><br>
> Not afraid to learn on my own and digging in, just in need of a push in the right direction!<br>
<br>
Ok, let me attempt to rephrase. You want to update some kind of classification or other attribute for each point in a pgpatch that is inside a crown polygon? I think what I would do is ingest the crown shapefiles into PostGIS, enable the pointcloud_postgis extension, and then write SQL to update the points inside the crown polygons. There is very likely a Classification attribute as part of your data, and I would just repurpose that to flag points as your tree crowns in some way. Is this on the right track?<br>
<br>
Also, make sure your read Stephen Mather's blog posts on pgpointcloud and PDAL. He's doing something very similar to your usage and there might be some pointers in there <a href="https://smathermather.wordpress.com/tag/pdal/" rel="noreferrer" target="_blank">https://smathermather.wordpress.com/tag/pdal/</a><br>
<br>
Howard</blockquote></div>
</div></div><br></blockquote></div></div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">_______________________________________________<br>
pdal mailing list<br>
<a href="mailto:pdal@lists.osgeo.org" target="_blank">pdal@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/mailman/listinfo/pdal" rel="noreferrer" target="_blank">http://lists.osgeo.org/mailman/listinfo/pdal</a><br></blockquote></div><br></div>
</blockquote></div></div></div>