Searching near a point

Exercise

This exercise uses PDAL to find points near a given search location. Our scenario is a simple one – we want to find the two points nearest the midpoint of the bounding cube of our interesting.las data file.

First we need to find the midpoint of the bounding cube. To do that, we need to print the --all info for the file and look for the bbox output:

$ pdal info ./exercises/info/interesting.las --all | jq .stats.bbox.native.bbox
{
    "maxx": 638982.55,
    "maxy": 853535.43,
    "maxz": 586.38,
    "minx": 635619.85,
    "miny": 848899.7,
    "minz": 406.59
}

Find the average the X, Y, and Z values:

x = 635619.85 + (638982.55 - 635619.85)/2 = 637301.20
y = 848899.70 + (853535.43 - 848899.70)/2 = 851217.57
z = 406.59 + (586.38 - 406.59)/2 = 496.49

With our “center point”, issue the --query option to pdal info and return the three nearest points to it:

$ pdal info ./exercises/info/interesting.las --query "637301.20, 851217.57, 496.49 /3"
{
"file_size": 37698,
"filename": "./exercises/info/interesting.las",
"now": "2023-05-30T16:17:10-0700",
"pdal_version": "2.5.4 (git-version: Release)",
"points":
{
    "point":
    [
    {
        "Blue": 221,
        "Classification": 1,
        "EdgeOfFlightLine": 0,
        "GpsTime": 247565.2203,
        "Green": 211,
        "Intensity": 169,
        "NumberOfReturns": 1,
        "PointId": 762,
        "PointSourceId": 7330,
        "Red": 228,
        "ReturnNumber": 1,
        "ScanAngleRank": -4,
        "ScanDirectionFlag": 0,
        "UserData": 124,
        "X": 637323.56,
        "Y": 851555.64,
        "Z": 586.38
    },
    {
        "Blue": 243,
    ...

Note

The /3 portion of our query string tells the query command to give us the 3 nearest points. Adjust this value to return data in closest-distance ordering.

Notes

  1. PDAL uses JSON as the exchange format when printing information from info. JSON is a structured, human-readable format that is much simpler than its XML cousin.

  2. The --query option of info constructs a KD-tree of the entire set of points in memory. If you have really large data sets, this isn’t going to work so well, and you will need to come up with a different solution.