Converting Point Cloud to 3D Surface Map

Source Data

Looking at Red Rocks.

PDAL pipeline

# This is a hjson file, https://hjson.org/
# Linux bash
#GET=https://github.com/hjson/hjson-go/releases/download/v3.0.0/linux_amd64.tar.gz
# macOS bash
#GET=https://github.com/hjson/hjson-go/releases/download/v3.0.0/darwin_amd64.tar.gz
# Install
#curl -sSL $GET | sudo tar -xz -C /usr/local/bin
# Translate to Json
#hjson -j pipeline.hjson > pipeline.json
#pdal pipeline pipeline.json --verbose 8

{
  pipeline:
  [
# Input
    {
      # read from our ept server
      # up to 0.5m resolutions
      # type: readers.ept
      # bounds: ([802000, 802500], [2493000, 2493500])
      # filename: http://localhost:8080/ept.json
      filename: red-rocks.laz
      # filename: http://na.entwine.io/red-rocks/ept.json
      # resolution: 0.5
    }
#     {
#       # read from our las file
#       type: readers.las
#       filename: small500-no-outliers.laz
#     }


# Filters
    {
      # adds a classification value of 7 to the noise points
      type: filters.outlier
      # method: radius
      # radius: 1.0
      # min_k: 8 # min number of neighbors in radius

      method: statistical
      mean_k: 8
      multiplier: 3

    }

    {
      # voxel-based sampling filter
      # reduce the size of the pc
      # cell size of 0.2 meters in xyz
      type: filters.voxelcenternearestneighbor
      cell: 0.1
    }

    {
      # Need to assign point cloud dimension NumberOfReturns 1
      # Otherwise: "No returns to process."
        type:filters.assign
        assignment : NumberOfReturns[0:0]=1
    }

    {
      # Ground classification, ignore the noise points
      type: filters.smrf
      ignore:Classification[7:7]
    }

    {
      # only allow ground classified points
      type: filters.range
      limits: Classification[2:2]
    }

    {
      # OPTIONAL
      # turn this into a DEM 3D model
      # do not use multiple types
      # type: filters.delaunay
      type: filters.poisson
    }


# Output

# # OPTIONAL PLY IF DEM
    {
      # write to ply
      type:writers.ply
      filename: red-rocks-smrf-only-poisson.ply
      faces:true
      storage_mode: default
    }
# Output
    # {
    #   # write to laz
    #   type:writers.las
    #   filename: red-rocks-ground.laz
    # }
  ]
}

https://gist.github.com/sunapi386/9a9ece302d646ee80a72fc494423a633

Mesh Results

filters.delaunay
The mesh doesn’t look right.

Greedy Projection

filters.greedyprojection
Issue seems to be the points are arranged in a sequential fashion

Poisson

Looks nicer with depth: 10 (default 8). The ply file is 84M.

To go a little more “detailed”, I put depth to 12. The file went from 84M to 789M. And it is definitely overkill for 3D printing.

Grid Projection

Program failed to compute the grid projection.

 pdal pipeline dtm-gdal.json --verbose 8 
(PDAL Debug) Debugging...
(pdal pipeline Debug) Attempting to load plugin '/usr/local/lib/libpdal_plugin_filter_gridprojection.so'.
(pdal pipeline Debug) Loaded plugin '/usr/local/lib/libpdal_plugin_filter_gridprojection.so'.
(pdal pipeline Debug) Initialized plugin '/usr/local/lib/libpdal_plugin_filter_gridprojection.so'.
(pdal pipeline readers.las Debug) GDAL debug: OGRSpatialReference::Validate: No root pointer.
(pdal pipeline readers.las Debug) GDAL debug: OGRSpatialReference::Validate: No root pointer.
(pdal pipeline readers.las Debug) GDAL debug: OGRSpatialReference::Validate: No root pointer.
(pdal pipeline Debug) Executing pipeline in standard mode.
(pdal pipeline filters.gridprojection Debug) 		Process GridProjectionFilter...
[pcl::GridProjection::getBoundingBox] Size of Bounding Box is [5.500000, 6.000000, 5.000000]
[pcl::GridProjection::getBoundingBox] Lower left point is [-2.500000, -2.500000, -2.500000]
[pcl::GridProjection::getBoundingBox] Upper left point is [3.000000, 3.500000, 2.500000]
[pcl::GridProjection::getBoundingBox] Padding size: 3
[pcl::GridProjection::getBoundingBox] Leaf size: 0.500000
(pdal pipeline filters.gridprojection Debug) 		3141373 before, 180 after
(pdal pipeline filters.gridprojection Debug) 		180
double free or corruption (!prev)
fish: “pdal pipeline dtm-gdal.json --v…” terminated by signal SIGABRT (Abort)

Cura 3D Print Slice

Cura can take STL inputs. Converting the PLY into STL is simple.

sudo apt install openctm-tools

Then ctmconv red-rocks-smrf-only-delaunay.ply red-rocks-smrf-only-delaunay.stl can convert ply to stl


ctmviewer red-rocks-smrf-only-delaunay.ply visualizes the ply. Which is what I used above.

Poisson and Delauny surface models, side-by-side.

Looks like the Poisson is prettier.

I’ll continue writing this latter, until I have something printed. 🙂

PDAL Voxel Center Nearest Neighbor

https://pdal.io/stages/filters.voxelcenternearestneighbor.html#filters-voxelcenternearestneighbor

The VoxelCenterNearestNeighbor filter is a voxel-based sampling filter. The input point cloud is divided into 3D voxels at the given cell size. For each populated voxel, the coordinates of the voxel center are used as the query point in a 3D nearest neighbor search. The nearest neighbor is then added to the output point cloud, along with any existing dimensions.

Notice the red dots are much more sparse than the gray intensity dots. Red dots are separated 1.0 meters and gray are 0.1 meters.

To generate this I did converted with PDAL and then used Potree to visualize.

pdal pipeline $HOME/voxcnn-1.0.json 

voxcnn-1.0.json
[
"801403-802580-2493384-2494335.laz",
{
"type":"filters.voxelcenternearestneighbor",
"cell":1.0
},
"801403-802580-2493384-2494335-voxelcenternearestneighbor-1.0.laz"
]

-rw-rw-r-- 1 jsun jsun 65M Apr 11 21:01 801403-802580-2493384-2494335-voxelcenternearestneighbor.laz
-rw-rw-r-- 1 jsun jsun 8.1M Apr 11 21:04 801403-802580-2493384-2494335-voxelcenternearestneighbor-1.0.laz

Airbnb Occupancy Tax Turbotax

Airbnb already pays occupancy taxes for you so you can deduct them as a rent expense.

https://ttlc.intuit.com/questions/4567464-i-run-an-airbnb-in-maine-and-they-send-occupancy-taxes-to-the-state-how-do-i-show-my-airbnb-income-as-exempt-since-the-tax-has-already-been-paid

I run an Airbnb in Maine and they send occupancy taxes to the state. How do I show my Airbnb income as exempt since the tax has already been paid?

Asked by jlouisecarl
TurboTax Premier
 2 months ago


Occupancy taxes for your Airbnb are a completely separate tax from your income tax that you are filing. Having paid the occupancy tax through Airbnb does not make your income exempt from income tax.  All of the rent collected must still be reported as income.  However, you will be able to claim a rental expense for the occupancy tax that has been paid on your behalf since it was taken out of your rental income.

TurboTaxAnnetteB , EA
 TurboTax TaxPro  2 months ago