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#
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.
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.