Working with LiDAR Cloud Optimized Point Cloud (COPC) in MAAP
Authors: Harshini Girish (UAH), Rajat Shinde (UAH), Alex Mandel (Development Seed), Jamison French (Development Seed), Brian Freitag (NASA MSFC), Sheyenne Kirkland (UAH), Henry Rodman (Development Seed), Zac Deziel (Development Seed), Chuck Daniels (Development Seed)
Date: March 25, 2024
Description: The LASER (LAS) file format is designed to store 3-dimensional (x,y,z) point cloud data typically collected from LiDAR. An LAZ file is a compressed LAS file, and a Cloud-Optimized Point Cloud (COPC) file is a valid LAZ file. COPC files are similar to COGs for GeoTIFFs: Both are valid versions of the original file format but with additional requirements to support cloud-optimized data access. In the case of COGs, there are additional requirements for tiling and overviews.
Setup This tutorial will explore how to:
Read a LiDAR LAS file using PDAL in Python
Convert the LiDAR LAS file to Cloud-Optimized Point Cloud (COPC) format
Validate the generated COPC file
Run This Notebook
To access and run this tutorial within MAAP’s Algorithm Development Environment (ADE), please refer to the Getting started with the MAAP section of our documentation.
Disclaimer: It is highly recommended to run this tutorial within MAAP’s ADE, which already includes packages specific to MAAP, such as maap-py. Running the tutorial outside of the MAAP ADE may lead to errors.
About the Dataset
This Python script is designed to programmatically download a specific LiDAR .las file from the MAAP STAC (SpatioTemporal Asset Catalog) API. It begins by establishing a connection to the MAAP STAC catalog using the pystac_client library, which provides access to a curated collection of geospatial datasets. From this catalog, the script selects the GEDI_CalVal_Lidar_Data collection, which contains LiDAR data acquired for calibration and validation of the GEDI mission.
[ ]:
from pystac_client import Client
import requests
cat = Client.open("https://stac.maap-project.org/")
collection = cat.get_collection("GEDI_CalVal_Lidar_Data")
item = collection.get_item("usa_neonsrer_2019_NEON_D14_SRER_DP1_L088-1_2019091314_unclassified_point_cloud_0000001")
asset = item.assets["data"]
url = asset.href
filename = url.split("/")[-1]
save_path = f"/projects/{filename}"
response = requests.get(url)
with open(save_path, "wb") as f:
f.write(response.content)
Introduction to Pdal
PDAL (Point Data Abstraction Library) is a C/C++ based open-source library for processing point cloud data. Additionally, it also has a PDAL-Python wrapper to work in a Pythonic environment. Installing from conda-forge ensures compatibility across platforms and avoids version conflicts common with pip.
!conda install -c conda-forge pdal -y
Accessing and Getting Metadata Information
PDAL CLI provides multiple applications for processing point clouds. Also, it allows chaining of these applications for processing point clouds. Similar to gdal info for TIFFs, we can run pdal info <filename>on the command line for getting metadata from a point cloud file without reading it in memory.
[5]:
!pdal info /projects/GLLIDARPC_FL_20200311_FIA8_l0s12.las
{
"file_size": 25708263,
"filename": "/projects/GLLIDARPC_FL_20200311_FIA8_l0s12.las",
"now": "2025-03-25T09:08:47-0700",
"pdal_version": "2.5.5 (git-version: 9d28a2)",
"reader": "readers.las",
"stats":
{
"bbox":
{
"EPSG:4326":
{
"bbox":
{
"maxx": -80.9173406,
"maxy": 25.19483337,
"maxz": 20.43,
"minx": -80.92108766,
"miny": 25.18579162,
"minz": -0.02
},
"boundary": { "type": "Polygon", "coordinates": [ [ [ -80.921087663044844, 25.18579366676925, -0.02 ], [ -80.921081838916265, 25.194833369042652, -0.02 ], [ -80.917340601969812, 25.194831325803804, 20.43 ], [ -80.917346702199453, 25.185791624363894, 20.43 ], [ -80.921087663044844, 25.18579366676925, -0.02 ] ] ] }
},
"native":
{
"bbox":
{
"maxx": 508327.9363,
"maxy": 2786523.983,
"maxz": 20.43,
"minx": 507951.0063,
"miny": 2785523.003,
"minz": -0.02
},
"boundary": { "type": "Polygon", "coordinates": [ [ [ 507951.006302567664534, 2785523.003240843303502, -0.02 ], [ 507951.006302567664534, 2786523.983240843284875, -0.02 ], [ 508327.936302567657549, 2786523.983240843284875, 20.43 ], [ 508327.936302567657549, 2785523.003240843303502, 20.43 ], [ 507951.006302567664534, 2785523.003240843303502, -0.02 ] ] ] }
}
},
"statistic":
[
{
"average": 508099.5202,
"count": 918138,
"maximum": 508327.9363,
"minimum": 507951.0063,
"name": "X",
"position": 0,
"stddev": 59.41990754,
"variance": 3530.725412
},
{
"average": 2785815.214,
"count": 918138,
"maximum": 2786523.983,
"minimum": 2785523.003,
"name": "Y",
"position": 1,
"stddev": 242.6482822,
"variance": 58878.18884
},
{
"average": 5.265760735,
"count": 918138,
"maximum": 20.43,
"minimum": -0.02,
"name": "Z",
"position": 2,
"stddev": 4.852311023,
"variance": 23.54492226
},
{
"average": 31652.79552,
"count": 918138,
"maximum": 65535,
"minimum": 13631,
"name": "Intensity",
"position": 3,
"stddev": 8490.675942,
"variance": 72091577.95
},
{
"average": 1.30460018,
"count": 918138,
"maximum": 6,
"minimum": 1,
"name": "ReturnNumber",
"position": 4,
"stddev": 0.5609339823,
"variance": 0.3146469325
},
{
"average": 1.609117584,
"count": 918138,
"maximum": 6,
"minimum": 1,
"name": "NumberOfReturns",
"position": 5,
"stddev": 0.7392848798,
"variance": 0.5465421336
},
{
"average": 0.5275514138,
"count": 918138,
"maximum": 1,
"minimum": 0,
"name": "ScanDirectionFlag",
"position": 6,
"stddev": 0.4992406144,
"variance": 0.2492411911
},
{
"average": 0.003558288623,
"count": 918138,
"maximum": 1,
"minimum": 0,
"name": "EdgeOfFlightLine",
"position": 7,
"stddev": 0.05954520188,
"variance": 0.003545631067
},
{
"average": 1.343478867,
"count": 918138,
"maximum": 2,
"minimum": 1,
"name": "Classification",
"position": 8,
"stddev": 0.4748698564,
"variance": 0.2255013805
},
{
"average": -16.81245521,
"count": 918138,
"maximum": 15,
"minimum": -31,
"name": "ScanAngleRank",
"position": 9,
"stddev": 11.07965851,
"variance": 122.7588326
},
{
"average": 1.472448586,
"count": 918138,
"maximum": 2,
"minimum": 1,
"name": "UserData",
"position": 10,
"stddev": 0.4992406144,
"variance": 0.2492411911
},
{
"average": 491.1066278,
"count": 918138,
"maximum": 65534,
"minimum": 0,
"name": "PointSourceId",
"position": 11,
"stddev": 593.0605413,
"variance": 351720.8057
},
{
"average": 310318.8334,
"count": 918138,
"maximum": 310329.9385,
"minimum": 310314.0659,
"name": "GpsTime",
"position": 12,
"stddev": 3.714049405,
"variance": 13.79416298
}
]
}
}
[15]:
!pdal info /projects/GLLIDARPC_FL_20200311_FIA8_l0s12.copc.laz --metadata
{
"file_size": 7492843,
"filename": "/projects/GLLIDARPC_FL_20200311_FIA8_l0s12.copc.laz",
"metadata":
{
"comp_spatialreference": "PROJCS[\"WGS 84 / UTM zone 17N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-81],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32617\"]]",
"compressed": true,
"copc": true,
"copc_info":
{
"center_x": 508451.4963,
"center_y": 2786023.493,
"center_z": 500.47,
"gpstime_maximum": 0,
"gpstime_minimum": 310329.9385,
"halfsize": 500.49,
"root_hier_offset": 7491883,
"root_hier_size": 960,
"spacing": 6.809387755
},
"count": 918138,
"creation_doy": 83,
"creation_year": 2025,
"dataformat_id": 6,
"dataoffset": 1335,
"filesource_id": 0,
"global_encoding": 16,
"global_encoding_base64": "EAA=",
"header_size": 375,
"major_version": 1,
"maxx": 508327.9363,
"maxy": 2786523.983,
"maxz": 20.43,
"minor_version": 4,
"minx": 507951.0063,
"miny": 2785523.003,
"minz": -0.02,
"offset_x": 0,
"offset_y": 0,
"offset_z": 0,
"point_length": 30,
"project_id": "00000000-0000-0000-0000-000000000000",
"scale_x": 0.01,
"scale_y": 0.01,
"scale_z": 0.01,
"software_id": "PDAL 2.5.5 (9d28a2)",
"spatialreference": "PROJCS[\"WGS 84 / UTM zone 17N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-81],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32617\"]]",
"srs":
{
"compoundwkt": "PROJCS[\"WGS 84 / UTM zone 17N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-81],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32617\"]]",
"horizontal": "PROJCS[\"WGS 84 / UTM zone 17N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-81],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32617\"]]",
"isgeocentric": false,
"isgeographic": false,
"json": {
"type": "ProjectedCRS",
"name": "WGS 84 / UTM zone 17N",
"base_crs": {
"name": "WGS 84",
"datum": {
"type": "GeodeticReferenceFrame",
"name": "World Geodetic System 1984",
"ellipsoid": {
"name": "WGS 84",
"semi_major_axis": 6378137,
"inverse_flattening": 298.257223563
}
},
"coordinate_system": {
"subtype": "ellipsoidal",
"axis": [
{
"name": "Geodetic latitude",
"abbreviation": "Lat",
"direction": "north",
"unit": "degree"
},
{
"name": "Geodetic longitude",
"abbreviation": "Lon",
"direction": "east",
"unit": "degree"
}
]
},
"id": {
"authority": "EPSG",
"code": 4326
}
},
"conversion": {
"name": "UTM zone 17N",
"method": {
"name": "Transverse Mercator",
"id": {
"authority": "EPSG",
"code": 9807
}
},
"parameters": [
{
"name": "Latitude of natural origin",
"value": 0,
"unit": "degree",
"id": {
"authority": "EPSG",
"code": 8801
}
},
{
"name": "Longitude of natural origin",
"value": -81,
"unit": "degree",
"id": {
"authority": "EPSG",
"code": 8802
}
},
{
"name": "Scale factor at natural origin",
"value": 0.9996,
"unit": "unity",
"id": {
"authority": "EPSG",
"code": 8805
}
},
{
"name": "False easting",
"value": 500000,
"unit": "metre",
"id": {
"authority": "EPSG",
"code": 8806
}
},
{
"name": "False northing",
"value": 0,
"unit": "metre",
"id": {
"authority": "EPSG",
"code": 8807
}
}
]
},
"coordinate_system": {
"subtype": "Cartesian",
"axis": [
{
"name": "Easting",
"abbreviation": "",
"direction": "east",
"unit": "metre"
},
{
"name": "Northing",
"abbreviation": "",
"direction": "north",
"unit": "metre"
}
]
},
"id": {
"authority": "EPSG",
"code": 32617
}
},
"prettycompoundwkt": "PROJCS[\"WGS 84 / UTM zone 17N\",\n GEOGCS[\"WGS 84\",\n DATUM[\"WGS_1984\",\n SPHEROID[\"WGS 84\",6378137,298.257223563,\n AUTHORITY[\"EPSG\",\"7030\"]],\n AUTHORITY[\"EPSG\",\"6326\"]],\n PRIMEM[\"Greenwich\",0,\n AUTHORITY[\"EPSG\",\"8901\"]],\n UNIT[\"degree\",0.0174532925199433,\n AUTHORITY[\"EPSG\",\"9122\"]],\n AUTHORITY[\"EPSG\",\"4326\"]],\n PROJECTION[\"Transverse_Mercator\"],\n PARAMETER[\"latitude_of_origin\",0],\n PARAMETER[\"central_meridian\",-81],\n PARAMETER[\"scale_factor\",0.9996],\n PARAMETER[\"false_easting\",500000],\n PARAMETER[\"false_northing\",0],\n UNIT[\"metre\",1,\n AUTHORITY[\"EPSG\",\"9001\"]],\n AXIS[\"Easting\",EAST],\n AXIS[\"Northing\",NORTH],\n AUTHORITY[\"EPSG\",\"32617\"]]",
"prettywkt": "PROJCS[\"WGS 84 / UTM zone 17N\",\n GEOGCS[\"WGS 84\",\n DATUM[\"WGS_1984\",\n SPHEROID[\"WGS 84\",6378137,298.257223563,\n AUTHORITY[\"EPSG\",\"7030\"]],\n AUTHORITY[\"EPSG\",\"6326\"]],\n PRIMEM[\"Greenwich\",0,\n AUTHORITY[\"EPSG\",\"8901\"]],\n UNIT[\"degree\",0.0174532925199433,\n AUTHORITY[\"EPSG\",\"9122\"]],\n AUTHORITY[\"EPSG\",\"4326\"]],\n PROJECTION[\"Transverse_Mercator\"],\n PARAMETER[\"latitude_of_origin\",0],\n PARAMETER[\"central_meridian\",-81],\n PARAMETER[\"scale_factor\",0.9996],\n PARAMETER[\"false_easting\",500000],\n PARAMETER[\"false_northing\",0],\n UNIT[\"metre\",1,\n AUTHORITY[\"EPSG\",\"9001\"]],\n AXIS[\"Easting\",EAST],\n AXIS[\"Northing\",NORTH],\n AUTHORITY[\"EPSG\",\"32617\"]]",
"proj4": "+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs",
"units":
{
"horizontal": "metre",
"vertical": ""
},
"vertical": "",
"wkt": "PROJCS[\"WGS 84 / UTM zone 17N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-81],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32617\"]]"
},
"system_id": "PDAL"
},
"now": "2025-03-25T09:22:41-0700",
"pdal_version": "2.5.5 (git-version: 9d28a2)",
"reader": "readers.copc"
}
LAS to COPC Conversion
For converting the LiDAR LAS file to COPC format, we will define a pdal pipeline. A pipeline defines data processing within pdal for reading (using pdal readers), processing (using pdal filters) and writing operations (using pdal writers). The pipelines can also represent sequential operations and can be executed as stages.
A pdal pipeline is defined in a JSON format either as a JSON object or a JSON array. Below is an example of a pdal pipeline taking a .las file as input, generating stats and writing it to a COPC format.
[ ]:
#open a new notebook and create this json file
import json
pipeline_dict = {
"pipeline": [
{
"type": "readers.las",
"filename": "/projects/GLLIDARPC_FL_20200311_FIA8_l0s12.las"
},
{
"type": "filters.stats"
},
{
"type": "writers.copc",
"filename": "/projects/GLLIDARPC_FL_20200311_FIA8_l0s12.copc.laz"
}
]
}
with open("las_to_copc.json", "w") as f:
json.dump(pipeline_dict, f, indent=2)
print("JSON pipeline file created successfully!")
Validation of File
As we can see from output of the below cell, the .copc.laz file is created in the destination directory.
[11]:
!ls -lh /projects/GLLIDARPC_FL_20200311_FIA8_l0s12.copc.laz
-rw-r--r-- 1 root root 7.2M Mar 25 09:17 /projects/GLLIDARPC_FL_20200311_FIA8_l0s12.copc.laz
Let’s read the created COPC file again and check the value of copc flag from the metadata. If the generated LiDAR file is a valid COPC file, then this flag should be set to True.
[24]:
import pdal
import json
copc_filename = "/projects/GLLIDARPC_FL_20200311_FIA8_l0s12.copc.laz"
pipeline_dict = {
"pipeline": [
{
"type": "readers.copc",
"filename": copc_filename
},
{
"type": "filters.stats"
}
]
}
pipeline = pdal.Pipeline(json.dumps(pipeline_dict))
pipeline.execute()
metadata = pipeline.metadata
copc_flag = metadata["metadata"]["readers.copc"].get("copc")
print("COPC valid:", copc_flag)
COPC valid: True
Accessing the Data
The data values can be accessed from the executed pipeline using valid_pipe.arrays. The values in the arrays represent the LiDAR point cloud attributes such as X, Y, Z, and Intensity, etc.
[5]:
arr_values = pipeline.arrays
print(arr_values)
[array([(508144.69, 2786399.23, 0.1 , 23898, 1, 1, 1, 0, 2, 13.002, 1, 0, 310327.57128751, 0, 0),
(508141.26, 2786399.08, 0.16, 16492, 1, 1, 1, 0, 2, 13.002, 1, 0, 310327.57791575, 0, 0),
(508139.79, 2786400.09, 0.12, 18240, 1, 1, 1, 0, 2, 12. , 1, 0, 310327.5978811 , 0, 0),
...,
(507962.93, 2786522.54, 0.11, 23963, 1, 1, 0, 0, 2, -12. , 2, 0, 310329.90509551, 0, 0),
(507956.73, 2786522.96, 0.08, 24553, 1, 1, 0, 0, 2, -13.002, 2, 0, 310329.92512884, 0, 0),
(507955.45, 2786523.25, 0.09, 43646, 1, 1, 0, 0, 2, -13.998, 2, 0, 310329.93179795, 0, 0)],
dtype=[('X', '<f8'), ('Y', '<f8'), ('Z', '<f8'), ('Intensity', '<u2'), ('ReturnNumber', 'u1'), ('NumberOfReturns', 'u1'), ('ScanDirectionFlag', 'u1'), ('EdgeOfFlightLine', 'u1'), ('Classification', 'u1'), ('ScanAngleRank', '<f4'), ('UserData', 'u1'), ('PointSourceId', '<u2'), ('GpsTime', '<f8'), ('ScanChannel', 'u1'), ('ClassFlags', 'u1')])]
Similarly, we can get COPC file statistic and log from the executed pipeline using valid_pipe.metadata["metadata"]``["filters.stats"]``["statistic"]and valid_pipe.log. The readers are encouraged to explore the results of these operations on their own.
[6]:
metadata = pipeline.metadata
stats = metadata["metadata"]["filters.stats"]["statistic"]
import pprint
pprint.pprint(stats)
[{'average': 508099.5139,
'count': 918138,
'maximum': 508327.93,
'minimum': 507951,
'name': 'X',
'position': 0,
'stddev': 59.41990754,
'variance': 3530.725412},
{'average': 2785815.21,
'count': 918138,
'maximum': 2786523.98,
'minimum': 2785523,
'name': 'Y',
'position': 1,
'stddev': 242.6482821,
'variance': 58878.18882},
{'average': 5.265347497,
'count': 918138,
'maximum': 20.43,
'minimum': -0.02,
'name': 'Z',
'position': 2,
'stddev': 4.852162068,
'variance': 23.54347674},
{'average': 31652.79552,
'count': 918138,
'maximum': 65535,
'minimum': 13631,
'name': 'Intensity',
'position': 3,
'stddev': 8490.675942,
'variance': 72091577.95},
{'average': 1.30460018,
'count': 918138,
'maximum': 6,
'minimum': 1,
'name': 'ReturnNumber',
'position': 4,
'stddev': 0.5609339823,
'variance': 0.3146469325},
{'average': 1.609117584,
'count': 918138,
'maximum': 6,
'minimum': 1,
'name': 'NumberOfReturns',
'position': 5,
'stddev': 0.7392848798,
'variance': 0.5465421336},
{'average': 0.5275514138,
'count': 918138,
'maximum': 1,
'minimum': 0,
'name': 'ScanDirectionFlag',
'position': 6,
'stddev': 0.4992406144,
'variance': 0.2492411911},
{'average': 0.003558288623,
'count': 918138,
'maximum': 1,
'minimum': 0,
'name': 'EdgeOfFlightLine',
'position': 7,
'stddev': 0.05954520188,
'variance': 0.003545631067},
{'average': 1.343478867,
'count': 918138,
'maximum': 2,
'minimum': 1,
'name': 'Classification',
'position': 8,
'stddev': 0.4748698564,
'variance': 0.2255013805},
{'average': -16.81244672,
'count': 918138,
'maximum': 15,
'minimum': -31.00200081,
'name': 'ScanAngleRank',
'position': 9,
'stddev': 11.07964244,
'variance': 122.7584765},
{'average': 1.472448586,
'count': 918138,
'maximum': 2,
'minimum': 1,
'name': 'UserData',
'position': 10,
'stddev': 0.4992406144,
'variance': 0.2492411911},
{'average': 491.1066278,
'count': 918138,
'maximum': 65534,
'minimum': 0,
'name': 'PointSourceId',
'position': 11,
'stddev': 593.0605413,
'variance': 351720.8057},
{'average': 310318.8334,
'count': 918138,
'maximum': 310329.9385,
'minimum': 310314.0659,
'name': 'GpsTime',
'position': 12,
'stddev': 3.714049409,
'variance': 13.79416301},
{'average': 0,
'count': 918138,
'maximum': 0,
'minimum': 0,
'name': 'ScanChannel',
'position': 13,
'stddev': 0,
'variance': 0},
{'average': 0,
'count': 918138,
'maximum': 0,
'minimum': 0,
'name': 'ClassFlags',
'position': 14,
'stddev': 0,
'variance': 0}]