<div dir="ltr"><div><div><div><div><div>Howard / Mike,<br><br></div>Thanks for your feedback. Based on your recommendation, I built a pipeline that reads all 24 input tiles, crops each to non-overlapping bounding boxes, merges, and reprojects the results prior to writing the composite LAZ file.<br><br></div>The pipeline works and the output file looks great. I can't find any obvious errors or omissions. However, PDAL returns the following error message when writing the file, repeated 24 times (one per input file):<br><br><b>(pdal pipeline Error) writers.las: Attempting to write 'C:/data/forest_park/mcc/mcc_merge_UTM (s-1_5, t-0_3).laz' with multiple point spatial references.</b><br><br></div>Should I be worried about this error? Is there any way to structure my JSON pipeline to prevent it from occurring? The full pipeline is copied below.<br><br></div>Thanks,<br></div>Eric<br><br><font face="monospace,monospace">{<br>  "pipeline":<br>  [<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_1 (s-1_5, t-0_3).las",<br>        "tag":"tile_1"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_2 (s-1_5, t-0_3).las",<br>        "tag":"tile_2"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_3 (s-1_5, t-0_3).las",<br>        "tag":"tile_3"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_4 (s-1_5, t-0_3).las",<br>        "tag":"tile_4"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_5 (s-1_5, t-0_3).las",<br>        "tag":"tile_5"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_6 (s-1_5, t-0_3).las",<br>        "tag":"tile_6"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_7 (s-1_5, t-0_3).las",<br>        "tag":"tile_7"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_8 (s-1_5, t-0_3).las",<br>        "tag":"tile_8"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_9 (s-1_5, t-0_3).las",<br>        "tag":"tile_9"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_10 (s-1_5, t-0_3).las",<br>        "tag":"tile_10"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_11 (s-1_5, t-0_3).las",<br>        "tag":"tile_11"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_12 (s-1_5, t-0_3).las",<br>        "tag":"tile_12"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_13 (s-1_5, t-0_3).las",<br>        "tag":"tile_13"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_14 (s-1_5, t-0_3).las",<br>        "tag":"tile_14"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_15 (s-1_5, t-0_3).las",<br>        "tag":"tile_15"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_16 (s-1_5, t-0_3).las",<br>        "tag":"tile_16"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_17 (s-1_5, t-0_3).las",<br>        "tag":"tile_17"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_18 (s-1_5, t-0_3).las",<br>        "tag":"tile_18"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_19 (s-1_5, t-0_3).las",<br>        "tag":"tile_19"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_20 (s-1_5, t-0_3).las",<br>        "tag":"tile_20"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_21 (s-1_5, t-0_3).las",<br>        "tag":"tile_21"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_22 (s-1_5, t-0_3).las",<br>        "tag":"tile_22"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_23 (s-1_5, t-0_3).las",<br>        "tag":"tile_23"<br>    },<br>    {<br>        "type":"readers.las",<br>        "filename":"C:/data/forest_park/mcc/forest_park_sp_tile_24 (s-1_5, t-0_3).las",<br>        "tag":"tile_24"<br>    },<br>    {<br>        "inputs":"tile_1",<br>      "type":"filters.crop",<br>      "bounds":"([737943,738600],[4280246,4281046])",<br>      "tag":"crop_1"<br>    },<br>    {<br>        "inputs":"tile_2",<br>      "type":"filters.crop",<br>      "bounds":"([737143,737943],[4280246,4281046])",<br>      "tag":"crop_2"<br>    },<br>    {<br>        "inputs":"tile_3",<br>      "type":"filters.crop",<br>      "bounds":"([737943,738600],[4279446,4280246])",<br>      "tag":"crop_3"<br>    },<br>    {<br>        "inputs":"tile_4",<br>      "type":"filters.crop",<br>      "bounds":"([737143,737943],[4279446,4280246])",<br>      "tag":"crop_4"<br>    },<br>    {<br>        "inputs":"tile_5",<br>      "type":"filters.crop",<br>      "bounds":"([737943,738600],[4279000,4279446])",<br>      "tag":"crop_5"<br>    },<br>    {<br>        "inputs":"tile_6",<br>      "type":"filters.crop",<br>      "bounds":"([737143,737943],[4279000,4279446])",<br>      "tag":"crop_6"<br>    },<br>    {<br>        "inputs":"tile_7",<br>      "type":"filters.crop",<br>      "bounds":"([737943,738600],[4281046,4281300])",<br>      "tag":"crop_7"<br>    },<br>    {<br>        "inputs":"tile_8",<br>      "type":"filters.crop",<br>      "bounds":"([737143,737943],[4281046,4281300])",<br>      "tag":"crop_8"<br>    },<br>    {<br>        "inputs":"tile_9",<br>      "type":"filters.crop",<br>      "bounds":"([734385,734743],[4279446,4280246])",<br>      "tag":"crop_9"<br>    },<br>    {<br>        "inputs":"tile_10",<br>      "type":"filters.crop",<br>      "bounds":"([734385,734743],[4280246,4281046])",<br>      "tag":"crop_10"<br>    },<br>    {<br>        "inputs":"tile_11",<br>      "type":"filters.crop",<br>      "bounds":"([734743,735543],[4279446,4280246])",<br>      "tag":"crop_11"<br>    },<br>    {<br>        "inputs":"tile_12",<br>      "type":"filters.crop",<br>      "bounds":"([734743,735543],[4280246,4281046])",<br>      "tag":"crop_12"<br>    },<br>    {<br>        "inputs":"tile_13",<br>      "type":"filters.crop",<br>      "bounds":"([735543,736343],[4279446,4280246])",<br>      "tag":"crop_13"<br>    },<br>    {<br>        "inputs":"tile_14",<br>      "type":"filters.crop",<br>      "bounds":"([735543,736343],[4280246,4281046])",<br>      "tag":"crop_14"<br>    },<br>    {<br>        "inputs":"tile_15",<br>      "type":"filters.crop",<br>      "bounds":"([734385,734743],[4279000,4279446])",<br>      "tag":"crop_15"<br>    },<br>    {<br>        "inputs":"tile_16",<br>      "type":"filters.crop",<br>      "bounds":"([734743,735543],[4279000,4279446])",<br>      "tag":"crop_16"<br>    },<br>    {<br>        "inputs":"tile_17",<br>      "type":"filters.crop",<br>      "bounds":"([735543,736343],[4279000,4279446])",<br>      "tag":"crop_17"<br>    },<br>    {<br>        "inputs":"tile_18",<br>      "type":"filters.crop",<br>      "bounds":"([734385,734743],[4281046,4281300])",<br>      "tag":"crop_18"<br>    },<br>    {<br>        "inputs":"tile_19",<br>      "type":"filters.crop",<br>      "bounds":"([734743,735543],[4281046,4281300])",<br>      "tag":"crop_19"<br>    },<br>    {<br>        "inputs":"tile_20",<br>      "type":"filters.crop",<br>      "bounds":"([735543,736343],[4281046,4281300])",<br>      "tag":"crop_20"<br>    },<br>    {<br>        "inputs":"tile_21",<br>      "type":"filters.crop",<br>      "bounds":"([736343,737143],[4279446,4280246])",<br>      "tag":"crop_21"<br>    },<br>    {<br>        "inputs":"tile_22",<br>      "type":"filters.crop",<br>      "bounds":"([736343,737143],[4280246,4281046])",<br>      "tag":"crop_22"<br>    },<br>    {<br>        "inputs":"tile_23",<br>      "type":"filters.crop",<br>      "bounds":"([736343,737143],[4279000,4279446])",<br>      "tag":"crop_23"<br>    },<br>    {<br>        "inputs":"tile_24",<br>      "type":"filters.crop",<br>      "bounds":"([736343,737143],[4281046,4281300])",<br>      "tag":"crop_24"<br>    },<br>    {<br>        "inputs":["crop_1","crop_2","crop_3","crop_4","crop_5","crop_6","crop_7","crop_8","crop_9","crop_10","crop_11","crop_12","crop_13","crop_14","crop_15","crop_16","crop_17","crop_18","crop_19","crop_20","crop_21","crop_22","crop_23","crop_24"],<br>      "type":"filters.merge",<br>      "tag":"merge_tiles"<br>    },<br>    {<br>        "inputs":"merge_tiles",<br>      "type":"filters.reprojection",<br>      "tag":"reproject_tiles",<br>      "in_srs":"EPSG:26915",<br>      "out_srs":"EPSG:32615"<br>    },<br>    {<br>        "inputs":"reproject_tiles",<br>      "type":"writers.las",<br>      "filename":"C:/data/forest_park/mcc/mcc_merge_UTM (s-1_5, t-0_3).laz"<br>    }<br>  ]<br>}<br></font><br><br></div><br><div class="gmail_quote"><div dir="ltr">On Sun, Apr 29, 2018 at 10:19 AM Howard Butler <<a href="mailto:howard@hobu.co">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>
<br>
On 4/28/18 5:03 PM, Eric Robeck wrote:<br>
> Is there a way within PDAL to merged buffered tiles with a constant buffer<br>
> width, while filtering out only the buffers from each tile?<br>
><br>
> For context, I am using an external software to modify a large point cloud.<br>
> Due to memory constraints, I first tiled the data using the "splitters"<br>
> filter, but included a 10 m buffer to minimize edge effects. Now that the<br>
> data are processed, I want to merge them back into a single file.<br>
<br>
You could use filters.assign to set a "buffer" value for the points that<br>
are in your buffer ring (or the ones that aren't), and then use<br>
filters.range to cull out points that have the "!buffer" classification<br>
before you go back to merge them altogether. It would be laborious, but<br>
you could get the job done.<br>
<br>
Additionally, Connor Manning of Hobu demonstrated a workflow at FOSS4G<br>
2017 [1] that is very similar to what you're doing except it is based on<br>
Greyhound and Entwine for the data management (and PDAL for the<br>
processing). The goal is to be able to put back information into an<br>
Entwine tree and not be constrained by a fixed tiling scheme while<br>
processing. It's all very much a prototype at the moment, but dynamic<br>
workflows based on adaptive tiling schemes is something we are actively<br>
working on.<br>
<br>
Howard<br>
<br>
<br>
[1] <a href="https://vimeo.com/245073446" rel="noreferrer" target="_blank">https://vimeo.com/245073446</a><br>
<br>
</blockquote></div>