├── .github ├── FUNDING.yml └── ISSUE_TEMPLATE │ ├── config.yml │ ├── issue.yml │ └── vlr.yml ├── .gitignore ├── .travis.yml ├── Makefile ├── README.md ├── scripts ├── before_install.sh ├── build_docs.sh ├── docker.sh ├── docker │ └── Dockerfile └── stage.sh ├── source ├── 00_index.txt ├── 01_intro.txt ├── 02.00_definition.txt ├── 02.01_legacy.sub ├── 02.02_crs.sub ├── 02.03_datatypes.sub ├── 02.04_header.sub ├── 02.05_vlr.sub ├── 02.06_point.sub ├── 02.07_evlr.sub ├── 03_required_vlrs.txt ├── 04_optional_vlrs.txt ├── 05_defined_evlrs.txt ├── 06_profiles.txt ├── _static │ └── asprslogo45.png └── conf.py └── wiki ├── LAS_FWF_illustration_constant.png └── LAS_FWF_illustration_refracted.png /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: ['https://www.asprsfoundation.org/donate'] 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | contact_links: 3 | - name: How to contribute 4 | url: https://github.com/ASPRSorg/LAS/wiki/Get-Involved 5 | about: Learn how to participate in the ASPRS LAS Committee 6 | - name: ASPRS LiDAR Division 7 | url: https://www.asprs.org/divisions-committees/lidar-division 8 | about: Visit the LiDAR Division homepage 9 | 10 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/issue.yml: -------------------------------------------------------------------------------- 1 | name: Issue 2 | description: A standard issue or inquiry about the ASPRS LAS specification 3 | body: 4 | - type: dropdown 5 | id: browsers 6 | attributes: 7 | label: What is the issue about? 8 | multiple: true 9 | options: 10 | - Software implementation 11 | - Inquiry about the specification 12 | - Committee efforts 13 | - Other 14 | - type: textarea 15 | id: buginfo 16 | attributes: 17 | label: Issue description 18 | description: Describe the issue or question 19 | validations: 20 | required: true 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/vlr.yml: -------------------------------------------------------------------------------- 1 | name: Variable Length Record Community Description 2 | description: Describe a VLR in use in the community 3 | title: "[VLR Description]: " 4 | labels: ["vlr"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Please enter a description of a community LAS VLR 10 | - type: input 11 | id: contact 12 | attributes: 13 | label: Contact Details 14 | description: Who knows about this VLR and could answer questions about it? 15 | placeholder: ex. email@example.com 16 | validations: 17 | required: false 18 | - type: input 19 | id: user_id 20 | attributes: 21 | label: LAS User ID 22 | description: The LAS User ID in use for this VLR 23 | validations: 24 | required: true 25 | - type: checkboxes 26 | id: is_registered 27 | attributes: 28 | label: User ID registration 29 | description: Is the LAS User ID registered with the [ASPRS VLR Key List](https://www.asprs.org/misc/las-key-list.html). 30 | options: 31 | - label: Registered? 32 | - type: input 33 | id: record_id 34 | attributes: 35 | label: LAS Record ID 36 | description: The LAS Record ID in use for this VLR 37 | validations: 38 | required: true 39 | - type: textarea 40 | id: application 41 | attributes: 42 | label: What application(s) is the VLR used with? 43 | - type: textarea 44 | id: usage 45 | attributes: 46 | label: Please describe what the VLR is used for 47 | - type: textarea 48 | id: definition 49 | attributes: 50 | label: Please provide a definition of the VLR's contents 51 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: c 2 | services: docker 3 | sudo: required 4 | os: 5 | - linux 6 | before_install: "./scripts/before_install.sh" 7 | script: 8 | - echo "no compile needed. We just build the docs in after_success" 9 | after_success: 10 | - echo "$TRAVIS_SECURE_ENV_VARS" 11 | - sh -c "./scripts/build_docs.sh" 12 | - sh -c 'if test "$TRAVIS_SECURE_ENV_VARS" = "true"; then echo "publish "; ./scripts/stage.sh; fi' 13 | - echo "PDF at https://s3.amazonaws.com/asprs-las/LAS-specification-$TRAVIS_COMMIT.pdf" 14 | 15 | env: 16 | global: 17 | - secure: wJwGbbWxTl/mKS+qtgzlSOPydZNC2uJ/lAh35W3Tw5pufrLflFondwuxTMu8vnYR1kk2c5uxu5TFf6bjNDhEv5M/L4wYvt5rISYuqeU7C7iisl02VfbdXzZGBqLFRsB6z2Oho6nYB+nszFEMerd5m9r3qPSPILDlYuxmyjE0oZeptBOGLF9URhL4DrCRw00e7qjuOR09D9s5roZgK81FmOAtohQEfx0T8u5bqMFHcViWQGHsIGrowmObQd+4vnogV6WdydR87ezMtJn+L1Nc7EfXnmDme7NiGQRiBoVNQGxdDE07YAM4ev7sKgt+VeZSWidfHVKbUGyCxs1rhZfjsMF1f2efeSbfnN4nCI3+qrr7WNVU+da93U3PSVzk005/bMDz7KGXNZbh7yQyOmTitCxT557KWxz6twO87DxyoWDi+eZceC+ArrpycA1qR7QwMzjECHwVqITuSzXtMFfS3dps7kxUTcO8CyTXd01DeGt+5AUaoFWBLBFtq6BFgnFG/2rjuzK5DCz590hdDZV7jb4SVcWmOz9+Ig172CfwfIatLboyfm5RlFSXI5bXFPED7z83ZEqf5LWrWZaGr5l5mcIL/4OJaqsagvEPiY9rrvBRJ2LnoumMK1Glk6Iror4m4ovDcFA16CVnHZe3f45UJ4EJ+sCE+0vZYkkr6PvHEoE= 18 | - secure: DZ1aTWsXRQMapAogRcReYHhOxAvxBksm8X9C8VeE1WNJ3vxrfMSjz7ESih3GC/gN2bCEhVIYDr2LF3rd2Y5KJOLg/heWxzvyLFEBMlYnQaIMA7lxKevPid5yOgX79M63Czh4k3paooJ6K4lJvNzLKJG2Fme1yWwr/y9RSZ0VKPVm/d0APJcQWwGT0bFYe7fYLSHVf3baZZm9WaS/XAr4pEGwamW3mua7RbdWkT72KBynuX2VPO8b0M6z+G44tSV9KM7uQVGZ/lAEnD3iU33JGGNW52LxVE67Sv2Flvv0nnNg23/y4iFMSNoGR0wigBgoIOWIA5ypUSNs1mJm1kk3Sxz3EDqt6cvDVjp5rn5gF3yR6XXuJQSssi/ZdL18v2ISqTkVMj1yKvrCIB74yzWI8kfiuW+QydK0Cb+7Ci0bkDjM9N9rgZcZNQZf6MCoaqIH9M+XamROUYWbqrTUuysiE+1VPZ0ihpY1a68f4Zw0xpK803o2xLtaZJdJpSD4Xxjf3/OHWW+LsIq8Kn/m7Zyh6Hu9DX40rVJnRj5cpeFgInrsyARVdOWEOu8q64C9s9Av+dlJ9qdNB0Hj/yW4p1Iz1v4PFudMkismjeDrJTvQeyKskdHMIhBYeuUJxLJsZZ90HgvjWU0VH+zfWCmuhZh0mGeUS0Eu4HoZ7J/6Y9VCx3s= 19 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | SPHINXPROJ = LAS 8 | SOURCEDIR = source 9 | BUILDDIR = build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ASPRS LAS Specification 2 | 3 | This repository is the official collaborative editing environment for the ASPRS 4 | LAS Working Group (LWG). We are responsible for maintaining the ASPRS LAS 5 | Specification, the remote sensing industry's most widely used file format for 6 | point cloud data. 7 | 8 | The current published version of the ASPRS LAS Specification can be found at 9 | https://www.asprs.org/committee-general/laser-las-file-format-exchange-activities.html 10 | 11 | ## Repo Contents 12 | 13 | * The [source code](https://github.com/ASPRSorg/LAS/tree/master/source) folder 14 | contains the content of the specification itself. Everything else is the support 15 | codebase for generating the PDFs. You probably aren't interested in that. 16 | * The [Wiki pages](https://github.com/ASPRSorg/LAS/wiki) supplement the formal 17 | specification to assist with its interpretation and implementation. 18 | * The [Issues page](https://github.com/ASPRSorg/LAS/issues) is your tool to 19 | request changes to the wiki pages or specification. 20 | 21 | ## Get Involved 22 | 23 | New to LAS? New to GitHub? Want to help? No problem! 24 | 25 | Learn how to sign up and contribute [here](https://github.com/ASPRSorg/LAS/wiki/Get-Involved). 26 | 27 | [![Build Status](https://api.travis-ci.org/ASPRSorg/LAS.svg?branch=master)](https://travis-ci.org/ASPRSorg/LAS) 28 | -------------------------------------------------------------------------------- /scripts/before_install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ./scripts/docker.sh 4 | 5 | -------------------------------------------------------------------------------- /scripts/build_docs.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "building docs for $TRAVIS_BUILD_DIR" 4 | docker run -v $TRAVIS_BUILD_DIR:/data -w /data asprsorg/las make latexpdf 5 | 6 | 7 | -------------------------------------------------------------------------------- /scripts/docker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # asprsorg/las image has all of the Sphinx 4 | # dependencies need to build the LAS specification 5 | 6 | docker pull asprsorg/las 7 | 8 | 9 | -------------------------------------------------------------------------------- /scripts/docker/Dockerfile: -------------------------------------------------------------------------------- 1 | ## 2 | # ASPRSorg/LAS 3 | 4 | FROM ubuntu:xenial 5 | 6 | MAINTAINER Howard Butler 7 | 8 | RUN apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 16126D3A3E5C1192 \ 9 | && apt-get update \ 10 | && apt-get install -y --fix-missing --no-install-recommends \ 11 | software-properties-common build-essential ca-certificates \ 12 | git make cmake wget unzip libtool automake python-pip \ 13 | libpython-dev libjpeg-dev zlib1g-dev \ 14 | python-dev python-pip g++ doxygen dvipng \ 15 | cmake libjpeg8-dev zlib1g-dev texlive-latex-base \ 16 | texlive-latex-extra git texlive-fonts-recommended texlive-latex-recommended \ 17 | graphviz python-matplotlib \ 18 | python-setuptools imagemagick latexmk \ 19 | && apt-get remove --purge -y $BUILD_PACKAGES && rm -rf /var/lib/apt/lists/* 20 | 21 | 22 | 23 | RUN pip install breathe \ 24 | sphinx_bootstrap_theme awscli sphinxcontrib-bibtex \ 25 | sphinx_rtd_theme gitpython 26 | 27 | RUN git clone https://github.com/sphinx-doc/sphinx.git && cd sphinx \ 28 | && git checkout stable \ 29 | && python setup.py install 30 | 31 | -------------------------------------------------------------------------------- /scripts/stage.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | sha=$(git rev-parse HEAD) 4 | 5 | basetex="LAS-specification-$sha.tex" 6 | basepdf="LAS-specification-$sha.pdf" 7 | 8 | filename="build/latex/$basepdf" 9 | 10 | 11 | 12 | docker run -e "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" -e "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" -v $TRAVIS_BUILD_DIR:/data -w /data asprsorg/las aws s3 cp /data/build/latex/LAS.tex s3://asprs-las/$basetex --acl public-read --region us-east-1 13 | 14 | echo "Raw TEX uploaded to https://s3.amazonaws.com/asprs-las/$basetex" 15 | 16 | docker run -e "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" -e "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" -v $TRAVIS_BUILD_DIR:/data -w /data asprsorg/las aws s3 cp /data/build/latex/LAS.pdf s3://asprs-las/$basepdf --acl public-read --region us-east-1 17 | 18 | echo "Compiled PDF uploaded to https://s3.amazonaws.com/asprs-las/$basepdf" 19 | 20 | -------------------------------------------------------------------------------- /source/00_index.txt: -------------------------------------------------------------------------------- 1 | 2 | Welcome to LAS's documentation! 3 | =============================== 4 | 5 | .. toctree:: 6 | :maxdepth: 5 7 | :caption: Contents: 8 | :numbered: 9 | 10 | 01_intro 11 | 02.00_definition 12 | 03_required_vlrs 13 | 04_optional_vlrs 14 | 05_defined_evlrs 15 | 06_profiles 16 | 17 | -------------------------------------------------------------------------------- /source/01_intro.txt: -------------------------------------------------------------------------------- 1 | Introduction 2 | -------------------------------------------------------------------------------- 3 | 4 | Purpose, Scope, and Applicability 5 | ................................................................................ 6 | 7 | The LASer (LAS) file is intended to contain point cloud data records, 8 | including those derived from lidar or other sources. 9 | The data will commonly be put into this format from software (e.g., provided by 10 | hardware vendors), which combines GPS, IMU, and laser pulse range data to 11 | produce points with X, Y, and Z coordinates. The purpose of LAS is to provide 12 | an open format that allows different hardware and software tools to 13 | exchange point cloud data in a common format. 14 | 15 | This document reflects the fourth revision of the LAS format specification 16 | since its initial version 1.0 release. 17 | 18 | 19 | LAS 1.4 Revision History 20 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 21 | 22 | Summary of LAS 1.4 revisions (GitHub Issue numbers included when applicable): 23 | 24 | * R11 - Approved Version (Nov 2011). 25 | * R12 - Errata (June 2012) - Typographical corrections: 26 | 27 | * Corrected Public Header Size in descriptive paragraph to 375 bytes. 28 | * Corrected two instances of Scan Angle Rank from "Unsigned Char" to "Char". 29 | 30 | * R13 - Added Domain Profile Section (July 2013). 31 | * R14 - Multiple updates (March 2019): 32 | 33 | * Aesthetic changes from migration to GitHub. 34 | * Multiple capitalization & typo corrections. 35 | * Updated ASPRS contact info. 36 | (`I-30 `_) 37 | * Additional standard classifications 19-22 for PDRFs 6-10: 38 | (`I-11 `_, 39 | `I-26 `_) 40 | 41 | * Class 19 -- Overhead Structure in PDRFs 6-10. 42 | * Class 20 -- Ignored Ground. 43 | * Class 21 -- Snow. 44 | * Class 22 -- Temporal Exclusion. 45 | 46 | * Added OGC endorsement. 47 | (`I-31 `_) 48 | * Added minimum PDRF sizes to attribute tables. 49 | (`I-47 `_) 50 | * Section reorganization: 51 | (`I-57 `_) 52 | 53 | * Addition of Table of Contents with section numbers. (c.f. 54 | `I-27 `_, 55 | `I-49 `_) 56 | * Divided Defined Variable Length Records section into Coordinate 57 | Reference System VLRs section (s3) and Other Specification Defined 58 | VLRs (s4). 59 | * Expanded EVLR discussion in Legacy Compatibility section (s2.1) and moved 60 | Legacy Compatibility section to EVLR definition (now s2.7.1). 61 | * Swapped order of LAS 1.4 Revision History (now s1.1.1) and 62 | LAS 1.4 Additions (now s1.1.2). 63 | * Rearranged paragraphs in Extra Bytes VLR description. 64 | 65 | * Deprecated "tuple" and "triple" extra byte data types. 66 | (`I-1 `_) 67 | 68 | * Added explanation and example of implicit arrays from descriptor names. 69 | 70 | * Clarified that ExtraByte min/max should be an untransformed value. 71 | (`I-4 `_) 72 | * Clarified that Legacy Point Counts should be set to zero if using non-legacy 73 | PDRFs. (`I-12 `_) 74 | * Clarified Full Waveform descriptions and added wiki link. 75 | (`I-9 `_) 76 | * Renamed X(t), Y(t), and Z(t) from waveform packets to Parametric dx/dy/dz. 77 | * PDRF9 now correctly requires Scanner Channel like other PDRFs. 78 | (`I-29 `_) 79 | * Clarified origin date/time for Adjusted Standard GPS Time. 80 | (`I-40 `_) 81 | * Clarified null-termination of fixed-length ``char`` arrays, especially VLR 82 | Description. (`I-46 `_) 83 | * Clarified relationship between FileSourceID and PointSourceID. 84 | (`I-59 `_) 85 | * Added language to support technologies other than conventional linear-mode 86 | lidar scanners. (`I-35 `_) 87 | 88 | * Clarified and renamed Synthetic Return Numbers Global Encoding bit. 89 | * Clarified Synthetic point classification flag. 90 | * Clarified validity of zero-value PointSourceID. 91 | * Unified Return Number and Number of Returns descriptions between 92 | legacy and non-legacy PDRFs. 93 | * Clarified Scan Direction and Edge of Flight Line Flags for non-rotational systems. 94 | 95 | * Added wiki link for Project ID examples. 96 | (`I-38 `_) 97 | 98 | * R15 - Errata and typo corrections for R14 (July 2019): 99 | 100 | * Minor editorial punctuation corrections. 101 | (`I-78 `_) 102 | * Fixed unintended reordering of Min/Max XYZ in R14 LAS header. 103 | (`I-79 `_) 104 | * Added missing Scanner Channel field in note about PDRF6-10 bit field. 105 | (`I-80 `_) 106 | 107 | For detailed information on changes in revisions R14 and newer, review the 108 | inline differencing provided on the `GitHub page `_. 109 | 110 | 111 | Comparison of LAS 1.4 to Previous Versions 112 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | 114 | The additions of LAS 1.4 include: 115 | 116 | * Backward compatibility with LAS 1.1 – LAS 1.3 when payloads consist of only 117 | legacy content. 118 | * LAS 1.4 mode which supports: 119 | 120 | * Extension of offsets and field sizes to support full 64 bit. 121 | * Support for up to 15 returns per outgoing pulse. 122 | * Extension of the Point Class field to support 256 classes. 123 | * Definition of several new ASPRS standard classes. 124 | * Extension of the Scan Angle field to 2 bytes to support finer angle resolution. 125 | * Addition of a Sensor Channel bit field to support mobile mapping systems. 126 | * Addition of Well Known Text (WKT) definitions for Coordinate Reference 127 | Systems. 128 | * Addition of an Overlap bit to indicate points in the overlap 129 | region while maintaining the class definition. 130 | * Addition of an (optional) :ref:`extrabytes_vlr_label` Variable Length Record to describe 131 | "extra bytes" stored with each point. 132 | 133 | * Other minor changes: 134 | 135 | * Added definitions for "LAS Domain Profile" and "LAS Domain Profile 136 | Description". 137 | * Added links to official LAS wiki: https://github.com/ASPRSorg/LAS/wiki 138 | 139 | 140 | Conformance 141 | ................................................................................ 142 | 143 | The data types used in the LAS format definition are conformant to the 1999 144 | ANSI C Language Specification (ANSI/ISO/IEC 9899:1999 ("C99"). 145 | 146 | 147 | Authority 148 | ................................................................................ 149 | 150 | ASPRS 151 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | 153 | The American Society for Photogrammetry & Remote Sensing (ASPRS) is the owner 154 | of the LAS Specification. The standard is maintained by committees within the 155 | organization as directed by the ASPRS Board of Directors. Questions related to 156 | this standard can be directed to ASPRS: 157 | 158 | * Online at https://github.com/ASPRSorg/LAS 159 | * By phone at 301-493-0290 160 | * By email at las@asprs.org or asprs@asprs.org 161 | * By mail at 425 Barlow Place, Suite 210, Bethesda, Maryland 20814-2160 162 | 163 | OGC 164 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | 166 | LAS has been recognized by the Open Geospatial Consortium (`OGC`_) in 2018 as an 167 | OGC Community Standard. The OGC version of the document with forward material 168 | about standards that LAS references and its status within the standard body can 169 | be found at https://portal.opengeospatial.org/files/17-030r1. 170 | 171 | Future recognition and activity on OGC referencing activities of LAS can be 172 | followed at http://www.opengeospatial.org/standards/community. 173 | 174 | .. _`OGC`: http://www.opengeospatial.org 175 | 176 | .. raw:: latex 177 | 178 | \newpage 179 | 180 | -------------------------------------------------------------------------------- /source/02.00_definition.txt: -------------------------------------------------------------------------------- 1 | LAS Format Definition 2 | -------------------------------------------------------------------------------- 3 | 4 | The format contains binary data consisting of a public header block, any number 5 | of (optional) Variable Length Records (VLRs), the Point Data Records, and any 6 | number of (optional) Extended Variable Length Records (EVLRs). All data are in 7 | little-endian format. The public header block contains generic data such as 8 | point numbers and point data bounds. We refer to the data content of the file 9 | as the "payload." 10 | 11 | The Variable Length Records (VLRs) contain variable types of data including 12 | projection information, metadata, waveform packet information, and user 13 | application data. They are limited to a data payload of 65,535 bytes. 14 | 15 | The Extended Variable Length Records (EVLRs) allow a higher payload than VLRs 16 | and have the advantage that they can be appended to the end of a LAS file. This 17 | allows, for example, adding projection information to a LAS file without having 18 | to rewrite the entire file. 19 | 20 | 21 | .. table:: LAS 1.4 Format Definition 22 | 23 | +--------------------------------------------+ 24 | | :ref:`headerblock_label` | 25 | +--------------------------------------------+ 26 | | :ref:`vlrdef_label` | 27 | +--------------------------------------------+ 28 | | :ref:`ptrecords_label` | 29 | +--------------------------------------------+ 30 | | :ref:`evlrdef_label` | 31 | +--------------------------------------------+ 32 | 33 | 34 | A LAS file that contains point record types 4, 5, 9, or 10 could potentially 35 | contain one block of waveform data packets that is stored as the payload of any 36 | Extended Variable Length Record (EVLR). Unlike other EVLRs, the Waveform Data 37 | Packets (if stored internally to the file) have the offset to the storage 38 | header contained within the Public Header Block ("Start of Waveform Data Packet 39 | Record"). 40 | 41 | .. include:: ./02.01_legacy.sub 42 | .. include:: ./02.02_crs.sub 43 | .. include:: ./02.03_datatypes.sub 44 | .. include:: ./02.04_header.sub 45 | .. include:: ./02.05_vlr.sub 46 | .. include:: ./02.06_point.sub 47 | .. include:: ./02.07_evlr.sub 48 | 49 | 50 | -------------------------------------------------------------------------------- /source/02.01_legacy.sub: -------------------------------------------------------------------------------- 1 | Legacy Compatibility (LAS 1.1 - LAS 1.3) 2 | ................................................................................ 3 | 4 | LAS 1.4 moves the file specification from a 32 bit file structure (maximum 5 | value of :math:`2^{32}-1 \equiv 4,294,967,295 \equiv \mbox{UINT32\_MAX}`) to a 6 | 64 bit file structure (:math:`2^{64} - 1`). 7 | 8 | To maintain the ability to place a LAS 1.1 through LAS 1.3 payload (point 9 | record types 0-5, GeoTIFF coordinate reference system, referred to as "Legacy" 10 | payloads) in a LAS 1.4 file structure, it is necessary to duplicate some of 11 | the fields within the LAS 1.4 file structure. These duplicate fields are named 12 | "Legacy xxx" where "xxx" denotes the meaning of the field. 13 | 14 | A LAS 1.4 file writer who wishes to maintain backward compatibility must 15 | maintain both the legacy fields and the equivalent non-legacy fields in 16 | synchronization. However, this is not possible if the number of points 17 | exceeds UINT32_MAX, in which case the legacy fields must be set to zero. If a 18 | file writer is not maintaining backward compatibility, the legacy fields must 19 | always be set to zero. 20 | 21 | If there is a discrepancy between a non-zero legacy field and the equivalent 22 | LAS 1.4 field, the LAS 1.4 reader should use the legacy value to maintain the 23 | same behavior as a LAS 1.1 through LAS 1.3 reader. Best practice is to also 24 | throw an informative error so that the file can be repaired. 25 | 26 | LAS 1.4 introduced the option to define Variable Length Records (VLRs) as 27 | Extended Variable Length Records (EVLRs) instead. A LAS 1.4 file writer wishing 28 | to maintain backward compatibility must use only VLRs. See the 29 | :ref:`evlr_legacy_label` section for more information. 30 | 31 | -------------------------------------------------------------------------------- /source/02.02_crs.sub: -------------------------------------------------------------------------------- 1 | Coordinate Reference System (CRS) Representation 2 | ................................................................................ 3 | 4 | GeoTIFF is being replaced by Well Known Text (WKT) as the required Coordinate 5 | Reference System (CRS) representation for the new point types (6-10) introduced 6 | by LAS 1.4. 7 | 8 | GeoTIFF is maintained for legacy reasons for point types 0-5. 9 | 10 | A "WKT" bit has been added to the Global Encoding flag in the Public Header 11 | Block. If this bit is set, the CRS for the file will be located in the WKT 12 | (Extended) Variable Length Records (EVLR, VLR). 13 | 14 | A file writer who desires to maintain backward compatibility with legacy LAS 15 | for point types 0-5 must add a GeoTIFF VLR to represent the CRS for the file 16 | and ensure that the WKT bit is false. 17 | 18 | The CRS representation is summarized below: 19 | 20 | .. table:: Coordinate Reference System Representation 21 | 22 | +-----------------------+----------------------------+-----------------------+ 23 | | Point Type | WKT bit == False | WKT bit == True | 24 | +=======================+============================+=======================+ 25 | | 0-5 | GeoTIFF | WKT | 26 | +-----------------------+----------------------------+-----------------------+ 27 | | 6-10 | Error | WKT | 28 | +-----------------------+----------------------------+-----------------------+ 29 | 30 | It is considered a file error to have more than one GeoTIFF (E)VLR or more than 31 | one WKT (E)VLR in the file. A writer can append a new CRS EVLR to a file by 32 | "superseding" the existing CRS (E)VLR. Superseding is performed by changing the 33 | LAS_Spec ID of the record to ":ref:`superseded_vlr_label`", a new LASF_Spec defined in this 34 | release. 35 | 36 | 37 | .. raw:: latex 38 | 39 | \newpage 40 | 41 | -------------------------------------------------------------------------------- /source/02.03_datatypes.sub: -------------------------------------------------------------------------------- 1 | Data Types 2 | ................................................................................ 3 | 4 | The following data types are used in the LAS format definition. Note that these 5 | data types are conformant to the 1999 ANSI C Language Specification 6 | (ANSI/ISO/IEC 9899:1999 ("C99")). 7 | 8 | * char (1 byte) 9 | * unsigned char (1 byte) 10 | * short (2 bytes) 11 | * unsigned short (2 bytes) 12 | * long (4 bytes) 13 | * unsigned long (4 bytes) 14 | * long long (8 bytes) 15 | * unsigned long long (8 bytes) 16 | * float (4 byte IEEE floating point format) 17 | * double (8 byte IEEE floating point format) 18 | * string (a variable series of 1 byte characters, ASCII encoded, null-terminated) 19 | 20 | .. warning:: 21 | 22 | Fixed-length ``char`` arrays will not be null-terminated if all bytes are 23 | utilized. Examples include the System Identifier and Generating Software in 24 | the LAS Header, the User ID or Description in the Variable Length Record, 25 | and the Name of an Extra Byte Descriptor. 26 | 27 | 28 | .. raw:: latex 29 | 30 | \newpage 31 | 32 | -------------------------------------------------------------------------------- /source/02.04_header.sub: -------------------------------------------------------------------------------- 1 | .. _headerblock_label: 2 | 3 | Public Header Block 4 | ................................................................................ 5 | 6 | .. tabularcolumns:: |p{6.5cm}|p{4.0cm}|p{2.0cm}|p{1.5cm}| 7 | 8 | .. table:: Public Header Block 9 | 10 | +----------------------------------+-------------------------+-----------+--------------+ 11 | | **Item** | **Format** | **Size** | **Required** | 12 | +----------------------------------+-------------------------+-----------+--------------+ 13 | | File Signature ("LASF") | char[4] | 4 bytes | yes | 14 | +----------------------------------+-------------------------+-----------+--------------+ 15 | | File Source ID | unsigned short | 2 bytes | yes | 16 | +----------------------------------+-------------------------+-----------+--------------+ 17 | | Global Encoding | unsigned short | 2 bytes | yes | 18 | +----------------------------------+-------------------------+-----------+--------------+ 19 | | Project ID - GUID Data 1 | unsigned long | 4 bytes | | 20 | +----------------------------------+-------------------------+-----------+--------------+ 21 | | Project ID - GUID Data 2 | unsigned short | 2 bytes | | 22 | +----------------------------------+-------------------------+-----------+--------------+ 23 | | Project ID - GUID Data 3 | unsigned short | 2 bytes | | 24 | +----------------------------------+-------------------------+-----------+--------------+ 25 | | Project ID - GUID Data 4 | unsigned char[8] | 8 bytes | | 26 | +----------------------------------+-------------------------+-----------+--------------+ 27 | | Version Major | unsigned char | 1 byte | yes | 28 | +----------------------------------+-------------------------+-----------+--------------+ 29 | | Version Minor | unsigned char | 1 byte | yes | 30 | +----------------------------------+-------------------------+-----------+--------------+ 31 | | System Identifier | char[32] | 32 bytes | yes | 32 | +----------------------------------+-------------------------+-----------+--------------+ 33 | | Generating Software | char[32] | 32 bytes | yes | 34 | +----------------------------------+-------------------------+-----------+--------------+ 35 | | File Creation Day of Year | unsigned short | 2 bytes | yes | 36 | +----------------------------------+-------------------------+-----------+--------------+ 37 | | File Creation Year | unsigned short | 2 bytes | yes | 38 | +----------------------------------+-------------------------+-----------+--------------+ 39 | | Header Size | unsigned short | 2 bytes | yes | 40 | +----------------------------------+-------------------------+-----------+--------------+ 41 | | Offset to Point Data | unsigned long | 4 bytes | yes | 42 | +----------------------------------+-------------------------+-----------+--------------+ 43 | | Number of Variable Length Records| unsigned long | 4 bytes | yes | 44 | +----------------------------------+-------------------------+-----------+--------------+ 45 | | Point Data Record Format | unsigned char | 1 byte | yes | 46 | +----------------------------------+-------------------------+-----------+--------------+ 47 | | Point Data Record Length | unsigned short | 2 bytes | yes | 48 | +----------------------------------+-------------------------+-----------+--------------+ 49 | | Legacy Number of Point Records | unsigned long | 4 bytes | yes | 50 | +----------------------------------+-------------------------+-----------+--------------+ 51 | | Legacy Number of Point by Return | unsigned long[5] | 20 bytes | yes | 52 | +----------------------------------+-------------------------+-----------+--------------+ 53 | | X Scale Factor | double | 8 bytes | yes | 54 | +----------------------------------+-------------------------+-----------+--------------+ 55 | | Y Scale Factor | double | 8 bytes | yes | 56 | +----------------------------------+-------------------------+-----------+--------------+ 57 | | Z Scale Factor | double | 8 bytes | yes | 58 | +----------------------------------+-------------------------+-----------+--------------+ 59 | | X Offset | double | 8 bytes | yes | 60 | +----------------------------------+-------------------------+-----------+--------------+ 61 | | Y Offset | double | 8 bytes | yes | 62 | +----------------------------------+-------------------------+-----------+--------------+ 63 | | Z Offset | double | 8 bytes | yes | 64 | +----------------------------------+-------------------------+-----------+--------------+ 65 | | Max X | double | 8 bytes | yes | 66 | +----------------------------------+-------------------------+-----------+--------------+ 67 | | Min X | double | 8 bytes | yes | 68 | +----------------------------------+-------------------------+-----------+--------------+ 69 | | Max Y | double | 8 bytes | yes | 70 | +----------------------------------+-------------------------+-----------+--------------+ 71 | | Min Y | double | 8 bytes | yes | 72 | +----------------------------------+-------------------------+-----------+--------------+ 73 | | Max Z | double | 8 bytes | yes | 74 | +----------------------------------+-------------------------+-----------+--------------+ 75 | | Min Z | double | 8 bytes | yes | 76 | +----------------------------------+-------------------------+-----------+--------------+ 77 | | Start of Waveform Data Packet | unsigned long long | 8 bytes | yes | 78 | | Record | | | | 79 | +----------------------------------+-------------------------+-----------+--------------+ 80 | | Start of First Extended Variable | unsigned long long | 8 bytes | yes | 81 | | Length Record | | | | 82 | +----------------------------------+-------------------------+-----------+--------------+ 83 | | Number of Extended Variable | unsigned long | 4 bytes | yes | 84 | | Length Records | | | | 85 | +----------------------------------+-------------------------+-----------+--------------+ 86 | | Number of Point Records | unsigned long long | 8 bytes | yes | 87 | +----------------------------------+-------------------------+-----------+--------------+ 88 | | Number of Points by Return | unsigned long long[15] | 120 bytes | yes | 89 | +----------------------------------+-------------------------+-----------+--------------+ 90 | 91 | .. note:: 92 | 93 | Any field in the Public Header Block that is not required and is not used 94 | must be zero filled. 95 | 96 | 97 | **File Signature** 98 | 99 | The file signature must contain the four characters "LASF", and it is required 100 | by the LAS specification. These four characters can be checked by user software 101 | as a quick look initial determination of file type. 102 | 103 | **File Source ID** 104 | 105 | This field should be set to a value from 0 to 65,535. A value of zero is 106 | interpreted to mean that an ID has not been assigned, which is the norm for a 107 | LAS file resulting from an aggregation of multiple independent sources (e.g., a 108 | tile merged from multiple swaths). 109 | 110 | Note that this scheme allows a project to contain up to 65,535 unique sources. 111 | Example sources can include a data repository ID or an original collection of 112 | temporally consistent data such as a flight line or sortie number for airborne 113 | systems, a route number for mobile systems, or a setup identifier for static 114 | systems. 115 | 116 | .. _globalencoding_link: 117 | 118 | **Global Encoding** 119 | 120 | This is a bit field used to indicate certain global properties about the file. 121 | In LAS 1.2 (the version in which this field was introduced), only the low bit 122 | is defined (this is the bit, that if set, would have the unsigned integer yield 123 | a value of 1). This bit field is defined as: 124 | 125 | 126 | .. tabularcolumns:: |p{2.0cm}|p{3.0cm}|p{11.0cm}| 127 | 128 | .. table:: Global Encoding -- Bit Field Encoding 129 | 130 | +-------+-----------------------+------------------------------------------+ 131 | | Bits | Field Name | Description | 132 | +=======+=======================+==========================================+ 133 | | 0 | GPS Time Type | The meaning of GPS Time in the point | 134 | | | | records. If this bit is not set, the GPS | 135 | | | | time in the point record fields is GPS | 136 | | | | Week Time (the same as versions 1.0 | 137 | | | | through 1.2 of LAS). Otherwise, if this | 138 | | | | bit is set, the GPS Time is standard GPS | 139 | | | | Time (satellite GPS Time) minus | 140 | | | | 1 x :math:`10^9` (Adjusted Standard GPS | 141 | | | | Time). The offset moves the time back to | 142 | | | | near zero to improve floating-point | 143 | | | | resolution. The origin of standard GPS | 144 | | | | Time is defined as midnight of the | 145 | | | | morning of January 6, 1980. | 146 | +-------+-----------------------+------------------------------------------+ 147 | | 1 | Waveform Data Packets | If this bit is set, the waveform data | 148 | | | Internal | packets are located within this file | 149 | | | | (note that this bit is mutually | 150 | | | | exclusive with bit 2). This is | 151 | | | | deprecated now. | 152 | +-------+-----------------------+------------------------------------------+ 153 | | 2 | Waveform Data Packets | If this bit is set, the waveform data | 154 | | | External | packets are located externally in an | 155 | | | | auxiliary file with the same base name | 156 | | | | as this file but the extension \*.wdp. | 157 | | | | (note that this bit is mutually | 158 | | | | exclusive with bit 1) | 159 | +-------+-----------------------+------------------------------------------+ 160 | | 3 | Synthetic Return | If this bit is set, the point return | 161 | | | Numbers | numbers in the point data records have | 162 | | | | been synthetically generated. This could | 163 | | | | be the case, for example, when a | 164 | | | | composite file is created by combining a | 165 | | | | First Return File and a Last Return | 166 | | | | File, or when simulating return numbers | 167 | | | | for a system not directly supporting | 168 | | | | multiple returns. | 169 | +-------+-----------------------+------------------------------------------+ 170 | | 4 | WKT | If set, the Coordinate Reference System | 171 | | | | (CRS) is WKT. If not set, the CRS is | 172 | | | | GeoTIFF. It should not be set if the | 173 | | | | file writer wishes to ensure legacy | 174 | | | | compatibility (which means the CRS must | 175 | | | | be GeoTIFF). | 176 | +-------+-----------------------+------------------------------------------+ 177 | | 5:15 | Reserved | Must be set to zero (0). | 178 | +-------+-----------------------+------------------------------------------+ 179 | 180 | 181 | **Project ID (GUID Data)** 182 | 183 | The four fields that comprise a complete Globally Unique Identifier (GUID) are 184 | now reserved for use as a Project Identifier (Project ID). The field remains 185 | optional. The time of assignment of the Project ID is at the discretion of 186 | processing software. The Project ID should be the same for all files that are 187 | associated with a unique project. By assigning a Project ID and using a File 188 | Source ID (defined above) every file within a project and every point within a 189 | file can be uniquely identified, globally. 190 | 191 | .. note:: 192 | 193 | Example implementations of representing the Project ID fields as a GUID can 194 | be found on the official LAS wiki: https://github.com/ASPRSorg/LAS/wiki 195 | 196 | **Version Number** 197 | 198 | The version number consists of a major and minor field. The major and minor 199 | fields combine to form the number that indicates the format number of the 200 | current specification itself. For example, specification number 1.4 would 201 | contain 1 in the major field and 4 in the minor field. It should be noted that 202 | the LAS Working Group does not associate any particular meaning to major or 203 | minor version number. 204 | 205 | **System Identifier** 206 | 207 | The version 1.0 specification assumed that LAS files are exclusively generated 208 | as a result of collection by a hardware sensor. Subsequent versions recognize 209 | that files often result from extraction, merging, or modifying existing data 210 | files. Thus, System ID becomes: 211 | 212 | .. tabularcolumns:: |p{6.5cm}|p{9.5cm}| 213 | 214 | .. table:: System Identifier 215 | 216 | +-----------------------------+---------------------------------------------+ 217 | | Generating Agent | System ID | 218 | +=============================+=============================================+ 219 | | Hardware system | String identifying hardware (e.g., "ALTM | 220 | | | 1210", "ALS50", "LMS-Q680i", etc. | 221 | +-----------------------------+---------------------------------------------+ 222 | | Merge of one or more files | "MERGE" | 223 | +-----------------------------+---------------------------------------------+ 224 | | Modification of a single | "MODIFICATION" | 225 | | file | | 226 | +-----------------------------+---------------------------------------------+ 227 | | Extraction from one or more | "EXTRACTION" | 228 | | files | | 229 | +-----------------------------+---------------------------------------------+ 230 | | Reprojection, rescaling, | "TRANSFORMATION" | 231 | | warping, etc. | | 232 | +-----------------------------+---------------------------------------------+ 233 | | Some other operation | "OTHER" or a string of up to 32 characters | 234 | | | identifying the operation | 235 | +-----------------------------+---------------------------------------------+ 236 | 237 | 238 | 239 | **Generating Software** 240 | 241 | This information is ASCII data describing the generating software itself. This 242 | field provides a mechanism for specifying which generating software package and 243 | version was used during LAS file creation (e.g., "TerraScan V-10.8", "REALM 244 | V-4.2", etc.). If the character data is less than 32 characters, the remaining 245 | data must be null. 246 | 247 | **File Creation Day of Year** 248 | 249 | Day, expressed as an unsigned short, on which this file was created. Day is 250 | computed as the Greenwich Mean Time (GMT) day. January 1 is considered day 1. 251 | 252 | **File Creation Year** 253 | 254 | The year, expressed as a four digit number, in which the file was created. 255 | 256 | **Header Size** 257 | 258 | The size, in bytes, of the Public Header Block itself. For LAS 1.4 this size is 259 | 375 bytes. In the event that the header is extended by a new revision of the 260 | LAS specification through the addition of data at the end of the header, the 261 | Header Size field will be updated with the new header size. The Public Header 262 | Block may not be extended by users. 263 | 264 | **Offset to Point Data** 265 | 266 | The actual number of bytes from the beginning of the file to the first field of 267 | the first point record. If any software adds/removes data to/from the 268 | Variable Length Records, then this offset value must be updated. 269 | 270 | **Number of Variable Length Records** 271 | 272 | This field contains the current number of VLRs that are stored in the file 273 | preceding the Point Data Records. If the number of VLRs changes, then this number 274 | must be updated. 275 | 276 | **Point Data Record Format** 277 | 278 | The point data record indicates the type of point data records contained in the 279 | file. LAS 1.4 defines types 0 through 10. These types are defined in the 280 | :ref:`ptrecords_label` section of this specification. 281 | 282 | **Point Data Record Length** 283 | 284 | The size, in bytes, of the Point Data Record. All Point Data Records within a 285 | single LAS file must be the same type and hence the same length. If the 286 | specified size is larger than implied by the point format type (e.g., 32 bytes 287 | instead of 28 bytes for type 1) the remaining bytes are user-specific "extra 288 | bytes". The format and meaning of such "extra bytes" can (optionally) be 289 | described with an :ref:`extrabytes_vlr_label` VLR. 290 | 291 | **Legacy Number of Point Records** 292 | 293 | This field contains the total number of point records within the file if the 294 | file is maintaining legacy compatibility, the number of points is no greater 295 | than UINT32_MAX, and the Point Data Record Format is less than 6. Otherwise, 296 | it must be set to zero. 297 | 298 | **Legacy Number of Points by Return** 299 | 300 | These fields contain an array of the total point records per return if the file 301 | is maintaining legacy compatibility, the number of points is no greater than 302 | UINT32_MAX, and the Point Data Record Format is less than 6. Otherwise, each 303 | member of the array must be set to zero. 304 | 305 | The first value will be the total number of records from the first 306 | return, the second contains the total number for return two, and so on up to 307 | five returns. 308 | 309 | **X, Y, and Z Scale Factors** 310 | 311 | The scale factor fields contain a double floating-point value that is used to 312 | scale the corresponding X, Y, and Z long values within the point records. The 313 | corresponding X, Y, and Z scale factor must be multiplied by the X, Y, or Z 314 | point record value to get the actual X, Y, or Z coordinate. For example, if the 315 | X, Y, and Z coordinates are intended to have two decimal digits, then each 316 | scale factor will contain the number 0.01. 317 | 318 | **X, Y, and Z Offsets** 319 | 320 | The offset fields should be used to set the overall offset for the point 321 | records. In general these numbers will be zero, but for certain cases the 322 | resolution of the point data may not be large enough for a given projection 323 | system. However, it should always be assumed that these numbers are used. 324 | 325 | For example, to compute a given X coordinate from the point record, the point 326 | record X is multiplied by the X scale factor and then added to the X offset. 327 | 328 | .. math:: 329 | :nowrap: 330 | 331 | \begin{eqnarray} 332 | X_{coordinate} &= (X_{record} * X_{scale}) + X_{offset} \\ 333 | Y_{coordinate} &= (Y_{record} * Y_{scale}) + Y_{offset} \\ 334 | Z_{coordinate} &= (Z_{record} * Z_{scale}) + Z_{offset} 335 | \end {eqnarray} 336 | 337 | **Max and Min X, Y, and Z** 338 | 339 | The max and min data fields are the actual unscaled extents of the LAS point 340 | file data, specified in the coordinate system of the LAS data. 341 | 342 | **Start of Waveform Data Packet Record** 343 | 344 | This value provides the offset, in bytes, from the beginning of the LAS file to 345 | the first byte of the Waveform Data Package Record. Note that this will be the 346 | first byte of the Waveform Data Packet header. If no waveform records are 347 | contained within the file or they are stored externally, this value must be zero. It should be noted that LAS 348 | 1.4 allows multiple Extended Variable Length Records (EVLRs) and that the 349 | Waveform Data Packet Record is not necessarily the first EVLR in the file. 350 | 351 | **Start of First Extended Variable Length Record** 352 | 353 | This value provides the offset, in bytes, from the beginning of the LAS file to 354 | the first byte of the first EVLR. If any software adds/removes data to/from the 355 | Variable Length Records or Point Records, then this offset value must be updated. 356 | 357 | **Number of Extended Variable Length Records** 358 | 359 | This field contains the current number of EVLRs (including, if present, the 360 | Waveform Data Packet Record) that are stored in the file after the Point Data 361 | Records. If the number of EVLRs changes, then this number must be updated. If there 362 | are no EVLRs this value is zero. 363 | 364 | **Number of Point Records** 365 | 366 | This field contains the total number of point records in the file. Note that 367 | this field must always be correctly populated, regardless of legacy mode 368 | intent. 369 | 370 | **Number of Points by Return** 371 | 372 | These fields contain an array of the total point records per return. The first 373 | value will be the total number of records from the first return, the second 374 | contains the total number for return two, and so on up to fifteen returns. Note 375 | that these fields must always be correctly populated, regardless of legacy mode 376 | intent. 377 | 378 | -------------------------------------------------------------------------------- /source/02.05_vlr.sub: -------------------------------------------------------------------------------- 1 | .. _vlrdef_label: 2 | 3 | Variable Length Records (VLRs) 4 | ................................................................................ 5 | 6 | The Public Header Block can be followed by any number of Variable Length 7 | Records (VLRs) so long as the total size does not make the start of the Point 8 | Record data inaccessible by an unsigned long ("Offset to Point Data" in the 9 | Public Header Block). The number of VLRs is specified in the "Number of 10 | Variable Length Records" field in the Public Header Block. The Variable Length 11 | Records must be accessed sequentially since the size of each variable length 12 | record is contained in the Variable Length Record Header. Each Variable Length 13 | Record Header is 54 bytes in length. 14 | 15 | 16 | .. tabularcolumns:: |p{6.5cm}|p{4.0cm}|p{2.0cm}|p{1.5cm}| 17 | 18 | .. table:: Variable Length Record Header 19 | 20 | +----------------------------------+-------------------------+-----------+----------+ 21 | | Item | Format | Size | Required | 22 | +==================================+=========================+===========+==========+ 23 | | Reserved | unsigned short | 2 bytes | | 24 | +----------------------------------+-------------------------+-----------+----------+ 25 | | User ID | char[16] | 16 bytes | yes | 26 | +----------------------------------+-------------------------+-----------+----------+ 27 | | Record ID | unsigned short | 2 bytes | yes | 28 | +----------------------------------+-------------------------+-----------+----------+ 29 | | Record Length After Header | unsigned short | 2 bytes | yes | 30 | +----------------------------------+-------------------------+-----------+----------+ 31 | | Description | char[32] | 32 bytes | | 32 | +----------------------------------+-------------------------+-----------+----------+ 33 | 34 | **Reserved** 35 | 36 | This value must be set to zero. 37 | 38 | **User ID** 39 | 40 | The User ID field is ASCII character data that identifies the user that 41 | created the variable length record. It is possible to have many Variable Length 42 | Records from different sources with different User IDs. If the character data 43 | is less than 16 characters, the remaining data must be null. The User ID must 44 | be registered with the LAS specification managing body. The management of these 45 | User IDs ensures that no two individuals accidentally use the same User ID. 46 | 47 | **Record ID** 48 | 49 | The Record ID is dependent upon the User ID. There can be 0 to 65,535 Record 50 | IDs for every User ID. The LAS specification manages its own Record IDs (User 51 | IDs owned by the specification); otherwise Record IDs will be managed by the 52 | owner of the given User ID. Thus, each User ID is allowed to assign 0 to 65,535 53 | Record IDs in any manner they desire. Publicizing the meaning of a given Record 54 | ID is left to the owner of the given User ID. Unknown User ID/Record ID 55 | combinations should be ignored. 56 | 57 | **Record Length After Header** 58 | 59 | The record length is the number of bytes for the record after the end of the 60 | standard part of the header. Thus, the entire record length is 54 bytes (the 61 | header size of the VLR) plus the number of bytes in the variable length portion 62 | of the record. 63 | 64 | **Description** 65 | 66 | Optional text description of the data. Any remaining 67 | unused characters must be null. 68 | 69 | .. raw:: latex 70 | 71 | \newpage 72 | 73 | -------------------------------------------------------------------------------- /source/02.06_point.sub: -------------------------------------------------------------------------------- 1 | .. _ptrecords_label: 2 | 3 | Point Data Records 4 | ................................................................................ 5 | 6 | Software must use the "Offset to Point Data" field in the Public 7 | Header Block to locate the starting position of the first Point Data Record. 8 | Note that all Point Data Records must be the same type (i.e., Point Data Record 9 | Format). 10 | 11 | Point Data Record Formats (PDRFs) 6-10 have improved several aspects of the core 12 | information in the point data records, particularly support for 256 classes and 13 | the definition of a specific "Overlap" bit. While all PDRFs (0-10) are supported 14 | in LAS 1.4, the preferred formats are 6-10. PDRFs 0-5 are therefore designated 15 | as the "legacy" point formats. 16 | 17 | **Required Point Attributes** 18 | 19 | Point attributes that are "Required" must be populated with relevant values 20 | whenever possible. If unused, point attributes that are not "Required" must be 21 | set to the equivalent of zero for the data type (i.e., 0.0 for floating types, 22 | null for ASCII, 0 for integers). 23 | 24 | If a "Required" point attribute cannot apply to a particular technology (e.g., 25 | Scan Direction for a passive sensor) then the attribute must be set to a default 26 | value as directed. This default value is zero if unspecified in the attribute 27 | description. 28 | 29 | .. _aggregate_link: 30 | 31 | **Aggregate Model Systems** 32 | 33 | Points derived from multiple observations in an aggregate model rather than 34 | a direct measurement system should be assigned valid values using a consistent 35 | scheme for a given dataset. For example, in the case of a photogrammetrically 36 | derived point cloud, the Point Source ID, GPS Time, and Scan Angle could be 37 | assigned to a point based on the value associated with the most recent 38 | photograph from which the point was derived. Example systems to which this 39 | recommendation applies include photogrammetrically derived point clouds and 40 | Geiger-mode lidar processed with a consensus model. These systems are hereafter 41 | collectively denoted as "Aggregate Model Systems." 42 | 43 | 44 | Point Data Record Format 0 45 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 46 | 47 | Point Data Record Format 0 contains the core 20 bytes that are shared by Point 48 | Data Record Formats 0 to 5. 49 | 50 | .. tabularcolumns:: |p{7.5cm}|p{3.5cm}|p{1.5cm}|p{1.5cm}| 51 | 52 | .. table:: Point Data Record Format 0 53 | 54 | +----------------------------------+-------------------------+-----------+----------+ 55 | | Item | Format | Size | Required | 56 | +==================================+=========================+===========+==========+ 57 | | X | long | 4 bytes | yes | 58 | +----------------------------------+-------------------------+-----------+----------+ 59 | | Y | long | 4 bytes | yes | 60 | +----------------------------------+-------------------------+-----------+----------+ 61 | | Z | long | 4 bytes | yes | 62 | +----------------------------------+-------------------------+-----------+----------+ 63 | | Intensity | unsigned short | 2 bytes | no | 64 | +----------------------------------+-------------------------+-----------+----------+ 65 | | Return Number | 3 bits (bits 0-2) | 3 bits | yes | 66 | +----------------------------------+-------------------------+-----------+----------+ 67 | | Number of Returns (Given Pulse) | 3 bits (bits 3-5) | 3 bits | yes | 68 | +----------------------------------+-------------------------+-----------+----------+ 69 | | Scan Direction Flag | 1 bit (bit 6) | 1 bit | yes | 70 | +----------------------------------+-------------------------+-----------+----------+ 71 | | Edge of Flight Line | 1 bit (bit 7) | 1 bit | yes | 72 | +----------------------------------+-------------------------+-----------+----------+ 73 | | Classification | unsigned char | 1 byte | yes | 74 | +----------------------------------+-------------------------+-----------+----------+ 75 | | Scan Angle Rank (-90 to +90) -- | signed char | 1 byte | yes | 76 | | Left Side | | | | 77 | +----------------------------------+-------------------------+-----------+----------+ 78 | | User Data | unsigned char | 1 byte | no | 79 | +----------------------------------+-------------------------+-----------+----------+ 80 | | Point Source ID | unsigned short | 2 bytes | yes | 81 | +----------------------------------+-------------------------+-----------+----------+ 82 | | *Minimum PDRF Size* [1]_ | *20 bytes* | 83 | +------------------------------------------------------------+----------------------+ 84 | 85 | .. [1] Recall that the Point Data Record Size can be greater than the minimum 86 | required for a PDRF. These "extra bytes" follow the standard Point Record 87 | fields and are described in the :ref:`extrabytes_vlr_label` VLR section. 88 | 89 | **X, Y, and Z** 90 | 91 | The X, Y, and Z values are stored as long integers. The X, Y, and Z values are 92 | used in conjunction with the scale values and the offset values to determine 93 | the coordinate for each point as described in the :ref:`headerblock_label` section. 94 | 95 | **Intensity** 96 | 97 | The Intensity value is the integer representation of the pulse return 98 | magnitude. This value is optional and system specific. However, it should 99 | always be included if available. If Intensity is not included, this value must 100 | be set to zero. 101 | 102 | Intensity, when included, is always normalized 103 | to a 16 bit, unsigned value by multiplying the value by 65,536/(intensity 104 | dynamic range of the sensor). For example, if the dynamic range of the sensor 105 | is 10 bits, the scaling value would be (65,536/1,024). This normalization is required to 106 | ensure that data from different sensors can be correctly merged. 107 | 108 | For systems based on technology other than pulsed lasers, Intensity values may 109 | represent estimated relative reflectivity, rather than a direct measurement of 110 | pulse return magnitude, and may be derived from multiple sources. 111 | 112 | .. note:: 113 | 114 | Please note that the following four fields (Return Number, Number of Returns, 115 | Scan Direction Flag, and Edge of Flight Line) are bit fields within a single 116 | byte. 117 | 118 | **Return Number** 119 | 120 | The Return Number is the pulse return number for a given output pulse. A given 121 | output laser pulse can have many returns, and they must be marked in sequence 122 | of return. The first return will have a Return Number of one, the second a 123 | Return Number of two, and so on up to five returns. The Return Number must 124 | be between 1 and the Number of Returns, inclusive. 125 | 126 | For systems unable to record multiple returns, the Return Number should be 127 | set to one, unless it is synthetically derived and the Synthetic Return Number 128 | Global Encoding bit is set. 129 | 130 | **Number of Returns (Given Pulse)** 131 | 132 | The Number of Returns is the total number of returns for a given pulse. For 133 | example, a laser data point may be return two (Return Number) within a total 134 | number of up to five returns. 135 | 136 | For systems unable to record multiple returns, the Number of Returns should be 137 | set to one, unless it is synthetically derived and the Synthetic Return Number 138 | Global Encoding bit is set. 139 | 140 | **Scan Direction Flag** 141 | 142 | The Scan Direction Flag denotes the direction in which the scanner mirror was 143 | traveling at the time of the output pulse. A bit value of 1 is a positive scan 144 | direction, and a bit value of 0 is a negative scan direction (where positive 145 | scan direction is a scan moving from the left side of the in-track direction to 146 | the right side and negative the opposite). 147 | 148 | For :ref:`Aggregate Model Systems ` or if the measurement system 149 | does not include a rotational component, the Scan Direction Flag should be set 150 | to zero. 151 | 152 | **Edge of Flight Line Flag** 153 | 154 | The Edge of Flight Line Flag has a value of 1 only when the point is at the 155 | end of a scan. It is the last point on a given scan line before it changes 156 | direction or the mirror facet changes. 157 | 158 | Note that this field has no meaning for :ref:`Aggregate Model Systems ` 159 | or 360 degree Field of View scanners (e.g., terrestrial lidar scanners). In 160 | these cases, the Edge of Flight Line Flag should be set to zero. 161 | 162 | **Classification** 163 | 164 | This field represents the "class" attributes of a point. If a point has never 165 | been classified, this byte must be set to zero. The format for classification 166 | is a bit encoded field with the lower five bits used for the class and the 167 | three high bits used for flags. The bit definitions are listed in Table 8 and 168 | the classification values in Table 9. 169 | 170 | 171 | .. tabularcolumns:: |p{2.0cm}|p{3.0cm}|p{8.5cm}| 172 | 173 | .. table:: Classification Bit Field Encoding (Point Data Record Formats 0-5) 174 | 175 | +-------+-------------------------+------------------------------------------+ 176 | | Bit | Field Name | Description | 177 | +=======+=========================+==========================================+ 178 | | 0:4 | Classification | Standard ASPRS classification from | 179 | | | | 0 to 31 as defined in the classification | 180 | | | | table for legacy point formats (see | 181 | | | | :ref:`Reserved Point Classes | 182 | | | | `). | 183 | +-------+-------------------------+------------------------------------------+ 184 | | 5 | Synthetic | If set, this point was created by a | 185 | | | | technique other than direct observation | 186 | | | | such as digitized from a photogrammetric | 187 | | | | stereo model or by traversing a | 188 | | | | waveform. Point attribute interpretation | 189 | | | | might differ from non-Synthetic points. | 190 | | | | Unused attributes must be set to the | 191 | | | | appropriate default value. | 192 | +-------+-------------------------+------------------------------------------+ 193 | | 6 | Key-Point | If set, this point is considered to be a | 194 | | | | model key-point and therefore generally | 195 | | | | should not be withheld in a thinning | 196 | | | | algorithm. | 197 | +-------+-------------------------+------------------------------------------+ 198 | | 7 | Withheld | If set, this point should not be | 199 | | | | included in processing (synonymous with | 200 | | | | Deleted). | 201 | +-------+-------------------------+------------------------------------------+ 202 | 203 | .. note:: 204 | 205 | Note that bits 5, 6, and 7 are treated as flags and can be set or clear in 206 | any combination. For example, a point with bits 5 and 6 both set to one and 207 | the lower five bits set to 2 would be a *Ground* point that had been 208 | *Synthetically* collected and marked as a model *Key-Point*. 209 | 210 | .. _legacy_pt_class_link: 211 | 212 | **Reserved Point Classes** 213 | 214 | Classification must adhere to the following standard: 215 | 216 | .. tabularcolumns:: |p{6.0cm}|p{8.0cm}| 217 | 218 | .. table:: ASPRS Standard Point Classes (Point Data Record Formats 0-5) 219 | 220 | +-----------------------------------+-----------------------------------------------+ 221 | | Classification Value (Bits 0:4) | Meaning | 222 | +===================================+===============================================+ 223 | | 0 | Created, Never Classified | 224 | +-----------------------------------+-----------------------------------------------+ 225 | | 1 | Unclassified [2]_ | 226 | +-----------------------------------+-----------------------------------------------+ 227 | | 2 | Ground | 228 | +-----------------------------------+-----------------------------------------------+ 229 | | 3 | Low Vegetation | 230 | +-----------------------------------+-----------------------------------------------+ 231 | | 4 | Medium Vegetation | 232 | +-----------------------------------+-----------------------------------------------+ 233 | | 5 | High Vegetation | 234 | +-----------------------------------+-----------------------------------------------+ 235 | | 6 | Building | 236 | +-----------------------------------+-----------------------------------------------+ 237 | | 7 | Low Point (Noise) | 238 | +-----------------------------------+-----------------------------------------------+ 239 | | 8 | Model Key-Point (Mass Point) | 240 | +-----------------------------------+-----------------------------------------------+ 241 | | 9 | Water | 242 | +-----------------------------------+-----------------------------------------------+ 243 | | 10 | *Reserved for ASPRS Definition* | 244 | +-----------------------------------+-----------------------------------------------+ 245 | | 11 | *Reserved for ASPRS Definition* | 246 | +-----------------------------------+-----------------------------------------------+ 247 | | 12 | Overlap Points [3]_ | 248 | +-----------------------------------+-----------------------------------------------+ 249 | | 13-31 | *Reserved for ASPRS Definition* | 250 | +-----------------------------------+-----------------------------------------------+ 251 | 252 | .. note:: 253 | 254 | A note on Bit Fields – The LAS storage format is "Little Endian." This 255 | means that multi-byte data fields are stored in memory from least 256 | significant byte at the low address to most significant byte at the high 257 | address. Bit fields are always interpreted as bit 0 set to 1 equals 1, bit 258 | 1 set to 1 equals 2, bit 2 set to 1 equals 4 and so forth. 259 | 260 | 261 | .. [2] We are using both 0 and 1 as *Unclassified* to maintain compatibility with 262 | current popular classification software such as TerraScan. We extend the idea 263 | of classification value 1 to include cases in which data have been subjected to 264 | a classification algorithm but emerged in an undefined state. For example, data 265 | with class 0 is sent through an algorithm to detect man-made structures – 266 | points that emerge without having been assigned as belonging to structures 267 | could be remapped from class 0 to class 1. 268 | 269 | .. [3] Overlap Points are those points that were immediately culled during the 270 | merging of overlapping flight lines. In general, the *Withheld* bit should be set 271 | since these points are not subsequently classified. 272 | 273 | **Scan Angle Rank** 274 | 275 | The Scan Angle Rank is a signed one-byte integer with a valid range from -90 to 276 | +90. The Scan Angle Rank is the angle (rounded to the nearest integer in the 277 | absolute value sense) at which the laser point was output from the laser system 278 | including the roll of the aircraft. The scan angle is within 1 degree of 279 | accuracy from +90 to -90 degrees. The scan angle is an angle based on 0 degrees 280 | being nadir, and -90 degrees to the left side of the aircraft in the direction 281 | of flight. 282 | 283 | For :ref:`Aggregate Model Systems `, the Scan Angle Rank should 284 | be set to zero unless assigned from a component measurement. 285 | 286 | **User Data** 287 | 288 | This field may be used at the user's discretion. 289 | 290 | **Point Source ID** 291 | 292 | This value indicates the source from which this point originated. A source is 293 | typically defined as a grouping of temporally consistent data, such as a 294 | flight line or sortie number for airborne systems, a route number for mobile 295 | systems, or a setup identifier for static systems. Valid values for this field 296 | are 1 to 65,535 inclusive. Zero is reserved as a convenience to system 297 | implementers. 298 | 299 | For :ref:`Aggregate Model Systems `, the Point Source ID should 300 | be set to one (1) unless assigned from a component measurement. 301 | 302 | .. raw:: latex 303 | 304 | \newpage 305 | 306 | Point Data Record Format 1 307 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 308 | 309 | Point Data Record Format 1 is the same as Point Data Record Format 0 with the 310 | addition of GPS Time. 311 | 312 | 313 | .. tabularcolumns:: |p{7.5cm}|p{3.5cm}|p{1.5cm}|p{1.5cm}| 314 | 315 | .. table:: Point Data Record Format 1 316 | 317 | +----------------------------------+-------------------------+-----------+----------+ 318 | | Item | Format | Size | Required | 319 | +==================================+=========================+===========+==========+ 320 | | X | long | 4 bytes | yes | 321 | +----------------------------------+-------------------------+-----------+----------+ 322 | | Y | long | 4 bytes | yes | 323 | +----------------------------------+-------------------------+-----------+----------+ 324 | | Z | long | 4 bytes | yes | 325 | +----------------------------------+-------------------------+-----------+----------+ 326 | | Intensity | unsigned short | 2 bytes | no | 327 | +----------------------------------+-------------------------+-----------+----------+ 328 | | Return Number | 3 bits (bits 0-2) | 3 bits | yes | 329 | +----------------------------------+-------------------------+-----------+----------+ 330 | | Number of Returns (Given Pulse) | 3 bits (bits 3-5) | 3 bits | yes | 331 | +----------------------------------+-------------------------+-----------+----------+ 332 | | Scan Direction Flag | 1 bit (bit 6) | 1 bit | yes | 333 | +----------------------------------+-------------------------+-----------+----------+ 334 | | Edge of Flight Line | 1 bit (bit 7) | 1 bit | yes | 335 | +----------------------------------+-------------------------+-----------+----------+ 336 | | Classification | unsigned char | 1 byte | yes | 337 | +----------------------------------+-------------------------+-----------+----------+ 338 | | Scan Angle Rank (-90 to +90) -- | signed char | 1 byte | yes | 339 | | Left Side | | | | 340 | +----------------------------------+-------------------------+-----------+----------+ 341 | | User Data | unsigned char | 1 byte | no | 342 | +----------------------------------+-------------------------+-----------+----------+ 343 | | Point Source ID | unsigned short | 2 bytes | yes | 344 | +----------------------------------+-------------------------+-----------+----------+ 345 | | GPS Time | double | 8 bytes | yes | 346 | +----------------------------------+-------------------------+-----------+----------+ 347 | | *Minimum PDRF Size* | *28 bytes* | 348 | +------------------------------------------------------------+----------------------+ 349 | 350 | **GPS Time** 351 | 352 | The GPS Time is the double floating point time tag value at which the point was 353 | observed. It is GPS Week Time if the :ref:`Global Encoding ` 354 | low bit is clear and Adjusted Standard GPS Time if the bit is set. 355 | 356 | For :ref:`Aggregate Model Systems `, the GPS Time should be set 357 | to zero unless assigned from a component measurement. 358 | 359 | 360 | .. raw:: latex 361 | 362 | \newpage 363 | 364 | Point Data Record Format 2 365 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | 367 | Point Data Record Format 2 is the same as Point Data Record Format 0 with the 368 | addition of three color channels. These fields are used when "colorizing" a 369 | point using ancillary data, typically from a camera. 370 | 371 | .. tabularcolumns:: |p{7.5cm}|p{3.5cm}|p{1.5cm}|p{1.5cm}| 372 | 373 | .. table:: Point Data Record Format 2 374 | 375 | +----------------------------------+-------------------------+-----------+----------+ 376 | | Item | Format | Size | Required | 377 | +==================================+=========================+===========+==========+ 378 | | X | long | 4 bytes | yes | 379 | +----------------------------------+-------------------------+-----------+----------+ 380 | | Y | long | 4 bytes | yes | 381 | +----------------------------------+-------------------------+-----------+----------+ 382 | | Z | long | 4 bytes | yes | 383 | +----------------------------------+-------------------------+-----------+----------+ 384 | | Intensity | unsigned short | 2 bytes | no | 385 | +----------------------------------+-------------------------+-----------+----------+ 386 | | Return Number | 3 bits (bits 0-2) | 3 bits | yes | 387 | +----------------------------------+-------------------------+-----------+----------+ 388 | | Number of Returns (Given Pulse) | 3 bits (bits 3-5) | 3 bits | yes | 389 | +----------------------------------+-------------------------+-----------+----------+ 390 | | Scan Direction Flag | 1 bit (bit 6) | 1 bit | yes | 391 | +----------------------------------+-------------------------+-----------+----------+ 392 | | Edge of Flight Line | 1 bit (bit 7) | 1 bit | yes | 393 | +----------------------------------+-------------------------+-----------+----------+ 394 | | Classification | unsigned char | 1 byte | yes | 395 | +----------------------------------+-------------------------+-----------+----------+ 396 | | Scan Angle Rank (-90 to +90) -- | signed char | 1 byte | yes | 397 | | Left Side | | | | 398 | +----------------------------------+-------------------------+-----------+----------+ 399 | | User Data | unsigned char | 1 byte | no | 400 | +----------------------------------+-------------------------+-----------+----------+ 401 | | Point Source ID | unsigned short | 2 bytes | yes | 402 | +----------------------------------+-------------------------+-----------+----------+ 403 | | Red | unsigned short | 2 bytes | yes | 404 | +----------------------------------+-------------------------+-----------+----------+ 405 | | Green | unsigned short | 2 bytes | yes | 406 | +----------------------------------+-------------------------+-----------+----------+ 407 | | Blue | unsigned short | 2 bytes | yes | 408 | +----------------------------------+-------------------------+-----------+----------+ 409 | | *Minimum PDRF Size* | *26 bytes* | 410 | +------------------------------------------------------------+----------------------+ 411 | 412 | **Red, Green, and Blue** 413 | 414 | The Red, Green, and Blue image channel values associated with this point. 415 | 416 | .. note:: 417 | 418 | The Red, Green, and Blue values should always be normalized to 16 bit values. 419 | For example, when encoding an 8 bit per channel pixel, multiply each 420 | channel value by 256 prior to storage in these fields. This normalization 421 | allows color values from different camera bit depths to be accurately 422 | merged. 423 | 424 | .. raw:: latex 425 | 426 | \newpage 427 | 428 | Point Data Record Format 3 429 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 430 | 431 | Point Data Record Format 3 is the same as Point Data Record Format 2 with the 432 | addition of GPS Time. 433 | 434 | .. tabularcolumns:: |p{7.5cm}|p{3.5cm}|p{1.5cm}|p{1.5cm}| 435 | 436 | .. table:: Point Data Record Format 3 437 | 438 | +----------------------------------+-------------------------+-----------+----------+ 439 | | Item | Format | Size | Required | 440 | +==================================+=========================+===========+==========+ 441 | | X | long | 4 bytes | yes | 442 | +----------------------------------+-------------------------+-----------+----------+ 443 | | Y | long | 4 bytes | yes | 444 | +----------------------------------+-------------------------+-----------+----------+ 445 | | Z | long | 4 bytes | yes | 446 | +----------------------------------+-------------------------+-----------+----------+ 447 | | Intensity | unsigned short | 2 bytes | no | 448 | +----------------------------------+-------------------------+-----------+----------+ 449 | | Return Number | 3 bits (bits 0-2) | 3 bits | yes | 450 | +----------------------------------+-------------------------+-----------+----------+ 451 | | Number of Returns (Given Pulse) | 3 bits (bits 3-5) | 3 bits | yes | 452 | +----------------------------------+-------------------------+-----------+----------+ 453 | | Scan Direction Flag | 1 bit (bit 6) | 1 bit | yes | 454 | +----------------------------------+-------------------------+-----------+----------+ 455 | | Edge of Flight Line | 1 bit (bit 7) | 1 bit | yes | 456 | +----------------------------------+-------------------------+-----------+----------+ 457 | | Classification | unsigned char | 1 byte | yes | 458 | +----------------------------------+-------------------------+-----------+----------+ 459 | | Scan Angle Rank (-90 to +90) -- | signed char | 1 byte | yes | 460 | | Left Side | | | | 461 | +----------------------------------+-------------------------+-----------+----------+ 462 | | User Data | unsigned char | 1 byte | no | 463 | +----------------------------------+-------------------------+-----------+----------+ 464 | | Point Source ID | unsigned short | 2 bytes | yes | 465 | +----------------------------------+-------------------------+-----------+----------+ 466 | | GPS Time | double | 8 bytes | yes | 467 | +----------------------------------+-------------------------+-----------+----------+ 468 | | Red | unsigned short | 2 bytes | yes | 469 | +----------------------------------+-------------------------+-----------+----------+ 470 | | Green | unsigned short | 2 bytes | yes | 471 | +----------------------------------+-------------------------+-----------+----------+ 472 | | Blue | unsigned short | 2 bytes | yes | 473 | +----------------------------------+-------------------------+-----------+----------+ 474 | | *Minimum PDRF Size* | *34 bytes* | 475 | +------------------------------------------------------------+----------------------+ 476 | 477 | .. raw:: latex 478 | 479 | \newpage 480 | 481 | Point Data Record Format 4 482 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | 484 | Point Data Record Format 4 adds Wave Packets to Point Data Record Format 1. 485 | 486 | .. tabularcolumns:: |p{7.5cm}|p{3.5cm}|p{1.5cm}|p{1.5cm}| 487 | 488 | .. table:: Point Data Record Format 4 489 | 490 | +----------------------------------+-------------------------+-----------+----------+ 491 | | Item | Format | Size | Required | 492 | +==================================+=========================+===========+==========+ 493 | | X | long | 4 bytes | yes | 494 | +----------------------------------+-------------------------+-----------+----------+ 495 | | Y | long | 4 bytes | yes | 496 | +----------------------------------+-------------------------+-----------+----------+ 497 | | Z | long | 4 bytes | yes | 498 | +----------------------------------+-------------------------+-----------+----------+ 499 | | Intensity | unsigned short | 2 bytes | no | 500 | +----------------------------------+-------------------------+-----------+----------+ 501 | | Return Number | 3 bits (bits 0-2) | 3 bits | yes | 502 | +----------------------------------+-------------------------+-----------+----------+ 503 | | Number of Returns (Given Pulse) | 3 bits (bits 3-5) | 3 bits | yes | 504 | +----------------------------------+-------------------------+-----------+----------+ 505 | | Scan Direction Flag | 1 bit (bit 6) | 1 bit | yes | 506 | +----------------------------------+-------------------------+-----------+----------+ 507 | | Edge of Flight Line | 1 bit (bit 7) | 1 bit | yes | 508 | +----------------------------------+-------------------------+-----------+----------+ 509 | | Classification | unsigned char | 1 byte | yes | 510 | +----------------------------------+-------------------------+-----------+----------+ 511 | | Scan Angle Rank (-90 to +90) -- | signed char | 1 byte | yes | 512 | | Left Side | | | | 513 | +----------------------------------+-------------------------+-----------+----------+ 514 | | User Data | unsigned char | 1 byte | no | 515 | +----------------------------------+-------------------------+-----------+----------+ 516 | | Point Source ID | unsigned short | 2 bytes | yes | 517 | +----------------------------------+-------------------------+-----------+----------+ 518 | | GPS Time | double | 8 bytes | yes | 519 | +----------------------------------+-------------------------+-----------+----------+ 520 | | Wave Packet Descriptor Index | unsigned char | 1 byte | yes | 521 | +----------------------------------+-------------------------+-----------+----------+ 522 | | Byte Offset to Waveform Data | unsigned long long | 8 bytes | yes | 523 | +----------------------------------+-------------------------+-----------+----------+ 524 | | Waveform Packet Size in Bytes | unsigned long | 4 bytes | yes | 525 | +----------------------------------+-------------------------+-----------+----------+ 526 | | Return Point Waveform Location | float | 4 bytes | yes | 527 | +----------------------------------+-------------------------+-----------+----------+ 528 | | Parametric dx | float | 4 bytes | yes | 529 | +----------------------------------+-------------------------+-----------+----------+ 530 | | Parametric dy | float | 4 bytes | yes | 531 | +----------------------------------+-------------------------+-----------+----------+ 532 | | Parametric dz | float | 4 bytes | yes | 533 | +----------------------------------+-------------------------+-----------+----------+ 534 | | *Minimum PDRF Size* | *57 bytes* | 535 | +------------------------------------------------------------+----------------------+ 536 | 537 | **Wave Packet Descriptor Index** 538 | 539 | This value plus **99** is the Record ID of the :ref:`fwf_descriptor_label` and 540 | indicates the User Defined Record that describes the waveform packet associated 541 | with this Point Record. Up to 255 different User Defined Records which describe 542 | the waveform packet are supported. A value of zero indicates that there is no 543 | waveform data associated with this Point Record. 544 | 545 | **Byte Offset to Waveform Data** 546 | 547 | The waveform packet data are stored in the LAS file in an Extended Variable 548 | Length Record or in an auxiliary *.wdp file. The Byte Offset represents the 549 | location of the start of this Point Record’s waveform packet within the waveform 550 | data variable length record (or external file) relative to the beginning of the 551 | :ref:`fwf_packets_label` header. The absolute location of the beginning of this 552 | waveform packet relative to the beginning of the file is given by: 553 | 554 | **Start of Waveform Data Packet Record** + **Byte Offset to Waveform Data** 555 | 556 | for waveform packets stored within the LAS file and 557 | 558 | **Byte Offset to Waveform Data** 559 | 560 | for data stored in an auxiliary *.wdp file. 561 | 562 | **Waveform Packet Size in Bytes** 563 | 564 | The size, in bytes, of the waveform packet associated with this return. Note 565 | that each waveform can be of a different size (even those with the same 566 | Waveform Packet Descriptor index) due to packet compression. Also note that 567 | waveform packets can be located only via the Byte Offset to Waveform Packet 568 | Data value since there is no requirement that records be stored sequentially. 569 | 570 | 571 | **Return Point Waveform Location** 572 | 573 | The temporal offset in picoseconds (:math:`10^{-12}`) from the arbitrary "anchor 574 | point" to the location within the waveform packet for this Point Record. 575 | 576 | 577 | **Parametric dx, dy, dz** 578 | 579 | These parameters define a parametric line equation for extrapolating points 580 | along the associated waveform. The position along the wave is given by: 581 | 582 | .. math:: 583 | :nowrap: 584 | 585 | \begin {eqnarray} 586 | X &= X_0 + t * dx \\ 587 | Y &= Y_0 + t * dy \\ 588 | Z &= Z_0 + t * dz 589 | \end {eqnarray} 590 | 591 | where :math:`(X, Y, Z)` is the spatial position of a derived point, 592 | :math:`(X_0, Y_0, Z_0)` is the position of the "anchor" point, and :math:`t` is 593 | the time, in picoseconds, relative to the anchor point. 594 | 595 | The anchor point is an arbitrary location at the origin of the associated 596 | waveform -- i.e. :math:`t = 0` at the anchor point -- with coordinates defined 597 | by: 598 | 599 | .. math:: 600 | :nowrap: 601 | 602 | \begin {eqnarray} 603 | X_0 &= X_P + L * dx \\ 604 | Y_0 &= Y_P + L * dy \\ 605 | Z_0 &= Z_P + L * dz 606 | \end {eqnarray} 607 | 608 | where :math:`(X_P, Y_P, Z_P)` is this Point Record's transformed position (as a 609 | double) and :math:`L` is this Point Record's Return Point Waveform Location. 610 | 611 | The units of X, Y and Z are the units of the coordinate systems of the LAS data. 612 | If the coordinate system is geographic, the horizontal units are decimal degrees 613 | and the vertical units are meters. 614 | 615 | .. note:: 616 | 617 | Users seeking further clarity regarding LAS waveform encoding are encouraged 618 | to learn more on the official LAS wiki: https://github.com/ASPRSorg/LAS/wiki 619 | 620 | 621 | .. raw:: latex 622 | 623 | \newpage 624 | 625 | Point Data Record Format 5 626 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | 628 | Point Data Record Format 5 adds Wave Packets to Point Data Record Format 3. 629 | 630 | .. tabularcolumns:: |p{7.0cm}|p{3.5cm}|p{1.5cm}|p{1.5cm}| 631 | 632 | .. table:: Point Data Record Format 5 633 | 634 | +----------------------------------+-------------------------+-----------+----------+ 635 | | Item | Format | Size | Required | 636 | +==================================+=========================+===========+==========+ 637 | | X | long | 4 bytes | yes | 638 | +----------------------------------+-------------------------+-----------+----------+ 639 | | Y | long | 4 bytes | yes | 640 | +----------------------------------+-------------------------+-----------+----------+ 641 | | Z | long | 4 bytes | yes | 642 | +----------------------------------+-------------------------+-----------+----------+ 643 | | Intensity | unsigned short | 2 bytes | no | 644 | +----------------------------------+-------------------------+-----------+----------+ 645 | | Return Number | 3 bits (bits 0-2) | 3 bits | yes | 646 | +----------------------------------+-------------------------+-----------+----------+ 647 | | Number of Returns (Given Pulse) | 3 bits (bits 3-5) | 3 bits | yes | 648 | +----------------------------------+-------------------------+-----------+----------+ 649 | | Scan Direction Flag | 1 bit (bit 6) | 1 bit | yes | 650 | +----------------------------------+-------------------------+-----------+----------+ 651 | | Edge of Flight Line | 1 bit (bit 7) | 1 bit | yes | 652 | +----------------------------------+-------------------------+-----------+----------+ 653 | | Classification | unsigned char | 1 byte | yes | 654 | +----------------------------------+-------------------------+-----------+----------+ 655 | | Scan Angle Rank (-90 to +90) -- | signed char | 1 byte | yes | 656 | | Left Side | | | | 657 | +----------------------------------+-------------------------+-----------+----------+ 658 | | User Data | unsigned char | 1 byte | no | 659 | +----------------------------------+-------------------------+-----------+----------+ 660 | | Point Source ID | unsigned short | 2 bytes | yes | 661 | +----------------------------------+-------------------------+-----------+----------+ 662 | | GPS Time | double | 8 bytes | yes | 663 | +----------------------------------+-------------------------+-----------+----------+ 664 | | Red | unsigned short | 2 bytes | yes | 665 | +----------------------------------+-------------------------+-----------+----------+ 666 | | Green | unsigned short | 2 bytes | yes | 667 | +----------------------------------+-------------------------+-----------+----------+ 668 | | Blue | unsigned short | 2 bytes | yes | 669 | +----------------------------------+-------------------------+-----------+----------+ 670 | | Wave Packet Descriptor Index | unsigned char | 1 byte | yes | 671 | +----------------------------------+-------------------------+-----------+----------+ 672 | | Byte Offset to Waveform Data | unsigned long long | 8 bytes | yes | 673 | +----------------------------------+-------------------------+-----------+----------+ 674 | | Waveform Packet Size in Bytes | unsigned long | 4 bytes | yes | 675 | +----------------------------------+-------------------------+-----------+----------+ 676 | | Return Point Waveform Location | float | 4 bytes | yes | 677 | +----------------------------------+-------------------------+-----------+----------+ 678 | | Parametric dx | float | 4 bytes | yes | 679 | +----------------------------------+-------------------------+-----------+----------+ 680 | | Parametric dy | float | 4 bytes | yes | 681 | +----------------------------------+-------------------------+-----------+----------+ 682 | | Parametric dz | float | 4 bytes | yes | 683 | +----------------------------------+-------------------------+-----------+----------+ 684 | | *Minimum PDRF Size* | *63 bytes* | 685 | +------------------------------------------------------------+----------------------+ 686 | 687 | .. raw:: latex 688 | 689 | \newpage 690 | 691 | Point Data Record Format 6 692 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | 694 | Point Data Record Format 6 contains the core 30 bytes that are shared by Point 695 | Data Record Formats 6 to 10. The difference to the core 20 bytes of Point Data 696 | Record Formats 0 to 5 is that there are more bits for return numbers in order 697 | to support up to 15 returns, there are more bits for point classifications to 698 | support up to 256 classes, there is a higher precision scan angle (16 bits 699 | instead of 8), and the GPS time is mandatory. 700 | 701 | .. tabularcolumns:: |p{7.5cm}|p{3.5cm}|p{1.5cm}|p{1.5cm}| 702 | 703 | .. table:: Point Data Record Format 6 704 | 705 | +----------------------------------+-------------------------+-----------+----------+ 706 | | Item | Format | Size | Required | 707 | +==================================+=========================+===========+==========+ 708 | | X | long | 4 bytes | yes | 709 | +----------------------------------+-------------------------+-----------+----------+ 710 | | Y | long | 4 bytes | yes | 711 | +----------------------------------+-------------------------+-----------+----------+ 712 | | Z | long | 4 bytes | yes | 713 | +----------------------------------+-------------------------+-----------+----------+ 714 | | Intensity | unsigned short | 2 bytes | no | 715 | +----------------------------------+-------------------------+-----------+----------+ 716 | | Return Number | 4 bits (bits 0-3) | 4 bits | yes | 717 | +----------------------------------+-------------------------+-----------+----------+ 718 | | Number of Returns (Given Pulse) | 4 bits (bits 4-7) | 4 bits | yes | 719 | +----------------------------------+-------------------------+-----------+----------+ 720 | | Classification Flags | 4 bits (bits 0-3) | 4 bits | no | 721 | +----------------------------------+-------------------------+-----------+----------+ 722 | | Scanner Channel | 2 bits (bits 4-5) | 2 bits | yes | 723 | +----------------------------------+-------------------------+-----------+----------+ 724 | | Scan Direction Flag | 1 bit (bit 6) | 1 bit | yes | 725 | +----------------------------------+-------------------------+-----------+----------+ 726 | | Edge of Flight Line | 1 bit (bit 7) | 1 bit | yes | 727 | +----------------------------------+-------------------------+-----------+----------+ 728 | | Classification | unsigned char | 1 byte | yes | 729 | +----------------------------------+-------------------------+-----------+----------+ 730 | | User Data | unsigned char | 1 byte | no | 731 | +----------------------------------+-------------------------+-----------+----------+ 732 | | Scan Angle | short | 2 bytes | yes | 733 | +----------------------------------+-------------------------+-----------+----------+ 734 | | Point Source ID | unsigned short | 2 bytes | yes | 735 | +----------------------------------+-------------------------+-----------+----------+ 736 | | GPS Time | double | 8 bytes | yes | 737 | +----------------------------------+-------------------------+-----------+----------+ 738 | | *Minimum PDRF Size* | *30 bytes* | 739 | +------------------------------------------------------------+----------------------+ 740 | 741 | .. note:: 742 | 743 | The following six fields (Return Number, Number of Returns, Classification 744 | Flags, Scanner Channel, Scan Direction Flag, and Edge of Flight Line) are bit fields, encoded 745 | into two bytes. 746 | 747 | **Return Number** 748 | 749 | The Return Number is the pulse return number for a given output pulse. A given 750 | output laser pulse can have many returns, and they must be marked in sequence 751 | of return. The first return will have a Return Number of one, the second a 752 | Return Number of two, and so on up to fifteen returns. The Return Number must 753 | be between 1 and the Number of Returns, inclusive. 754 | 755 | For systems unable to record multiple returns, the Return Number should be 756 | set to one, unless it is synthetically derived and the Synthetic Return Number 757 | Global Encoding bit is set. 758 | 759 | **Number of Returns (Given Pulse)** 760 | 761 | The Number of Returns is the total number of returns for a given pulse. For 762 | example, a laser data point may be return two (Return Number) within a total 763 | number of up to fifteen returns. 764 | 765 | For systems unable to record multiple returns, the Number of Returns should be 766 | set to one, unless it is synthetically derived and the Synthetic Return Number 767 | Global Encoding bit is set. 768 | 769 | **Classification Flags** 770 | 771 | Classification flags are used to indicate special characteristics associated 772 | with the point. The bit definitions are: 773 | 774 | .. tabularcolumns:: |p{2.0cm}|p{3.0cm}|p{8.5cm}| 775 | 776 | .. table:: Classification Bit Field Encoding (Point Data Record Formats 6-10) 777 | 778 | +-------+-------------------------+------------------------------------------+ 779 | | Bit | Field Name | Description | 780 | +=======+=========================+==========================================+ 781 | | 0 | Synthetic | If set, this point was created by a | 782 | | | | technique other than direct observation | 783 | | | | such as digitized from a photogrammetric | 784 | | | | stereo model or by traversing a | 785 | | | | waveform. Point attribute interpretation | 786 | | | | might differ from non-Synthetic points. | 787 | | | | Unused attributes must be set to the | 788 | | | | appropriate default value. | 789 | +-------+-------------------------+------------------------------------------+ 790 | | 1 | Key-Point | If set, this point is considered to be a | 791 | | | | model key-point and therefore generally | 792 | | | | should not be withheld in a thinning | 793 | | | | algorithm. | 794 | +-------+-------------------------+------------------------------------------+ 795 | | 2 | Withheld | If set, this point should not be | 796 | | | | included in processing (synonymous with | 797 | | | | Deleted). | 798 | +-------+-------------------------+------------------------------------------+ 799 | | 3 | Overlap | If set, this point is within the | 800 | | | | overlap region of two or more swaths or | 801 | | | | takes. Setting this bit is not mandatory | 802 | | | | (unless required by a specification | 803 | | | | other than this document) but | 804 | | | | allows Classification of overlap points | 805 | | | | to be preserved. | 806 | +-------+-------------------------+------------------------------------------+ 807 | 808 | .. note:: 809 | These bits are treated as flags and can be set or cleared in any 810 | combination. For example, a point with bits 0 and 1 both set to one and the 811 | *Classification* field set to 2 would be a *Ground* point that had been 812 | *Synthetically* collected and marked as a model *Key-Point*. 813 | 814 | 815 | **Scanner Channel** 816 | 817 | Scanner Channel is used to indicate the channel (scanner head) of a multi- 818 | channel system. Channel 0 is used for single scanner systems. Up to four 819 | channels are supported (0-3). 820 | 821 | For :ref:`Aggregate Model Systems `, the Channel should be set 822 | to zero unless assigned from a component measurement. 823 | 824 | **Scan Direction Flag** 825 | 826 | The Scan Direction Flag denotes the direction in which the scanner mirror was 827 | traveling at the time of the output pulse. A bit value of 1 is a positive scan 828 | direction, and a bit value of 0 is a negative scan direction (where positive 829 | scan direction is a scan moving from the left side of the in-track direction to 830 | the right side and negative the opposite). 831 | 832 | For :ref:`Aggregate Model Systems ` or if the measurement system 833 | does not include a rotational component, the Scan Direction Flag should be set 834 | to zero. 835 | 836 | **Edge of Flight Line Flag** 837 | 838 | The Edge of Flight Line Flag has a value of 1 only when the point is at the 839 | end of a scan. It is the last point on a given scan line before it changes 840 | direction or the mirror facet changes. 841 | 842 | Note that this field has no meaning for :ref:`Aggregate Model Systems ` 843 | or 360 degree Field of View scanners (e.g., terrestrial lidar scanners). In 844 | these cases, the Edge of Flight Line Flag should be set to zero. 845 | 846 | **Classification** 847 | 848 | Classification must adhere to the following standard: 849 | 850 | 851 | .. tabularcolumns:: |p{3.0cm}|p{5.0cm}|p{7.0cm}| 852 | 853 | .. table:: ASPRS Standard Point Classes (Point Data Record Formats 6-10) 854 | 855 | +------------------+-----------------------------+--------------------------------+ 856 | | Value (Bits 0:4) | Meaning | Notes | 857 | +==================+=============================+================================+ 858 | | 0 | Created, Never Classified | See note [4]_ | 859 | +------------------+-----------------------------+ + 860 | | 1 | Unclassified | | 861 | +------------------+-----------------------------+--------------------------------+ 862 | | 2 | Ground | | 863 | +------------------+-----------------------------+--------------------------------+ 864 | | 3 | Low Vegetation | | 865 | +------------------+-----------------------------+--------------------------------+ 866 | | 4 | Medium Vegetation | | 867 | +------------------+-----------------------------+--------------------------------+ 868 | | 5 | High Vegetation | | 869 | +------------------+-----------------------------+--------------------------------+ 870 | | 6 | Building | | 871 | +------------------+-----------------------------+--------------------------------+ 872 | | 7 | Low Point (Noise) | | 873 | +------------------+-----------------------------+--------------------------------+ 874 | | 8 | *Reserved* | | 875 | +------------------+-----------------------------+--------------------------------+ 876 | | 9 | Water | | 877 | +------------------+-----------------------------+--------------------------------+ 878 | | 10 | Rail | | 879 | +------------------+-----------------------------+--------------------------------+ 880 | | 11 | Road Surface | | 881 | +------------------+-----------------------------+--------------------------------+ 882 | | 12 | *Reserved* | | 883 | +------------------+-----------------------------+--------------------------------+ 884 | | 13 | Wire -- Guard (Shield) | | 885 | +------------------+-----------------------------+--------------------------------+ 886 | | 14 | Wire -- Conductor (Phase) | | 887 | +------------------+-----------------------------+--------------------------------+ 888 | | 15 | Transmission Tower | | 889 | +------------------+-----------------------------+--------------------------------+ 890 | | 16 | Wire-Structure Connector | e.g., insulators | 891 | +------------------+-----------------------------+--------------------------------+ 892 | | 17 | Bridge Deck | | 893 | +------------------+-----------------------------+--------------------------------+ 894 | | 18 | High Noise | | 895 | +------------------+-----------------------------+--------------------------------+ 896 | | 19 | Overhead Structure | e.g., conveyors, mining | 897 | | | | equipment, traffic lights | 898 | +------------------+-----------------------------+--------------------------------+ 899 | | 20 | Ignored Ground | e.g., breakline proximity | 900 | +------------------+-----------------------------+--------------------------------+ 901 | | 21 | Snow | | 902 | +------------------+-----------------------------+--------------------------------+ 903 | | 22 | Temporal Exclusion | Features excluded due to | 904 | | | | changes over time between data | 905 | | | | sources -- e.g., water levels, | 906 | | | | landslides, permafrost | 907 | +------------------+-----------------------------+--------------------------------+ 908 | | 23-63 | *Reserved* | | 909 | +------------------+-----------------------------+--------------------------------+ 910 | | 64-255 | User Definable | | 911 | +------------------+-----------------------------+--------------------------------+ 912 | 913 | 914 | .. [4] We are using both 0 and 1 as Unclassified to maintain compatibility 915 | with current popular classification software such as TerraScan. We extend the 916 | idea of classification value 1 to include cases in which data have been 917 | subjected to a classification algorithm but emerged in an undefined state. For 918 | example, data with class 0 is sent through an algorithm to detect man-made 919 | structures – points that emerge without having been assigned as belonging to 920 | structures could be remapped from class 0 to class 1. 921 | 922 | 923 | **Scan Angle** 924 | 925 | The Scan Angle is a signed short that represents the rotational position of the 926 | emitted laser pulse with respect to the vertical dimension of the coordinate system of 927 | the data. Down in the data coordinate system is the 0.0 position. Each 928 | increment represents 0.006 degrees. Counter-clockwise rotation, as viewed from 929 | the rear of the sensor, facing in the along-track (positive trajectory) 930 | direction, is positive. The maximum value in the positive sense is 30,000 (180 931 | degrees which is up in the coordinate system of the data). The maximum value in 932 | the negative direction is -30,000 which is also directly up. 933 | 934 | For :ref:`Aggregate Model Systems `, the Scan Angle should be 935 | set to zero unless assigned from a component measurement. 936 | 937 | 938 | .. raw:: latex 939 | 940 | \newpage 941 | 942 | Point Data Record Format 7 943 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 944 | 945 | Point Data Record Format 7 is the same as Point Data Record Format 6 with the 946 | addition of three RGB color channels. These fields are used when "colorizing" a 947 | point using ancillary data, typically from a camera. 948 | 949 | .. tabularcolumns:: |p{7.5cm}|p{3.5cm}|p{1.5cm}|p{1.5cm}| 950 | 951 | .. table:: Point Data Record Format 7 952 | 953 | +----------------------------------+-------------------------+-----------+----------+ 954 | | Item | Format | Size | Required | 955 | +==================================+=========================+===========+==========+ 956 | | X | long | 4 bytes | yes | 957 | +----------------------------------+-------------------------+-----------+----------+ 958 | | Y | long | 4 bytes | yes | 959 | +----------------------------------+-------------------------+-----------+----------+ 960 | | Z | long | 4 bytes | yes | 961 | +----------------------------------+-------------------------+-----------+----------+ 962 | | Intensity | unsigned short | 2 bytes | no | 963 | +----------------------------------+-------------------------+-----------+----------+ 964 | | Return Number | 4 bits (bits 0-3) | 4 bits | yes | 965 | +----------------------------------+-------------------------+-----------+----------+ 966 | | Number of Returns (Given Pulse) | 4 bits (bits 4-7) | 4 bits | yes | 967 | +----------------------------------+-------------------------+-----------+----------+ 968 | | Classification Flags | 4 bits (bits 0-3) | 4 bits | no | 969 | +----------------------------------+-------------------------+-----------+----------+ 970 | | Scanner Channel | 2 bits (bits 4-5) | 2 bits | yes | 971 | +----------------------------------+-------------------------+-----------+----------+ 972 | | Scan Direction Flag | 1 bit (bit 6) | 1 bit | yes | 973 | +----------------------------------+-------------------------+-----------+----------+ 974 | | Edge of Flight Line | 1 bit (bit 7) | 1 bit | yes | 975 | +----------------------------------+-------------------------+-----------+----------+ 976 | | Classification | unsigned char | 1 byte | yes | 977 | +----------------------------------+-------------------------+-----------+----------+ 978 | | User Data | unsigned char | 1 byte | no | 979 | +----------------------------------+-------------------------+-----------+----------+ 980 | | Scan Angle | short | 2 bytes | yes | 981 | +----------------------------------+-------------------------+-----------+----------+ 982 | | Point Source ID | unsigned short | 2 bytes | yes | 983 | +----------------------------------+-------------------------+-----------+----------+ 984 | | GPS Time | double | 8 bytes | yes | 985 | +----------------------------------+-------------------------+-----------+----------+ 986 | | Red | unsigned short | 2 bytes | yes | 987 | +----------------------------------+-------------------------+-----------+----------+ 988 | | Green | unsigned short | 2 bytes | yes | 989 | +----------------------------------+-------------------------+-----------+----------+ 990 | | Blue | unsigned short | 2 bytes | yes | 991 | +----------------------------------+-------------------------+-----------+----------+ 992 | | *Minimum PDRF Size* | *36 bytes* | 993 | +------------------------------------------------------------+----------------------+ 994 | 995 | .. raw:: latex 996 | 997 | \newpage 998 | 999 | Point Data Record Format 8 1000 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1001 | 1002 | Point Data Record Format 8 is the same as Point Data Record Format 7 with the 1003 | addition of a NIR (near infrared) channel. 1004 | 1005 | .. tabularcolumns:: |p{7.5cm}|p{3.5cm}|p{1.5cm}|p{1.5cm}| 1006 | 1007 | .. table:: Point Data Record Format 8 1008 | 1009 | +----------------------------------+-------------------------+-----------+----------+ 1010 | | Item | Format | Size | Required | 1011 | +==================================+=========================+===========+==========+ 1012 | | X | long | 4 bytes | yes | 1013 | +----------------------------------+-------------------------+-----------+----------+ 1014 | | Y | long | 4 bytes | yes | 1015 | +----------------------------------+-------------------------+-----------+----------+ 1016 | | Z | long | 4 bytes | yes | 1017 | +----------------------------------+-------------------------+-----------+----------+ 1018 | | Intensity | unsigned short | 2 bytes | no | 1019 | +----------------------------------+-------------------------+-----------+----------+ 1020 | | Return Number | 4 bits (bits 0-3) | 4 bits | yes | 1021 | +----------------------------------+-------------------------+-----------+----------+ 1022 | | Number of Returns (Given Pulse) | 4 bits (bits 4-7) | 4 bits | yes | 1023 | +----------------------------------+-------------------------+-----------+----------+ 1024 | | Classification Flags | 4 bits (bits 0-3) | 4 bits | no | 1025 | +----------------------------------+-------------------------+-----------+----------+ 1026 | | Scanner Channel | 2 bits (bits 4-5) | 2 bits | yes | 1027 | +----------------------------------+-------------------------+-----------+----------+ 1028 | | Scan Direction Flag | 1 bit (bit 6) | 1 bit | yes | 1029 | +----------------------------------+-------------------------+-----------+----------+ 1030 | | Edge of Flight Line | 1 bit (bit 7) | 1 bit | yes | 1031 | +----------------------------------+-------------------------+-----------+----------+ 1032 | | Classification | unsigned char | 1 byte | yes | 1033 | +----------------------------------+-------------------------+-----------+----------+ 1034 | | User Data | unsigned char | 1 byte | no | 1035 | +----------------------------------+-------------------------+-----------+----------+ 1036 | | Scan Angle | short | 2 bytes | yes | 1037 | +----------------------------------+-------------------------+-----------+----------+ 1038 | | Point Source ID | unsigned short | 2 bytes | yes | 1039 | +----------------------------------+-------------------------+-----------+----------+ 1040 | | GPS Time | double | 8 bytes | yes | 1041 | +----------------------------------+-------------------------+-----------+----------+ 1042 | | Red | unsigned short | 2 bytes | yes | 1043 | +----------------------------------+-------------------------+-----------+----------+ 1044 | | Green | unsigned short | 2 bytes | yes | 1045 | +----------------------------------+-------------------------+-----------+----------+ 1046 | | Blue | unsigned short | 2 bytes | yes | 1047 | +----------------------------------+-------------------------+-----------+----------+ 1048 | | NIR | unsigned short | 2 bytes | yes | 1049 | +----------------------------------+-------------------------+-----------+----------+ 1050 | | *Minimum PDRF Size* | *38 bytes* | 1051 | +------------------------------------------------------------+----------------------+ 1052 | 1053 | **NIR** 1054 | 1055 | The NIR (near infrared) channel value associated with this point. 1056 | 1057 | .. note:: 1058 | 1059 | Note that Red, Green, Blue, and NIR values should always be normalized to 16 1060 | bit values. For example, when encoding an 8 bit per channel pixel, multiply 1061 | each channel value by 256 prior to storage in these fields. This 1062 | normalization allows color values from different camera bit depths to be 1063 | accurately merged. 1064 | 1065 | .. raw:: latex 1066 | 1067 | \newpage 1068 | 1069 | Point Data Record Format 9 1070 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1071 | 1072 | Point Data Record Format 9 adds Wave Packets to Point Data Record Format 6. 1073 | 1074 | .. tabularcolumns:: |p{7.5cm}|p{3.5cm}|p{1.5cm}|p{1.5cm}| 1075 | 1076 | .. table:: Point Data Record Format 9 1077 | 1078 | +----------------------------------+-------------------------+-----------+----------+ 1079 | | Item | Format | Size | Required | 1080 | +==================================+=========================+===========+==========+ 1081 | | X | long | 4 bytes | yes | 1082 | +----------------------------------+-------------------------+-----------+----------+ 1083 | | Y | long | 4 bytes | yes | 1084 | +----------------------------------+-------------------------+-----------+----------+ 1085 | | Z | long | 4 bytes | yes | 1086 | +----------------------------------+-------------------------+-----------+----------+ 1087 | | Intensity | unsigned short | 2 bytes | no | 1088 | +----------------------------------+-------------------------+-----------+----------+ 1089 | | Return Number | 4 bits (bits 0-3) | 4 bits | yes | 1090 | +----------------------------------+-------------------------+-----------+----------+ 1091 | | Number of Returns (Given Pulse) | 4 bits (bits 4-7) | 4 bits | yes | 1092 | +----------------------------------+-------------------------+-----------+----------+ 1093 | | Classification Flags | 4 bits (bits 0-3) | 4 bits | no | 1094 | +----------------------------------+-------------------------+-----------+----------+ 1095 | | Scanner Channel | 2 bits (bits 4-5) | 2 bits | yes | 1096 | +----------------------------------+-------------------------+-----------+----------+ 1097 | | Scan Direction Flag | 1 bit (bit 6) | 1 bit | yes | 1098 | +----------------------------------+-------------------------+-----------+----------+ 1099 | | Edge of Flight Line | 1 bit (bit 7) | 1 bit | yes | 1100 | +----------------------------------+-------------------------+-----------+----------+ 1101 | | Classification | unsigned char | 1 byte | yes | 1102 | +----------------------------------+-------------------------+-----------+----------+ 1103 | | User Data | unsigned char | 1 byte | no | 1104 | +----------------------------------+-------------------------+-----------+----------+ 1105 | | Scan Angle | short | 2 bytes | yes | 1106 | +----------------------------------+-------------------------+-----------+----------+ 1107 | | Point Source ID | unsigned short | 2 bytes | yes | 1108 | +----------------------------------+-------------------------+-----------+----------+ 1109 | | GPS Time | double | 8 bytes | yes | 1110 | +----------------------------------+-------------------------+-----------+----------+ 1111 | | Wave Packet Descriptor Index | unsigned char | 1 byte | yes | 1112 | +----------------------------------+-------------------------+-----------+----------+ 1113 | | Byte Offset to Waveform Data | unsigned long long | 8 bytes | yes | 1114 | +----------------------------------+-------------------------+-----------+----------+ 1115 | | Waveform Packet Size in Bytes | unsigned long | 4 bytes | yes | 1116 | +----------------------------------+-------------------------+-----------+----------+ 1117 | | Return Point Waveform Location | float | 4 bytes | yes | 1118 | +----------------------------------+-------------------------+-----------+----------+ 1119 | | Parametric dx | float | 4 bytes | yes | 1120 | +----------------------------------+-------------------------+-----------+----------+ 1121 | | Parametric dy | float | 4 bytes | yes | 1122 | +----------------------------------+-------------------------+-----------+----------+ 1123 | | Parametric dz | float | 4 bytes | yes | 1124 | +----------------------------------+-------------------------+-----------+----------+ 1125 | | *Minimum PDRF Size* | *59 bytes* | 1126 | +------------------------------------------------------------+----------------------+ 1127 | 1128 | .. raw:: latex 1129 | 1130 | \newpage 1131 | 1132 | Point Data Record Format 10 1133 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1134 | 1135 | Point Data Record Format 10 is the same as Point Data Record Format 9 with RGB and NIR values. 1136 | 1137 | .. tabularcolumns:: |p{7.5cm}|p{3.5cm}|p{1.5cm}|p{1.5cm}| 1138 | 1139 | .. table:: Point Data Record Format 10 1140 | 1141 | +----------------------------------+-------------------------+-----------+----------+ 1142 | | Item | Format | Size | Required | 1143 | +==================================+=========================+===========+==========+ 1144 | | X | long | 4 bytes | yes | 1145 | +----------------------------------+-------------------------+-----------+----------+ 1146 | | Y | long | 4 bytes | yes | 1147 | +----------------------------------+-------------------------+-----------+----------+ 1148 | | Z | long | 4 bytes | yes | 1149 | +----------------------------------+-------------------------+-----------+----------+ 1150 | | Intensity | unsigned short | 2 bytes | no | 1151 | +----------------------------------+-------------------------+-----------+----------+ 1152 | | Return Number | 4 bits (bits 0-3) | 4 bits | yes | 1153 | +----------------------------------+-------------------------+-----------+----------+ 1154 | | Number of Returns (Given Pulse) | 4 bits (bits 4-7) | 4 bits | yes | 1155 | +----------------------------------+-------------------------+-----------+----------+ 1156 | | Classification Flags | 4 bits (bits 0-3) | 4 bits | no | 1157 | +----------------------------------+-------------------------+-----------+----------+ 1158 | | Scanner Channel | 2 bits (bits 4-5) | 2 bits | yes | 1159 | +----------------------------------+-------------------------+-----------+----------+ 1160 | | Scan Direction Flag | 1 bit (bit 6) | 1 bit | yes | 1161 | +----------------------------------+-------------------------+-----------+----------+ 1162 | | Edge of Flight Line | 1 bit (bit 7) | 1 bit | yes | 1163 | +----------------------------------+-------------------------+-----------+----------+ 1164 | | Classification | unsigned char | 1 byte | yes | 1165 | +----------------------------------+-------------------------+-----------+----------+ 1166 | | User Data | unsigned char | 1 byte | no | 1167 | +----------------------------------+-------------------------+-----------+----------+ 1168 | | Scan Angle | short | 2 bytes | yes | 1169 | +----------------------------------+-------------------------+-----------+----------+ 1170 | | Point Source ID | unsigned short | 2 bytes | yes | 1171 | +----------------------------------+-------------------------+-----------+----------+ 1172 | | GPS Time | double | 8 bytes | yes | 1173 | +----------------------------------+-------------------------+-----------+----------+ 1174 | | Red | unsigned short | 2 bytes | yes | 1175 | +----------------------------------+-------------------------+-----------+----------+ 1176 | | Green | unsigned short | 2 bytes | yes | 1177 | +----------------------------------+-------------------------+-----------+----------+ 1178 | | Blue | unsigned short | 2 bytes | yes | 1179 | +----------------------------------+-------------------------+-----------+----------+ 1180 | | NIR | unsigned short | 2 bytes | yes | 1181 | +----------------------------------+-------------------------+-----------+----------+ 1182 | | Wave Packet Descriptor Index | unsigned char | 1 byte | yes | 1183 | +----------------------------------+-------------------------+-----------+----------+ 1184 | | Byte Offset to Waveform Data | unsigned long long | 8 bytes | yes | 1185 | +----------------------------------+-------------------------+-----------+----------+ 1186 | | Waveform Packet Size in Bytes | unsigned long | 4 bytes | yes | 1187 | +----------------------------------+-------------------------+-----------+----------+ 1188 | | Return Point Waveform Location | float | 4 bytes | yes | 1189 | +----------------------------------+-------------------------+-----------+----------+ 1190 | | Parametric dx | float | 4 bytes | yes | 1191 | +----------------------------------+-------------------------+-----------+----------+ 1192 | | Parametric dy | float | 4 bytes | yes | 1193 | +----------------------------------+-------------------------+-----------+----------+ 1194 | | Parametric dz | float | 4 bytes | yes | 1195 | +----------------------------------+-------------------------+-----------+----------+ 1196 | | *Minimum PDRF Size* | *67 bytes* | 1197 | +------------------------------------------------------------+----------------------+ 1198 | 1199 | .. raw:: latex 1200 | 1201 | \newpage 1202 | 1203 | -------------------------------------------------------------------------------- /source/02.07_evlr.sub: -------------------------------------------------------------------------------- 1 | .. raw:: latex 2 | 3 | \newpage 4 | 5 | .. _evlrdef_label: 6 | 7 | Extended Variable Length Records (EVLRs) 8 | ................................................................................ 9 | 10 | The Point Record Data can be followed by any number of EVLRs. 11 | 12 | The EVLR is, in spirit, identical to a VLR but can carry a larger payload as 13 | the "Record Length After Header" field is 8 bytes instead of 2 bytes. The 14 | number of EVLRs is specified in the "Number of Extended Variable Length 15 | Records" field in the :ref:`headerblock_label`. The start of the first EVLR is at 16 | the file offset indicated by the "Start of First Extended Variable Length 17 | Record" in the :ref:`headerblock_label`. The Extended Variable Length Records must 18 | be accessed sequentially since the size of each variable length record is 19 | contained in the Extended Variable Length Record Header. Each Extended Variable 20 | Length Record Header is 60 bytes in length. 21 | 22 | .. tabularcolumns:: |p{6.5cm}|p{4.0cm}|p{2.0cm}|p{1.5cm}| 23 | 24 | .. table:: Extended Variable Length Record Header 25 | 26 | +----------------------------------+-------------------------+-----------+----------+ 27 | | Item | Format | Size | Required | 28 | +==================================+=========================+===========+==========+ 29 | | Reserved | unsigned short | 2 bytes | | 30 | +----------------------------------+-------------------------+-----------+----------+ 31 | | User ID | char[16] | 16 bytes | yes | 32 | +----------------------------------+-------------------------+-----------+----------+ 33 | | Record ID | unsigned short | 2 bytes | yes | 34 | +----------------------------------+-------------------------+-----------+----------+ 35 | | Record Length After Header | unsigned long long | 8 bytes | yes | 36 | +----------------------------------+-------------------------+-----------+----------+ 37 | | Description | char[32] | 32 bytes | | 38 | +----------------------------------+-------------------------+-----------+----------+ 39 | 40 | .. note:: 41 | 42 | As with the VLR, the Reserved field must be set to zero. 43 | 44 | .. _evlr_legacy_label: 45 | 46 | Legacy Compatibility for EVLRs 47 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 48 | A writer who wishes to maintain legacy compatibility must use 49 | only VLRs (except for internally stored waveform data). A writer who is not 50 | concerned with a legacy LAS reader having access to a VLR can elect to use an 51 | EVLR, even for predefined VLRs such as Coordinate Reference System (CRS) 52 | information. This ability is useful, for example, when a user wishes to update 53 | information normally contained within a VLR without the need of rewriting the 54 | point data. 55 | 56 | A new LASF_Spec ":ref:`superseded_vlr_label`" VLR (value 7) has been defined to allow a writer to 57 | indicate that a VLR should no longer be used. For example, if a user appends a 58 | new WKT EVLR to a file, the existing WKT VLR should have its LASF Spec number 59 | changed to Superseded to indicate that it is no longer in use. 60 | 61 | 62 | -------------------------------------------------------------------------------- /source/03_required_vlrs.txt: -------------------------------------------------------------------------------- 1 | .. raw:: latex 2 | 3 | \newpage 4 | 5 | Coordinate Reference System VLRs (Required) 6 | -------------------------------------------------------------------------------- 7 | LAS 1.4 defines Variable Length Records (VLRs) and Extended Variable Length 8 | Records (EVLRs). Coordinate Reference System (CRS) VLRs are defined in this 9 | section, while other VLRs and EVLRs are defined in the following two sections. 10 | 11 | Coordinate Reference System Information 12 | ................................................................................ 13 | 14 | The Coordinate Reference System (CRS) information for the point data is 15 | required for all data. The CRS information will be placed in Variable Length 16 | Records or Extended Variable Length Records (note that if the writer wishes to 17 | maintain legacy compatibility, then GeoTIFF in VLRs must be used). The CRS is 18 | represented by either GeoTIFF or Well Known Text (WKT) as indicated by the WKT 19 | :ref:`Global Encoding ` bit. Point Record Formats 0-5 can 20 | use either GeoTIFF or WKT, but not both simultaneously. Point Data Record 21 | Formats 6-10 must use WKT. 22 | 23 | Georeferencing Information Using WKT 24 | ................................................................................ 25 | 26 | For definition of WKT, we refer to Open Geospatial Consortium (OGC) 27 | specification "OpenGIS coordinate transformation service implementation 28 | specification" revision 1.00 released 12 January 2001, section 7 (`"Coordinate 29 | Transformation Service Spec" `_). 30 | As there are a few dialects of WKT, please note that LAS is not using the "ESRI 31 | WKT" dialect, which does not include TOWGS84 and Authority nodes. 32 | 33 | WKT georeferencing information can be specified in two optional variable length 34 | records, the OGC math transform WKT record and the OGC coordinate system WKT 35 | record, as follows. Note that the math transform WKT record is added for 36 | completeness, and a coordinate system WKT *may* or *may not* require a math 37 | transform WKT record (a parameterized math transform definition). 38 | 39 | OGC Math Transform WKT Record 40 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 41 | 42 | +-----------------+-----------------------------+ 43 | | User ID | LASF_Projection | 44 | +-----------------+-----------------------------+ 45 | | Record ID | 2111 | 46 | +-----------------+-----------------------------+ 47 | 48 | This record contains the textual data representing a Math Transform WKT as 49 | defined in section 7 of the Coordinate Transformation Service Spec, with the 50 | following notes: 51 | 52 | * The OGC Math Transform WKT VLR data shall be a null-terminated string. 53 | * The OGC Math Transform WKT VLR data shall be considered UTF-8. 54 | * The OGC Math Transform WKT VLR data shall be considered C locale-based, and 55 | no localization of the numeric strings within the WKT should be performed. 56 | 57 | OGC Coordinate System WKT Record 58 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 59 | 60 | +-----------------+-----------------------------+ 61 | | User ID | LASF_Projection | 62 | +-----------------+-----------------------------+ 63 | | Record ID | 2112 | 64 | +-----------------+-----------------------------+ 65 | 66 | This record contains the textual data representing a Coordinate System WKT as 67 | defined in section 7 of the Coordinate Transformation Service Spec, with the 68 | following notes: 69 | 70 | * The OGC Coordinate System WKT VLR data shall be a null-terminated string. 71 | * The OGC Coordinate System WKT VLR data shall be considered UTF-8. 72 | * The OGC Coordinate System WKT VLR data shall be considered C locale-based, and 73 | no localization of the numeric strings within the WKT should be performed. 74 | 75 | Georeferencing Information Using GeoTIFF 76 | ................................................................................ 77 | 78 | The GeoTIFF specification is defined by http://geotiff.osgeo.org/. 79 | 80 | GeoTIFF georeferencing for the LAS formats uses the same mechanism that was 81 | developed for the GeoTIFF standard. The variable length header records section 82 | may contain the same data that would be contained in the GeoTIFF key tags of a 83 | TIFF file. Since LAS is not a raster format and each point contains its own 84 | absolute location information, only 3 of the 6 GeoTIFF tags are necessary when 85 | using GeoTIFF records instead of WKT records. The ModelTiePointTag (33922), 86 | ModelPixelScaleTag (33550), and ModelTransformationTag (34264) records can be 87 | excluded. The GeoKeyDirectoryTag (34735), GeoDoubleParamsTag (34736), and 88 | GeoAsciiParamsTag (34737) records are used. 89 | 90 | Only the GeoKeyDirectoryTag record is required when using GeoTIFF records 91 | instead of WKT records. The GeoDoubleParamsTag and GeoAsciiParamsTag records 92 | may or may not be present, depending on the content of the GeoKeyDirectoryTag 93 | record. 94 | 95 | GeoKeyDirectoryTag Record 96 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 97 | 98 | +-----------------+-----------------------------+ 99 | | User ID | LASF_Projection | 100 | +-----------------+-----------------------------+ 101 | | Record ID | 34735 | 102 | +-----------------+-----------------------------+ 103 | 104 | This record contains the key values that define the coordinate system. A 105 | complete description can be found in the GeoTIFF format specification. Here is 106 | a summary from a programmatic point of view for someone interested in 107 | implementation. 108 | 109 | The GeoKeyDirectoryTag is defined as an array of unsigned short values. 110 | Programmatically, the data can be structured as follows: 111 | 112 | :: 113 | 114 | struct sGeoKeys { 115 | unsigned short wKeyDirectoryVersion; 116 | unsigned short wKeyRevision; 117 | unsigned short wMinorRevision; 118 | unsigned short wNumberOfKeys; 119 | 120 | struct sKeyEntry { 121 | unsigned short wKeyID; 122 | unsigned short wTIFFTagLocation; 123 | unsigned short wCount; 124 | unsigned short wValue_Offset; 125 | } pKey[1]; 126 | }; 127 | 128 | ...where... 129 | 130 | :: 131 | 132 | wKeyDirectoryVersion = 1; // Always 133 | wKeyRevision = 1; // Always 134 | wMinorRevision = 0; // Always 135 | wNumberOfKeys // Number of sets of 4 unsigned shorts to follow 136 | 137 | .. tabularcolumns:: |p{4.5cm}|p{12.0cm}| 138 | 139 | .. table:: GeoKey Four Unsigned Shorts 140 | 141 | +---------------------------------+----------------------------------------------------------+ 142 | | Name | Definition | 143 | +=================================+==========================================================+ 144 | | ``wKeyID`` | Defined key ID for each piece of GeoTIFF data. IDs | 145 | | | contained in the GeoTIFF specification. | 146 | +---------------------------------+----------------------------------------------------------+ 147 | | ``wTIFFTagLocation`` | Indicates where the data for this key is located: | 148 | | | | 149 | | | * 0 means data is in the ``wValue_Offset`` field as an | 150 | | | unsigned short. | 151 | | | * 34736 means the data is located at index | 152 | | | ``wValue_Offset`` of the GeoDoubleParamsTag record. | 153 | | | * 34737 means the data is located at index | 154 | | | ``wValue_Offset`` of the GeoAsciiParamsTag record. | 155 | +---------------------------------+----------------------------------------------------------+ 156 | | ``wCount`` | Number of characters in string for values of | 157 | | | GeoAsciiParamsTag, otherwise is 1. | 158 | +---------------------------------+----------------------------------------------------------+ 159 | | ``wValue_Offset`` | Contents vary depending on value for wTIFFTagLocation | 160 | | | above. | 161 | +---------------------------------+----------------------------------------------------------+ 162 | 163 | 164 | 165 | GeoDoubleParamsTag Record (Optional) 166 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | 168 | +-----------------+-----------------------------+ 169 | | User ID | LASF_Projection | 170 | +-----------------+-----------------------------+ 171 | | Record ID | 34736 | 172 | +-----------------+-----------------------------+ 173 | 174 | This record is simply an array of doubles that contain values referenced by tag 175 | sets in the GeoKeyDirectoryTag record. 176 | 177 | GeoAsciiParamsTag Record (Optional) 178 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 179 | 180 | +-----------------+-----------------------------+ 181 | | User ID | LASF_Projection | 182 | +-----------------+-----------------------------+ 183 | | Record ID | 34737 | 184 | +-----------------+-----------------------------+ 185 | 186 | This record is simply an array of ASCII data. It contains many strings separated 187 | by null terminator characters, which are referenced by position from data in the 188 | GeoKeyDirectoryTag record. 189 | 190 | 191 | -------------------------------------------------------------------------------- /source/04_optional_vlrs.txt: -------------------------------------------------------------------------------- 1 | .. raw:: latex 2 | 3 | \newpage 4 | 5 | Other Specification Defined VLRs (Optional) 6 | -------------------------------------------------------------------------------- 7 | 8 | Classification Lookup 9 | ................................................................................ 10 | 11 | +----------------------------+-----------------------------------+ 12 | | User ID | LASF_Spec | 13 | +----------------------------+-----------------------------------+ 14 | | Record ID | 0 | 15 | +----------------------------+-----------------------------------+ 16 | | Record Length after Header | 256 records * 16 bytes per struct | 17 | +----------------------------+-----------------------------------+ 18 | 19 | :: 20 | 21 | struct CLASSIFICATION { 22 | unsigned char ClassNumber; 23 | char Description[15]; 24 | }; //total of 16 bytes 25 | 26 | 27 | Text Area Description 28 | ................................................................................ 29 | 30 | +-----------------+-----------------------------+ 31 | | User ID | LASF_Spec | 32 | +-----------------+-----------------------------+ 33 | | Record ID | 3 | 34 | +-----------------+-----------------------------+ 35 | 36 | This VLR/EVLR is used for providing a textual description of the content of the 37 | LAS file. It is a null-terminated, free-form ASCII string. 38 | 39 | .. _extrabytes_vlr_label: 40 | 41 | Extra Bytes 42 | ................................................................................ 43 | 44 | +----------------------------+-----------------------------+ 45 | | User ID | LASF_Spec | 46 | +----------------------------+-----------------------------+ 47 | | Record ID | 4 | 48 | +----------------------------+-----------------------------+ 49 | | Record Length after Header | n descriptors * 192 bytes | 50 | +----------------------------+-----------------------------+ 51 | 52 | The Extra Bytes VLR provides a mechanism whereby additional information can be 53 | added to the end of a standard Point Record. This VLR has been added to LAS 1.4 54 | to formalize a process that has been used in prior versions of LAS. It is 55 | envisioned that software that is not cognizant of the meaning of the extra 56 | bytes will simply copy these bytes when manipulating files. 57 | 58 | This VLR is only required for LAS files where points contain user-defined 59 | "extra bytes". This happens when the point record size is set to a larger value 60 | than required by the point type. For example, if a LAS file that contains 61 | point type 1 has a point record size of 32 instead of 28, there are 4 "extra 62 | bytes". The Extra Bytes VLR contains a simple description of the type and the 63 | meaning of these "extra bytes" so they can be accessed in a consistent manner 64 | across applications. The extra bytes descriptor is defined as follows: 65 | 66 | :: 67 | 68 | struct EXTRA_BYTES { 69 | unsigned char reserved[2]; // 2 bytes 70 | unsigned char data_type; // 1 byte 71 | unsigned char options; // 1 byte 72 | char name[32]; // 32 bytes 73 | unsigned char unused[4]; // 4 bytes 74 | anytype no_data; // 8 bytes 75 | unsigned char deprecated1[16]; // 16 bytes 76 | anytype min; // 8 bytes 77 | unsigned char deprecated2[16]; // 16 bytes 78 | anytype max; // 8 bytes 79 | unsigned char deprecated3[16]; // 16 bytes 80 | double scale; // 8 bytes 81 | unsigned char deprecated4[16]; // 16 bytes 82 | double offset; // 8 bytes 83 | unsigned char deprecated5[16]; // 16 bytes 84 | char description[32]; // 32 bytes 85 | }; // total of 192 bytes 86 | 87 | The 4 "extra bytes" could, for example, be of data_type 9 - a 4-byte floating 88 | point value - that specifies an "echo width" for each return. In this case there 89 | would be one EXTRA_BYTES struct in the payload of this VLR. In another example, 90 | four EXTRA_BYTES structs in the VLR payload could describe 14 "extra bytes" in 91 | each point record: 92 | 93 | #) "laser pulse direction [0]" - data_type = 9 (float) 94 | #) "laser pulse direction [1]" - data_type = 9 (float) 95 | #) "laser pulse direction [2]" - data_type = 9 (float) 96 | #) "pulse width" - data_type = 3 (ushort) 97 | 98 | In this example, an array of three individual floats collectively specify a 99 | "laser pulse direction" for that point, and one unsigned short integer specifies 100 | a "pulse width" for that point. 101 | 102 | The "extra bytes" are made accessible via a unique name. The "name" field 103 | distinguishes the additional point attributes that software may add to 104 | the points in a LAS file so they can be accessed later in a consistent manner 105 | by another software. Descriptive names such as "normalized reflectivity", "echo 106 | width", or "shading normal" are encouraged. The use of generic names such as 107 | "variable1" or "temp1" is discouraged. 108 | 109 | Multiple sequential "extra byte" records can compose an array of associated 110 | values. It is recommended that each member's name be consistent with other 111 | members, only varying by an index number wrapped in square brackets, as in 112 | the above example. Zero-indexed arrays are encouraged. Previous revisions 113 | of the LAS 1.4 specification utilized data_types 11-30 to define standard 114 | two- and three-member arrays, but this feature was never widely implemented 115 | and was `deprecated in R14 `_ to 116 | simplify implementation. 117 | 118 | Any unused characters in the "name" or "description" fields must be set to zero. 119 | 120 | .. tabularcolumns:: |p{2.0cm}|p{5.0cm}|p{6.0cm}| 121 | 122 | .. table:: Values for ``data_type`` Field 123 | 124 | +------------+-------------------------------+-------------------+ 125 | | Value | Meaning | Size on Disk | 126 | +============+===============================+===================+ 127 | | 0 | undocumented extra bytes | specify value in | 128 | | | | ``options`` field | 129 | +------------+-------------------------------+-------------------+ 130 | | 1 | unsigned char | 1 byte | 131 | +------------+-------------------------------+-------------------+ 132 | | 2 | char | 1 byte | 133 | +------------+-------------------------------+-------------------+ 134 | | 3 | unsigned short | 2 bytes | 135 | +------------+-------------------------------+-------------------+ 136 | | 4 | short | 2 bytes | 137 | +------------+-------------------------------+-------------------+ 138 | | 5 | unsigned long | 4 bytes | 139 | +------------+-------------------------------+-------------------+ 140 | | 6 | long | 4 bytes | 141 | +------------+-------------------------------+-------------------+ 142 | | 7 | unsigned long long | 8 bytes | 143 | +------------+-------------------------------+-------------------+ 144 | | 8 | long long | 8 bytes | 145 | +------------+-------------------------------+-------------------+ 146 | | 9 | float | 4 bytes | 147 | +------------+-------------------------------+-------------------+ 148 | | 10 | double | 8 bytes | 149 | +------------+-------------------------------+-------------------+ 150 | | 11-30 | *Deprecated* | deprecated | 151 | +------------+-------------------------------+-------------------+ 152 | | 31-255 | *Reserved* | not assigned | 153 | +------------+-------------------------------+-------------------+ 154 | 155 | 156 | .. tabularcolumns:: |p{2.0cm}|p{4.0cm}|p{8.5cm}| 157 | 158 | .. table:: Encoding of ``options`` Bit Field 159 | 160 | +-----------+------------------+-------------------------------------------+ 161 | | Bits | Field Name | Description | 162 | +===========+==================+===========================================+ 163 | | 0 | no_data_bit | If set, the ``no_data`` value is relevant | 164 | +-----------+------------------+-------------------------------------------+ 165 | | 1 | min_bit | If set, the ``min`` value is relevant | 166 | +-----------+------------------+-------------------------------------------+ 167 | | 2 | max_bit | If set, the ``max`` value is relevant | 168 | +-----------+------------------+-------------------------------------------+ 169 | | 3 | scale_bit | If set, each value should be multiplied | 170 | | | | by the corresponding scale value (before | 171 | | | | applying the offset). | 172 | +-----------+------------------+-------------------------------------------+ 173 | | 4 | offset_bit | If set, each value should be translated | 174 | | | | by the corresponding offset value (after | 175 | | | | applying the scaling). | 176 | +-----------+------------------+-------------------------------------------+ 177 | 178 | 179 | The bit mask in the "options" field specifies whether the min and max range of 180 | the value has been set (i.e., is meaningful), whether the scale and/or offset 181 | values are set with which the "extra bytes" are to be multiplied and translated 182 | to compute their actual value, and whether there is a special value that should 183 | be interpreted as NO_DATA. By default all bits are zero which means that the 184 | values in the corresponding fields are to be disregarded. Any unused 185 | "no_data", "min", "max", "scale", or "offset" fields must be set to zero. 186 | 187 | If the selected data_type is less than 8 bytes, the no_data, min, and max fields 188 | should be upcast into 8-byte storage. For any float these 8 bytes would be 189 | upcast to a double, for any unsigned char, unsigned short, or unsigned long 190 | they would be upcast to an unsigned long long and for any char, short, or long, 191 | they would be upcast to a long long. 192 | 193 | If used, the min and max fields reflect the actual minimum and maximum values 194 | of the attribute in the LAS file, in its raw form, without any scale 195 | or offset values applied. 196 | 197 | The "reserved" field, the "unused" field, and the "deprecated" fields must be 198 | set to zero and may be used in a future revision. 199 | 200 | A LAS file contains "undocumented extra bytes" when there are "extra bytes" 201 | but when there is no Extra Bytes VLR that describes them or when there are 202 | more "extra bytes" than described in an existing Extra Bytes VLR. 203 | 204 | When adding an "Extra Bytes" VLR to a LAS file that contains "undocumented 205 | extra bytes" they must be designated as data_type == 0 with the options bit 206 | field storing the number of undocumented bytes. 207 | 208 | A LAS file has an "extra bytes mismatch" if the Extra Bytes VLR describes more 209 | "extra bytes" than each LAS point actually has. The occurrence of an "extra 210 | bytes mismatch" renders the Extra Bytes VLR invalid. 211 | 212 | .. _superseded_vlr_label: 213 | 214 | Superseded 215 | ................................................................................ 216 | 217 | +-----------------+-----------------------------+ 218 | | User ID | LASF_Spec | 219 | +-----------------+-----------------------------+ 220 | | Record ID | 7 | 221 | +-----------------+-----------------------------+ 222 | 223 | This LASF Record ID is used to negate an existing VLR/EVLR when rewriting the 224 | file (to remove the undesired VLR/EVLR). It is used, for example, when 225 | updating a record such as projection information where a new EVLR is appended 226 | to the end of the LAS file. The existing VLR which has been superseded must be 227 | marked with the SUPERSEDED Record ID. 228 | 229 | .. _fwf_descriptor_label: 230 | 231 | Waveform Packet Descriptor 232 | ................................................................................ 233 | 234 | +-----------------+-----------------------------+ 235 | | User ID | LASF_Spec | 236 | +-----------------+-----------------------------+ 237 | | Record ID | n: where n > 99 and n < 355 | 238 | +-----------------+-----------------------------+ 239 | 240 | .. warning:: 241 | 242 | This VLR is REQUIRED when using Point Data Record Formats 4, 5, 9, or 10. 243 | 244 | These records contain information that describes the configuration of the 245 | waveform packets. Since system configuration may vary throughout a 246 | dataset, the LAS file supports up to 255 Waveform Packet Descriptors. 247 | 248 | 249 | .. tabularcolumns:: |p{6.5cm}|p{4.0cm}|p{2.0cm}|p{1.5cm}| 250 | 251 | .. table:: Waveform Packet Descriptor User Defined Record 252 | 253 | +------------------------------+-------------------------+-----------+--------------+ 254 | | Item | Format | Size | Required | 255 | +==============================+=========================+===========+==============+ 256 | | Bits per Sample | unsigned char | 1 byte | yes | 257 | +------------------------------+-------------------------+-----------+--------------+ 258 | | Waveform Compression Type | unsigned char | 1 byte | yes | 259 | +------------------------------+-------------------------+-----------+--------------+ 260 | | Number of Samples | unsigned long | 4 bytes | yes | 261 | +------------------------------+-------------------------+-----------+--------------+ 262 | | Temporal Sample Spacing | unsigned long | 4 bytes | yes | 263 | +------------------------------+-------------------------+-----------+--------------+ 264 | | Digitizer Gain | double | 8 bytes | yes | 265 | +------------------------------+-------------------------+-----------+--------------+ 266 | | Digitizer Offset | double | 8 bytes | yes | 267 | +------------------------------+-------------------------+-----------+--------------+ 268 | 269 | **Bits per Sample** 270 | 271 | 2 through 32 bits are supported. 272 | 273 | **Waveform Compression Type** 274 | 275 | It is expected that in the future standard compression types will be adopted by 276 | the LAS committee. This field will indicate the compression algorithm used for 277 | the waveform packets associated with this descriptor. A value of 0 indicates no 278 | compression. Zero is the only value currently supported. 279 | 280 | **Number of Samples** 281 | 282 | The number of samples associated with this waveform packet type. This value 283 | always represents the fully decompressed waveform packet. 284 | 285 | **Temporal Sample Spacing** 286 | 287 | The temporal sample spacing in picoseconds. Example values might be 500, 1000, 288 | 2000, and so on, representing digitizer frequencies of 2 GHz, 1 GHz, and 500 MHz 289 | respectively. 290 | 291 | **Digitizer Gain and Offset** 292 | 293 | The digitizer gain and offset are used to convert the raw digitized value to an 294 | absolute digitizer voltage using the formula: 295 | 296 | .. math:: 297 | 298 | VOLTS = OFFSET + GAIN * Raw\_Waveform\_Amplitude 299 | 300 | .. note:: 301 | 302 | Users seeking further clarity regarding LAS waveform encoding are encouraged 303 | to learn more on the official LAS wiki: https://github.com/ASPRSorg/LAS/wiki 304 | 305 | 306 | -------------------------------------------------------------------------------- /source/05_defined_evlrs.txt: -------------------------------------------------------------------------------- 1 | .. raw:: latex 2 | 3 | \newpage 4 | 5 | Defined Extended Variable Length Records (EVLRs) 6 | -------------------------------------------------------------------------------- 7 | 8 | .. _fwf_packets_label: 9 | 10 | Waveform Data Packets 11 | ............................................................................... 12 | 13 | .. warning:: 14 | 15 | This EVLR is REQUIRED internally or externally when using Point Data Record 16 | Formats 4, 5, 9, or 10. 17 | 18 | +-----------------+-----------------------------+ 19 | | User ID | LASF_Spec | 20 | +-----------------+-----------------------------+ 21 | | Record ID | 65535 | 22 | +-----------------+-----------------------------+ 23 | 24 | The packet of Raw Waveform Amplitude values for all records immediately follow 25 | this VLR header. Note that when using a bit resolution that is not 26 | an even increment of 8, the last byte of each waveform packet must be padded 27 | such that the next waveform record will start on an even byte boundary. 28 | 29 | 30 | -------------------------------------------------------------------------------- /source/06_profiles.txt: -------------------------------------------------------------------------------- 1 | .. raw:: latex 2 | 3 | \newpage 4 | 5 | LAS Domain Profiles 6 | -------------------------------------------------------------------------------- 7 | 8 | A derivative of the base LAS specification that adds (but does not remove or 9 | alter existing) point classes and attributes to meet the application-specific 10 | needs of a particular subset of the broad point cloud community (e.g., the 11 | coastal/bathymetric lidar community, or the powerline mapping community). So as 12 | to not alter the LAS base specification, new classes can only be added to Point 13 | Data Record Formats 6-10, and classification values cannot start below 39. New 14 | attributes must be incorporated using :ref:`extrabytes_vlr_label` VLRs. It is strongly 15 | recommended that the development of Domain Profiles be coordinated to 16 | avoid unnecessary overlap or conflicts (e.g., conflicting class numbers) 17 | between profiles. 18 | 19 | LAS Domain Profile Description 20 | ................................................................................ 21 | 22 | The specification for a particular domain profile. The Description must contain: 23 | 24 | #) an overview of the purpose and intended use; 25 | #) table of new point classifications (PDRF 6-10); and 26 | #) table of new attributes to be stored using Extra Bytes VLRs (must contain 27 | fields for units, data type, name, no data, scale, and description). 28 | 29 | LAS Domain Profile Descriptions reviewed and approved by the LAS Working Group 30 | will be posted on the ASPRS website. A template Domain Profile Description is 31 | available on the ASPRS website_. 32 | 33 | .. _website: https://www.asprs.org/committee-general/laser-las-file-format-exchange-activities.html 34 | -------------------------------------------------------------------------------- /source/_static/asprslogo45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASPRSorg/LAS/a2412413990da0768784781df852f2a7d4e711d6/source/_static/asprslogo45.png -------------------------------------------------------------------------------- /source/conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # LAS documentation build configuration file, created by 4 | # sphinx-quickstart on Tue Feb 7 14:10:03 2017. 5 | # 6 | # This file is execfile()d with the current directory set to its 7 | # containing dir. 8 | # 9 | # Note that not all possible configuration values are present in this 10 | # autogenerated file. 11 | # 12 | # All configuration values have a default; values that are commented out 13 | # serve to show the default. 14 | 15 | # If extensions (or modules to document with autodoc) are in another directory, 16 | # add these directories to sys.path here. If the directory is relative to the 17 | # documentation root, use os.path.abspath to make it absolute, like shown here. 18 | # 19 | # import os 20 | # import sys 21 | # sys.path.insert(0, os.path.abspath('.')) 22 | 23 | 24 | # -- General configuration ------------------------------------------------ 25 | 26 | # If your documentation needs a minimal Sphinx version, state it here. 27 | # 28 | # needs_sphinx = '1.0' 29 | 30 | # Add any Sphinx extension module names here, as strings. They can be 31 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 32 | # ones. 33 | extensions = ['sphinx.ext.mathjax'] 34 | 35 | # Add any paths that contain templates here, relative to this directory. 36 | templates_path = ['_templates'] 37 | 38 | # The suffix(es) of source filenames. 39 | # You can specify multiple suffix as a list of string: 40 | # 41 | # source_suffix = ['.rst', '.md'] 42 | source_suffix = '.txt' 43 | 44 | # The master toctree document. 45 | master_doc = '00_index' 46 | 47 | # General information about the project. 48 | project = u'LAS' 49 | copyright = u'2019, ASPRS' 50 | author = u'ASPRS' 51 | 52 | # The version info for the project you're documenting, acts as replacement for 53 | # |version| and |release|, also used in various other places throughout the 54 | # built documents. 55 | # 56 | # The short X.Y version. 57 | #version = u'1.4' 58 | # Custom non-keyword version tag for header 59 | myversion = u'1.4 - R15' 60 | # The full version, including alpha/beta/rc tags. 61 | release = u'VERSION ' + myversion 62 | releasename = release 63 | version='' 64 | 65 | # Publication info (approval date, release date, and GitHub SHA) 66 | today='09 July 2019' 67 | releasedate='09 July 2019' 68 | approvaldate = 'November 2011' 69 | 70 | import subprocess 71 | 72 | def get_git_revision_short_hash(): 73 | return subprocess.check_output(['git', 'rev-parse', 'HEAD']) 74 | gitsha = get_git_revision_short_hash() 75 | 76 | # The language for content autogenerated by Sphinx. Refer to documentation 77 | # for a list of supported languages. 78 | # 79 | # This is also used if you do content translation via gettext catalogs. 80 | # Usually you set "language" from the command line for these cases. 81 | language = None 82 | 83 | # List of patterns, relative to source directory, that match files and 84 | # directories to ignore when looking for source files. 85 | # This patterns also effect to html_static_path and html_extra_path 86 | exclude_patterns = [] 87 | 88 | # The name of the Pygments (syntax highlighting) style to use. 89 | pygments_style = 'sphinx' 90 | 91 | # If true, `todo` and `todoList` produce output, else they produce nothing. 92 | todo_include_todos = False 93 | 94 | 95 | # -- Options for HTML output ---------------------------------------------- 96 | 97 | # The theme to use for HTML and HTML Help pages. See the documentation for 98 | # a list of builtin themes. 99 | # 100 | html_theme = 'alabaster' 101 | 102 | # Theme options are theme-specific and customize the look and feel of a theme 103 | # further. For a list of options available for each theme, see the 104 | # documentation. 105 | # 106 | # html_theme_options = {} 107 | 108 | # Add any paths that contain custom static files (such as style sheets) here, 109 | # relative to this directory. They are copied after the builtin static files, 110 | # so a file named "default.css" will overwrite the builtin "default.css". 111 | html_static_path = ['_static'] 112 | 113 | 114 | # -- Options for HTMLHelp output ------------------------------------------ 115 | 116 | # Output file base name for HTML help builder. 117 | htmlhelp_basename = 'LASdoc' 118 | 119 | 120 | # -- Options for LaTeX output --------------------------------------------- 121 | 122 | preamble = r''' 123 | 124 | % Ensures arabic numerals (1, 2, 3) as section numbering style 125 | \renewcommand\thesection{\arabic{section}} 126 | 127 | % Apply fancyhdr overrides to Sphinx default styles. More info: 128 | % https://stackoverflow.com/questions/4839105/sphinx-customization-of-latexpdf-output 129 | % bug: this still doesn't apply to the TOC and title page. not sure what style's there. 130 | 131 | \usepackage{titling} 132 | \usepackage{fancyhdr} 133 | \makeatletter 134 | \fancypagestyle{normal}{ 135 | \fancyhf{} 136 | \fancyhead[R]{American Society for Photogrammetry \& Remote Sensing} 137 | \fancyhead[L]{LAS Specification VVVV} 138 | \fancyfoot[L]{\rightmark} 139 | \fancyfoot[R]{Page \thepage} 140 | 141 | \renewcommand{\headrulewidth}{1pt} 142 | \renewcommand{\footrulewidth}{1pt} 143 | } 144 | 145 | % Override Sphinx defaults for table heading (bold instead of sans serif) 146 | % note: won't work in newer versions of Sphinx 1.7+ 147 | \protected\def\sphinxstylethead{\textbf} 148 | 149 | \makeatother 150 | 151 | % Override Sphinx defaults for list item spacing and bolding. More info: 152 | % https://tex.stackexchange.com/questions/10684/vertical-space-in-lists 153 | % https://texblog.org/2008/10/16/lists-enumerate-itemize-description-and-how-to-change-them/ 154 | \usepackage{enumitem} 155 | \setlist{noitemsep} 156 | 157 | '''.replace("VVVV", u'v.' + myversion) 158 | 159 | # Build PDF title page 160 | args = {} 161 | args['author'] = author 162 | args['releasedate'] = releasedate 163 | args['releasename'] = releasename 164 | args['approvaldate'] = approvaldate 165 | args['gitsha'] = gitsha 166 | import datetime 167 | now = datetime.datetime.now() 168 | args['thisyear'] = now.year 169 | now = now.strftime("%d %B %Y") 170 | args['now'] = now 171 | 172 | title = r""" 173 | \begin{titlingpage} 174 | 175 | {\sphinxlogo} 176 | 177 | 178 | \vspace{0.25in} 179 | 180 | {\huge 181 | \thetitle\\ 182 | } 183 | 184 | \release{%(releasename)s} 185 | \author{%(author)s} 186 | 187 | {\Large \bf 188 | \noindent 189 | Release Information:\\ 190 | } 191 | \noindent {\bf Version Approved -- %(approvaldate)s}\\ 192 | Revision date -- %(releasedate)s\\ 193 | \\ 194 | PDF build date -- %(now)s\\ 195 | GitHub commit -- %(gitsha)s\\ 196 | GitHub repo -- https://github.com/ASPRSorg/LAS 197 | 198 | 199 | \vspace{0.25in} 200 | 201 | {\Large \bf 202 | \noindent Published by:\\ 203 | } 204 | The American Society for Photogrammetry \& Remote Sensing\\ 205 | 425 Barlow Place, Suite 210\\ 206 | Bethesda, Maryland 20814-2160\\ 207 | Voice: 301-493-0290\\ 208 | Fax: 225-408-4422\\ 209 | Web: \underline{www.asprs.org}\\ 210 | 211 | 212 | \noindent 213 | Copyright \copyright~2002-%(thisyear)d American Society for Photogrammetry and Remote Sensing (ASPRS). All rights reserved.\\ 214 | \\ 215 | \\ 216 | {\bf Permission to Use:} The copyright owner hereby consents to unlimited use and 217 | distribution of this document, or parts thereof, \underline{as a specification} provided such use references 218 | ASPRS as the publisher. This consent does not extend to other uses such as general distribution 219 | in any form, including electronic, by any individual or organization whether for advertising or 220 | promotional purposes, for creating new collective works, or for resale. For these and all other 221 | purposes, reproduction of this publication or any part thereof (excluding short quotations for use 222 | in the preparation of reviews and technical and scientific papers) may be made only after 223 | obtaining the specific approval of the publisher.\\ 224 | \\ 225 | Printed in the United States of America. 226 | 227 | \end{titlingpage} 228 | 229 | """ % args 230 | 231 | # Assign 'report' to 'manual' documentclass. Override as needed. 232 | #latex_docclass = { 233 | # 'manual': 'report' 234 | #} 235 | 236 | # Final PDF page setup for LaTeX 237 | latex_elements = { 238 | # The paper size ('letterpaper' or 'a4paper'). 239 | # 240 | 'papersize': 'letterpaper', 241 | 242 | # The font size ('10pt', '11pt' or '12pt'). 243 | # 244 | 'pointsize': '12pt', 245 | 246 | # Other document class options - ensure uniform header/footer 247 | 'classoptions': ',oneside,openany', 248 | 249 | # Additional stuff for the LaTeX preamble. 250 | # 251 | 'preamble': preamble, 252 | 253 | # Latex figure (float) alignment 254 | # 255 | 'figure_align': 'htbp', 256 | 'releasename': ' ',# defined above. blank to prevent duplicate usage in title page 257 | 'maketitle': title, 258 | 259 | # Don't use atendofbody. Use fancyhdr calls in preamble instead (above). 260 | # 'atendofbody': """American Society for Photogrammetry \& Remote Sensing \\ LAS SPECIFICATION \\""" + releasename 261 | } 262 | 263 | latex_toplevel_sectioning='section' 264 | latex_show_urls='footnote' 265 | latex_logo = './_static/asprslogo45.png' 266 | 267 | # Grouping the document tree into LaTeX files. List of tuples 268 | # (source start file, target name, title, 269 | # author, documentclass [howto, manual, or own class]). 270 | latex_documents = [ 271 | (master_doc, 'LAS.tex', u'LAS Specification %s' % myversion, 272 | u'ASPRS', 'manual'), 273 | ] 274 | 275 | 276 | -------------------------------------------------------------------------------- /wiki/LAS_FWF_illustration_constant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASPRSorg/LAS/a2412413990da0768784781df852f2a7d4e711d6/wiki/LAS_FWF_illustration_constant.png -------------------------------------------------------------------------------- /wiki/LAS_FWF_illustration_refracted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASPRSorg/LAS/a2412413990da0768784781df852f2a7d4e711d6/wiki/LAS_FWF_illustration_refracted.png --------------------------------------------------------------------------------