From a9961d66e8cdd2690ec501a76d5ecd1bc7bf0e52 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 11 May 2023 12:06:34 -0700 Subject: [PATCH 001/103] Added Min/Max GPS Time to header block. (#118) Began work on LAS 1.5 introductory sections. (#131) --- source/01_intro.txt | 19 +++++++++++++++++++ source/02.04_header.sub | 34 ++++++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/source/01_intro.txt b/source/01_intro.txt index be0f8fb..3fc1630 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -16,6 +16,25 @@ This document reflects the fourth revision of the LAS format specification since its initial version 1.0 release. +LAS 1.5 Revision History +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Summary of LAS 1.5 revisions (GitHub Issue numbers included when applicable): + +* R00 - Approved Version (XXXXXXX). + + +Comparison of LAS 1.5 to Previous Versions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The additions of LAS 1.5 include: + +* Backward compatibility with LAS 1.1 – LAS 1.4. +* LAS 1.5 mode which supports: + + * Added Max/Min GPS Time fields to header block. + (`I-118 `_) + LAS 1.4 Revision History ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/source/02.04_header.sub b/source/02.04_header.sub index 8328566..c8e7b71 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -87,6 +87,12 @@ Public Header Block +----------------------------------+-------------------------+-----------------+-----------+--------------+ | Number of Points by Return | uint64_t[15] | 255 | 120 bytes | yes | +----------------------------------+-------------------------+-----------------+-----------+--------------+ + | Max GPS Time | double | 375 | 8 bytes | | + +----------------------------------+-------------------------+-----------------+-----------+--------------+ + | Min GPS Time | double | 383 | 8 bytes | | + +----------------------------------+-------------------------+-----------------+-----------+--------------+ + | *LAS 1.5 Header Size* | *391 bytes* | + +------------------------------------------------------------+--------------------------------------------+ .. note:: @@ -197,8 +203,8 @@ file can be uniquely identified, globally. The version number consists of a major and minor field. The major and minor fields combine to form the number that indicates the format number of the -current specification itself. For example, specification number 1.4 would -contain 1 in the major field and 4 in the minor field. It should be noted that +current specification itself. For example, specification number 1.5 would +contain 1 in the major field and 5 in the minor field. It should be noted that the LAS Working Group does not associate any particular meaning to major or minor version number. @@ -257,8 +263,8 @@ The year, expressed as a four digit number, in which the file was created. **Header Size** -The size, in bytes, of the Public Header Block itself. For LAS 1.4 this size is -375 bytes. In the event that the header is extended by a new revision of the +The size, in bytes, of the Public Header Block itself. For LAS 1.5 this size is +391 bytes. In the event that the header is extended by a new revision of the LAS specification through the addition of data at the end of the header, the Header Size field will be updated with the new header size. The Public Header Block may not be extended by users. @@ -344,6 +350,8 @@ The max and min data fields are the actual unscaled extents of the LAS point file data, specified in the coordinate system of the LAS data. If there are no point records in the file, these values must be set to zero. +Any changes to the point records must be re + **Start of Waveform Data Packet Record** This value provides the offset, in bytes, from the beginning of the LAS file to @@ -376,6 +384,13 @@ This field contains the total number of point records in the file. Note that this field must always be correctly populated, regardless of legacy mode intent. +.. note:: + + Any changes to the number of points or their attributes must also be reflected + in the Public Header Block. + + + **Number of Points by Return** These fields contain an array of the total point records per return. The first @@ -384,3 +399,14 @@ contains the total number for return two, and so on up to fifteen returns. Note that these fields must always be correctly populated, regardless of legacy mode intent. +**Max and Min GPS Time** + +The max and min GPS Time fields reflect the highest and lowest valid (non-zero, +generally) GPS Time values stored with the point records in this LAS file. The +GPS Time in this field will be in the same encoding described in the file's +:ref:`Global Encoding ` field. + +If there are no points records in the file, these values must be set to zero. + +For :ref:`Aggregate Model Systems ` or LAS files not utilizing +GPS Time, these values must be set to zero. From 69e413009f89a72fdffddeff9547501d241b218b Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 1 Jun 2023 11:15:25 -0700 Subject: [PATCH 002/103] Removed fragment from WIP that upgraded to a full note. (#118) --- source/02.04_header.sub | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index c8e7b71..013ce36 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -350,8 +350,6 @@ The max and min data fields are the actual unscaled extents of the LAS point file data, specified in the coordinate system of the LAS data. If there are no point records in the file, these values must be set to zero. -Any changes to the point records must be re - **Start of Waveform Data Packet Record** This value provides the offset, in bytes, from the beginning of the LAS file to From 86b9308b0672a64c40c7fffb5c840f581fd7bad5 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 1 Jun 2023 11:20:27 -0700 Subject: [PATCH 003/103] Iterate version number in doc header and title page to 1.5 R20 (for now) --- source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/conf.py b/source/conf.py index df13b97..46245fc 100644 --- a/source/conf.py +++ b/source/conf.py @@ -56,7 +56,7 @@ # The short X.Y version. #version = u'1.4' # Custom non-keyword version tag for header -myversion = u'1.4 - R16 DRAFT' +myversion = u'1.5 - R20 DRAFT' # The full version, including alpha/beta/rc tags. release = u'VERSION ' + myversion releasename = release From 7b2c45258070ba568ab908dae9e40eab889e61b1 Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Thu, 1 Jun 2023 13:25:54 -0500 Subject: [PATCH 004/103] PDF build workflow updates * use `ubuntu-latest` * use v3 of checkout * use `ghcr.io/osgeo/proj-docs` as the container --- .github/workflows/pdf.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index 05a460d..9533115 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -8,13 +8,13 @@ jobs: docs: name: Docs - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest strategy: fail-fast: true - container: osgeo/proj-docs + container: ghcr.io/osgeo/proj-docs steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Print versions run: | python3 --version From aa8be1db0b40d5aeebc2d9bfd7d73134d7457c80 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 1 Jun 2023 11:33:33 -0700 Subject: [PATCH 005/103] Fixed public header note --- source/02.04_header.sub | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index 013ce36..d8f217e 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -385,9 +385,7 @@ intent. .. note:: Any changes to the number of points or their attributes must also be reflected - in the Public Header Block. - - + in the Public Header Block. **Number of Points by Return** From 04a0fec080ec97ee2c76e9aaedbae4abc4e4da7b Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Thu, 1 Jun 2023 13:33:45 -0500 Subject: [PATCH 006/103] use actions/upload-artifact@v3 too --- .github/workflows/pdf.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index 9533115..e2af798 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -28,11 +28,11 @@ jobs: - name: Spelling run: | make spelling - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: PDF path: build/latex/LAS.pdf - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: Misspelled path: build/spelling/output.txt From 8c14cff2056157139c9121bb1a83bd9bed8cac27 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 6 Jul 2023 11:40:55 -0700 Subject: [PATCH 007/103] Clarify Min/Max GPS Time for aggregate model systems --- source/02.04_header.sub | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index d8f217e..e8b1d07 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -402,7 +402,7 @@ generally) GPS Time values stored with the point records in this LAS file. The GPS Time in this field will be in the same encoding described in the file's :ref:`Global Encoding ` field. -If there are no points records in the file, these values must be set to zero. - -For :ref:`Aggregate Model Systems ` or LAS files not utilizing -GPS Time, these values must be set to zero. +These values must be set to zero if there are no point records in the file, +if the file utilizes a point record format not supporting GPS Time, or if +all point records within the file have GPS Time values set to zero, +such as for certain :ref:`Aggregate Model Systems `. From c608d834aab2c5121cc3af08888fe231c6b82afa Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 3 Aug 2023 11:59:36 -0700 Subject: [PATCH 008/103] WIP: Added initial language for Offset GPS Time (#6) --- source/01_intro.txt | 2 ++ source/02.04_header.sub | 39 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/source/01_intro.txt b/source/01_intro.txt index 3fc1630..a1b08d6 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -34,6 +34,8 @@ The additions of LAS 1.5 include: * Added Max/Min GPS Time fields to header block. (`I-118 `_) + * Added Offset GPS Time definition. + (`I-6 `_) LAS 1.4 Revision History ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/source/02.04_header.sub b/source/02.04_header.sub index e8b1d07..09adb56 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -91,7 +91,9 @@ Public Header Block +----------------------------------+-------------------------+-----------------+-----------+--------------+ | Min GPS Time | double | 383 | 8 bytes | | +----------------------------------+-------------------------+-----------------+-----------+--------------+ - | *LAS 1.5 Header Size* | *391 bytes* | + | Time Offset | uint16_t | 391 | 2 bytes | yes | + +----------------------------------+-------------------------+-----------------+-----------+--------------+ + | *LAS 1.5 Header Size* | *393 bytes* | +------------------------------------------------------------+--------------------------------------------+ .. note:: @@ -180,7 +182,24 @@ a value of 1). This bit field is defined as: | | | compatibility (which means the CRS must | | | | be GeoTIFF). | +-------+-----------------------+------------------------------------------+ - | 5:15 | Reserved | Must be set to zero (0). | + | 5 | Reserved | Must be set to zero (0). | + +-------+-----------------------+------------------------------------------+ + | 6 | Time Offset Flag | If set, GPS Time is defined as Offset | + | | | GPS Time. The Offset GPS Time is | + | | | standard GPS Time (satellite GPS Time) | + | | | minus 1 x :math:`10^6` x Time Offset. | + | | | The Time Offset is specified in the LAS | + | | | header. | + | | | The offset moves time to near zero to | + | | | improve floating-point resolution for a | + | | | given time period. | + | | | The origin of standard GPS | + | | | Time is defined as midnight of the | + | | | morning of January 6, 1980. | + | | | The GPS Time Type flag must be set if | + | | | the Time Offset Flag is set. | + +-------+-----------------------+------------------------------------------+ + | 7:15 | Reserved | Must be set to zero (0). | +-------+-----------------------+------------------------------------------+ @@ -264,7 +283,7 @@ The year, expressed as a four digit number, in which the file was created. **Header Size** The size, in bytes, of the Public Header Block itself. For LAS 1.5 this size is -391 bytes. In the event that the header is extended by a new revision of the +393 bytes. In the event that the header is extended by a new revision of the LAS specification through the addition of data at the end of the header, the Header Size field will be updated with the new header size. The Public Header Block may not be extended by users. @@ -406,3 +425,17 @@ These values must be set to zero if there are no point records in the file, if the file utilizes a point record format not supporting GPS Time, or if all point records within the file have GPS Time values set to zero, such as for certain :ref:`Aggregate Model Systems `. + +**Time Offset** + +The time offset field can be used to optimize GPS Time precision for a desired time period. +Offset GPS Time for a point record is equal to standard GPS Time, minus 1e6 * Time Offset. + +For example, Adjusted Standard GPS Time utilizes a Time Offset of 1000 to achieve 100 +nanosecond precision for the years 2007-2015. The LAS wiki provides recommended values +and year ranges that users are encouraged to use to maximize compatibility between datasets. + +This value must be set to zero if there are no point records in the file +(such as for certain :ref:`Aggregate Model Systems `) +if the file utilizes a point record format not supporting GPS Time, or if +the Time Offset Flag is set to zero. From ab1ab4b2baf03ab2e5b86b3f4bcd529a5d631e63 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 7 Sep 2023 11:48:49 -0700 Subject: [PATCH 009/103] Added LAS wiki link. Clarified invalid Offset Time Flag combination. Added missing clause about Aggregate Model Systems. --- source/02.04_header.sub | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index 09adb56..20078af 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -428,14 +428,18 @@ such as for certain :ref:`Aggregate Model Systems `. **Time Offset** -The time offset field can be used to optimize GPS Time precision for a desired time period. -Offset GPS Time for a point record is equal to standard GPS Time, minus 1e6 * Time Offset. +The Time Offset field can be used to optimize GPS Time precision for a desired time period. +Offset GPS Time for a point record is equal to standard GPS Time, minus :math:`10^6` * Time Offset. For example, Adjusted Standard GPS Time utilizes a Time Offset of 1000 to achieve 100 -nanosecond precision for the years 2007-2015. The LAS wiki provides recommended values +nanosecond precision for the years 2007-2015. The LAS wiki provides +`recommended values ` and year ranges that users are encouraged to use to maximize compatibility between datasets. -This value must be set to zero if there are no point records in the file -(such as for certain :ref:`Aggregate Model Systems `) +This value must be set to zero if there are no point records in the file, +if the file is derived from a source not utilizing GPS Time +(such as for certain :ref:`Aggregate Model Systems `), if the file utilizes a point record format not supporting GPS Time, or if -the Time Offset Flag is set to zero. +the Time Offset Flag is unset. + +It is invalid for the GPS Time Type bit to be unset if the Offset Time Flag bit is set. From 9db7ffed1ba498c329ddabbaee1ddb5f165b26e1 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 7 Sep 2023 11:49:12 -0700 Subject: [PATCH 010/103] Added Offset Time and GPS Time Encoding table to GPS Time definition. --- source/02.06_point.sub | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/source/02.06_point.sub b/source/02.06_point.sub index b16d94e..c0411d5 100644 --- a/source/02.06_point.sub +++ b/source/02.06_point.sub @@ -350,8 +350,24 @@ addition of GPS Time. **GPS Time** The GPS Time is the double floating point time tag value at which the point was -observed. It is GPS Week Time if the :ref:`Global Encoding ` -low bit is clear and Adjusted Standard GPS Time if the bit is set. +observed. GPS Time encoding is specified by the :ref:`Global Encoding ` +bit field. The time value encoding is defined as GPS Week Time if the GPS Time Type bit is unset, +Adjusted Standard GPS Time if the bit is set, +and Offset GPS Time if the Time Offset Flag bit is set. + +.. table:: GPS Time Encoding + + +---------------------+------------------------+------------------------------+ + | GPS Time Type bit | Time Offset Flag bit | Timestamp Encoding | + +=====================+========================+==============================+ + | Unset | Unset | GPS Week Time | + +---------------------+------------------------+------------------------------+ + | Set | Unset | Adjusted Standard GPS Time | + +---------------------+------------------------+------------------------------+ + | Unset | Set | Invalid | + +---------------------+------------------------+------------------------------+ + | Set | Set | Offset GPS Time | + +---------------------+------------------------+------------------------------+ It is intended that each return of a given pulse would have an identical GPS Time. In the example of pulsed LiDAR systems, the GPS Time would be the time at From fedad48c9c33259d5b2aadf574dc58fef7ad3ed3 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 7 Sep 2023 11:52:41 -0700 Subject: [PATCH 011/103] Fixed wiki hyperlink. --- source/02.04_header.sub | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index 20078af..0f13e97 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -433,7 +433,7 @@ Offset GPS Time for a point record is equal to standard GPS Time, minus :math:`1 For example, Adjusted Standard GPS Time utilizes a Time Offset of 1000 to achieve 100 nanosecond precision for the years 2007-2015. The LAS wiki provides -`recommended values ` +`recommended values `_ and year ranges that users are encouraged to use to maximize compatibility between datasets. This value must be set to zero if there are no point records in the file, From f0809783dcb06ae5dbe1731124882ef38f10316e Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 7 Sep 2023 12:01:42 -0700 Subject: [PATCH 012/103] Clarified total offset vs Time Offset for Adj Std GPS Time example. --- source/02.04_header.sub | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index 0f13e97..402211d 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -431,8 +431,8 @@ such as for certain :ref:`Aggregate Model Systems `. The Time Offset field can be used to optimize GPS Time precision for a desired time period. Offset GPS Time for a point record is equal to standard GPS Time, minus :math:`10^6` * Time Offset. -For example, Adjusted Standard GPS Time utilizes a Time Offset of 1000 to achieve 100 -nanosecond precision for the years 2007-2015. The LAS wiki provides +For example, Adjusted Standard GPS Time uses a total offset of 1 billion, or :math:`10^9`, which is equivalent to a Time Offset of 1000. +This achieves 100 nanosecond precision for the years 2007-2015. The LAS wiki provides `recommended values `_ and year ranges that users are encouraged to use to maximize compatibility between datasets. From a331eee26282decbf0b12781bfb94b170a17117d Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 7 Sep 2023 12:05:51 -0700 Subject: [PATCH 013/103] Further clarified the Adj Std GPS Time example. --- source/02.04_header.sub | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index 402211d..555c5a7 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -431,7 +431,7 @@ such as for certain :ref:`Aggregate Model Systems `. The Time Offset field can be used to optimize GPS Time precision for a desired time period. Offset GPS Time for a point record is equal to standard GPS Time, minus :math:`10^6` * Time Offset. -For example, Adjusted Standard GPS Time uses a total offset of 1 billion, or :math:`10^9`, which is equivalent to a Time Offset of 1000. +For example, Adjusted Standard GPS Time uses a total offset of 1 billion (:math:`10^9`) seconds, which would be specified by a Time Offset of 1000. This achieves 100 nanosecond precision for the years 2007-2015. The LAS wiki provides `recommended values `_ and year ranges that users are encouraged to use to maximize compatibility between datasets. From 035e2a40103cc0b29bacdee29ba378f9d8e5e1b9 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 5 Oct 2023 11:21:13 -0700 Subject: [PATCH 014/103] Clarified flags explanation for PDRF GPS Time description. --- source/02.06_point.sub | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/02.06_point.sub b/source/02.06_point.sub index c0411d5..a15cf78 100644 --- a/source/02.06_point.sub +++ b/source/02.06_point.sub @@ -352,7 +352,7 @@ addition of GPS Time. The GPS Time is the double floating point time tag value at which the point was observed. GPS Time encoding is specified by the :ref:`Global Encoding ` bit field. The time value encoding is defined as GPS Week Time if the GPS Time Type bit is unset, -Adjusted Standard GPS Time if the bit is set, +Adjusted Standard GPS Time if the GPS Time Type bit is set, and Offset GPS Time if the Time Offset Flag bit is set. .. table:: GPS Time Encoding @@ -364,7 +364,7 @@ and Offset GPS Time if the Time Offset Flag bit is set. +---------------------+------------------------+------------------------------+ | Set | Unset | Adjusted Standard GPS Time | +---------------------+------------------------+------------------------------+ - | Unset | Set | Invalid | + | Unset | Set | *INVALID* | +---------------------+------------------------+------------------------------+ | Set | Set | Offset GPS Time | +---------------------+------------------------+------------------------------+ From 469c5118e675f961e30d086375aaad44d09ab892 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 5 Oct 2023 12:00:54 -0700 Subject: [PATCH 015/103] Initial commit for #128. Began moving fields to PDRF6-10, still WIP. --- source/02.06_point.sub | 389 ++++++++++++++++++----------------------- 1 file changed, 173 insertions(+), 216 deletions(-) diff --git a/source/02.06_point.sub b/source/02.06_point.sub index a15cf78..4e94dbf 100644 --- a/source/02.06_point.sub +++ b/source/02.06_point.sub @@ -86,79 +86,6 @@ Data Record Formats 0 to 5. required for a PDRF. These "extra bytes" follow the standard Point Record fields and are described in the :ref:`extrabytes_vlr_label` VLR section. -**X, Y, and Z** - -The X, Y, and Z values are stored as int32_t integers. The X, Y, and Z values are -used in conjunction with the scale values and the offset values to determine -the coordinate for each point as described in the :ref:`headerblock_label` section. - -**Intensity** - -The Intensity value is the integer representation of the pulse return -magnitude. This value is optional and system specific. However, it should -always be included if available. If Intensity is not included, this value must -be set to zero. - -Intensity, when included, is always normalized -to a 16 bit, unsigned value by multiplying the value by 65,536/(intensity -dynamic range of the sensor). For example, if the dynamic range of the sensor -is 10 bits, the scaling value would be (65,536/1,024). This normalization is required to -ensure that data from different sensors can be correctly merged. - -For systems based on technology other than pulsed lasers, Intensity values may -represent estimated relative reflectivity, rather than a direct measurement of -pulse return magnitude, and may be derived from multiple sources. - -.. note:: - - Please note that the following four fields (Return Number, Number of Returns, - Scan Direction Flag, and Edge of Flight Line) are bit fields within a single - byte. - -**Return Number** - -The Return Number is the pulse return number for a given output pulse. A given -output laser pulse can have many returns, and they must be marked in sequence -of return. The first return will have a Return Number of one, the second a -Return Number of two, and so on up to five returns. The Return Number must -be between 1 and the Number of Returns, inclusive. - -For systems unable to record multiple returns, the Return Number should be -set to one, unless it is synthetically derived and the Synthetic Return Number -Global Encoding bit is set. - -**Number of Returns (Given Pulse)** - -The Number of Returns is the total number of returns for a given pulse. For -example, a laser data point may be return two (Return Number) within a total -number of up to five returns. - -For systems unable to record multiple returns, the Number of Returns should be -set to one, unless it is synthetically derived and the Synthetic Return Number -Global Encoding bit is set. - -**Scan Direction Flag** - -The Scan Direction Flag denotes the direction in which the scanner mirror was -traveling at the time of the output pulse. A bit value of 1 is a positive scan -direction, and a bit value of 0 is a negative scan direction (where positive -scan direction is a scan moving from the left side of the in-track direction to -the right side and negative the opposite). - -For :ref:`Aggregate Model Systems ` or if the measurement system -does not include a rotational component, the Scan Direction Flag should be set -to zero. - -**Edge of Flight Line Flag** - -The Edge of Flight Line Flag has a value of 1 only when the point is at the -end of a scan. It is the last point on a given scan line before it changes -direction or the mirror facet changes. - -Note that this field has no meaning for :ref:`Aggregate Model Systems ` -or 360 degree Field of View scanners (e.g., terrestrial lidar scanners). In -these cases, the Edge of Flight Line Flag should be set to zero. - **Classification** This field represents the "class" attributes of a point. The format for classification @@ -283,22 +210,6 @@ of flight. For :ref:`Aggregate Model Systems `, the Scan Angle Rank should be set to zero unless assigned from a component measurement. -**User Data** - -This field may be used at the user's discretion. - -**Point Source ID** - -This value indicates the source from which this point originated. A source is -typically defined as a grouping of temporally consistent data, such as a -flight line or sortie number for airborne systems, a route number for mobile -systems, or a setup identifier for static systems. Valid values for this field -are 1 to 65,535 inclusive. Zero is reserved as a convenience to system -implementers. - -For :ref:`Aggregate Model Systems `, the Point Source ID should -be set to one (1) unless assigned from a component measurement. - .. raw:: latex \newpage @@ -347,36 +258,6 @@ addition of GPS Time. | *Minimum PDRF Size* | *28 bytes* | +------------------------------------------------------------+------------------------------------+ -**GPS Time** - -The GPS Time is the double floating point time tag value at which the point was -observed. GPS Time encoding is specified by the :ref:`Global Encoding ` -bit field. The time value encoding is defined as GPS Week Time if the GPS Time Type bit is unset, -Adjusted Standard GPS Time if the GPS Time Type bit is set, -and Offset GPS Time if the Time Offset Flag bit is set. - -.. table:: GPS Time Encoding - - +---------------------+------------------------+------------------------------+ - | GPS Time Type bit | Time Offset Flag bit | Timestamp Encoding | - +=====================+========================+==============================+ - | Unset | Unset | GPS Week Time | - +---------------------+------------------------+------------------------------+ - | Set | Unset | Adjusted Standard GPS Time | - +---------------------+------------------------+------------------------------+ - | Unset | Set | *INVALID* | - +---------------------+------------------------+------------------------------+ - | Set | Set | Offset GPS Time | - +---------------------+------------------------+------------------------------+ - -It is intended that each return of a given pulse would have an identical GPS -Time. In the example of pulsed LiDAR systems, the GPS Time would be the time at -which the originating pulse was emitted, not the time at which each return was -recorded. - -For :ref:`Aggregate Model Systems `, the GPS Time should be set -to zero unless assigned from a component measurement. - .. raw:: latex @@ -430,17 +311,6 @@ point using ancillary data, typically from a camera. | *Minimum PDRF Size* | *26 bytes* | +------------------------------------------------------------+------------------------------------+ -**Red, Green, and Blue** - -The Red, Green, and Blue image channel values associated with this point. - -.. note:: - - The Red, Green, and Blue values should always be normalized to 16 bit values. - For example, when encoding an 8 bit per channel pixel, multiply each - channel value by 256 prior to storage in these fields. This normalization - allows color values from different camera bit depths to be accurately - merged. .. raw:: latex @@ -555,89 +425,6 @@ Point Data Record Format 4 adds Wave Packets to Point Data Record Format 1. | *Minimum PDRF Size* | *57 bytes* | +------------------------------------------------------------+------------------------------------+ -**Wave Packet Descriptor Index** - -This value plus **99** is the Record ID of the :ref:`fwf_descriptor_label` and -indicates the User Defined Record that describes the waveform packet associated -with this Point Record. Up to 255 different User Defined Records which describe -the waveform packet are supported. A value of zero indicates that there is no -waveform data associated with this Point Record. - -**Byte Offset to Waveform Data** - -The waveform packet data are stored in the LAS file in an Extended Variable -Length Record or in an auxiliary \*.wdp file. The Byte Offset represents the -location of the start of this Point Record’s waveform packet within the waveform -data variable length record (or external file) relative to the beginning of the -:ref:`fwf_packets_label` header. The absolute location of the beginning of this -waveform packet relative to the beginning of the file is given by: - - **Start of Waveform Data Packet Record** + **Byte Offset to Waveform Data** - - for waveform packets stored within the LAS file and - - **Byte Offset to Waveform Data** - - for data stored in an auxiliary \*.wdp file. - -**Waveform Packet Size in Bytes** - -The size, in bytes, of the waveform packet associated with this return. Note -that each waveform can be of a different size (even those with the same -Waveform Packet Descriptor index) due to packet compression. Also note that -waveform packets can be located only via the Byte Offset to Waveform Packet -Data value since there is no requirement that records be stored sequentially. - - -**Return Point Waveform Location** - -The temporal offset in picoseconds (:math:`10^{-12}`) from the arbitrary "anchor -point" to the location within the waveform packet for this Point Record. - - -**Parametric dx, dy, dz** - -These parameters define a parametric line equation for extrapolating points -along the associated waveform. The position along the wave is given by: - -.. math:: - :nowrap: - - \begin {eqnarray} - X &= X_0 + t * dx \\ - Y &= Y_0 + t * dy \\ - Z &= Z_0 + t * dz - \end {eqnarray} - -where :math:`(X, Y, Z)` is the spatial position of a derived point, -:math:`(X_0, Y_0, Z_0)` is the position of the "anchor" point, and :math:`t` is -the time, in picoseconds, relative to the anchor point. - -The anchor point is an arbitrary location at the origin of the associated -waveform -- i.e. :math:`t = 0` at the anchor point -- with coordinates defined -by: - -.. math:: - :nowrap: - - \begin {eqnarray} - X_0 &= X_P + L * dx \\ - Y_0 &= Y_P + L * dy \\ - Z_0 &= Z_P + L * dz - \end {eqnarray} - -where :math:`(X_P, Y_P, Z_P)` is this Point Record's transformed position (as a -double) and :math:`L` is this Point Record's Return Point Waveform Location. - -The units of X, Y and Z are the units of the coordinate systems of the LAS data. -If the coordinate system is geographic, the horizontal units are decimal degrees -and the vertical units are meters. - -.. note:: - - Users seeking further clarity regarding LAS waveform encoding are encouraged - to learn more on the official LAS wiki: https://github.com/ASPRSorg/LAS/wiki - .. raw:: latex @@ -759,11 +546,33 @@ instead of 8), and the GPS time is mandatory. | *Minimum PDRF Size* | *30 bytes* | +------------------------------------------------------------+------------------------------------+ +**X, Y, and Z** + +The X, Y, and Z values are stored as int32_t integers. The X, Y, and Z values are +used in conjunction with the scale values and the offset values to determine +the coordinate for each point as described in the :ref:`headerblock_label` section. + +**Intensity** + +The Intensity value is the integer representation of the pulse return +magnitude. This value is optional and system specific. However, it should +always be included if available. If Intensity is not included, this value must +be set to zero. + +Intensity, when included, is always normalized +to a 16 bit, unsigned value by multiplying the value by 65,536/(intensity +dynamic range of the sensor). For example, if the dynamic range of the sensor +is 10 bits, the scaling value would be (65,536/1,024). This normalization is required to +ensure that data from different sensors can be correctly merged. + +For systems based on technology other than pulsed lasers, Intensity values may +represent estimated relative reflectivity, rather than a direct measurement of +pulse return magnitude, and may be derived from multiple sources. + .. note:: - The following six fields (Return Number, Number of Returns, Classification - Flags, Scanner Channel, Scan Direction Flag, and Edge of Flight Line) are bit fields, encoded - into two bytes. + The following two fields (Return Number and Number of Returns) are bit fields, encoded + into one byte. **Return Number** @@ -787,6 +596,12 @@ For systems unable to record multiple returns, the Number of Returns should be set to one, unless it is synthetically derived and the Synthetic Return Number Global Encoding bit is set. +.. note:: + + The following four fields (Classification Flags, Scanner Channel, Scan Direction Flag, + and Edge of Flight Line) are bit fields, encoded + into one byte. + **Classification Flags** Classification flags are used to indicate special characteristics associated @@ -944,6 +759,10 @@ Classification must adhere to the following standard: structures could be remapped from class 0 to class 1. +**User Data** + +This field may be used at the user's discretion. + **Scan Angle** The Scan Angle is an int16_t that represents the rotational position of the @@ -958,6 +777,48 @@ the negative direction is -30,000 which is also directly up. For :ref:`Aggregate Model Systems `, the Scan Angle should be set to zero unless assigned from a component measurement. +**Point Source ID** + +This value indicates the source from which this point originated. A source is +typically defined as a grouping of temporally consistent data, such as a +flight line or sortie number for airborne systems, a route number for mobile +systems, or a setup identifier for static systems. Valid values for this field +are 1 to 65,535 inclusive. Zero is reserved as a convenience to system +implementers. + +For :ref:`Aggregate Model Systems `, the Point Source ID should +be set to one (1) unless assigned from a component measurement. + +**GPS Time** + +The GPS Time is the double floating point time tag value at which the point was +observed. GPS Time encoding is specified by the :ref:`Global Encoding ` +bit field. The time value encoding is defined as GPS Week Time if the GPS Time Type bit is unset, +Adjusted Standard GPS Time if the GPS Time Type bit is set, +and Offset GPS Time if the Time Offset Flag bit is set. + +.. table:: GPS Time Encoding + + +---------------------+------------------------+------------------------------+ + | GPS Time Type bit | Time Offset Flag bit | Timestamp Encoding | + +=====================+========================+==============================+ + | Unset | Unset | GPS Week Time | + +---------------------+------------------------+------------------------------+ + | Set | Unset | Adjusted Standard GPS Time | + +---------------------+------------------------+------------------------------+ + | Unset | Set | *INVALID* | + +---------------------+------------------------+------------------------------+ + | Set | Set | Offset GPS Time | + +---------------------+------------------------+------------------------------+ + +It is intended that each return of a given pulse would have an identical GPS +Time. In the example of pulsed LiDAR systems, the GPS Time would be the time at +which the originating pulse was emitted, not the time at which each return was +recorded. + +For :ref:`Aggregate Model Systems `, the GPS Time should be set +to zero unless assigned from a component measurement. + .. raw:: latex @@ -1016,6 +877,18 @@ point using ancillary data, typically from a camera. | *Minimum PDRF Size* | *36 bytes* | +------------------------------------------------------------+------------------------------------+ +**Red, Green, and Blue** + +The Red, Green, and Blue image channel values associated with this point. + +.. note:: + + The Red, Green, and Blue values should always be normalized to 16 bit values. + For example, when encoding an 8 bit per channel pixel, multiply each + channel value by 256 prior to storage in these fields. This normalization + allows color values from different camera bit depths to be accurately + merged. + .. raw:: latex \newpage @@ -1149,6 +1022,90 @@ Point Data Record Format 9 adds Wave Packets to Point Data Record Format 6. | *Minimum PDRF Size* | *59 bytes* | +------------------------------------------------------------+------------------------------------+ +**Wave Packet Descriptor Index** + +This value plus **99** is the Record ID of the :ref:`fwf_descriptor_label` and +indicates the User Defined Record that describes the waveform packet associated +with this Point Record. Up to 255 different User Defined Records which describe +the waveform packet are supported. A value of zero indicates that there is no +waveform data associated with this Point Record. + +**Byte Offset to Waveform Data** + +The waveform packet data are stored in the LAS file in an Extended Variable +Length Record or in an auxiliary \*.wdp file. The Byte Offset represents the +location of the start of this Point Record’s waveform packet within the waveform +data variable length record (or external file) relative to the beginning of the +:ref:`fwf_packets_label` header. The absolute location of the beginning of this +waveform packet relative to the beginning of the file is given by: + + **Start of Waveform Data Packet Record** + **Byte Offset to Waveform Data** + + for waveform packets stored within the LAS file and + + **Byte Offset to Waveform Data** + + for data stored in an auxiliary \*.wdp file. + +**Waveform Packet Size in Bytes** + +The size, in bytes, of the waveform packet associated with this return. Note +that each waveform can be of a different size (even those with the same +Waveform Packet Descriptor index) due to packet compression. Also note that +waveform packets can be located only via the Byte Offset to Waveform Packet +Data value since there is no requirement that records be stored sequentially. + + +**Return Point Waveform Location** + +The temporal offset in picoseconds (:math:`10^{-12}`) from the arbitrary "anchor +point" to the location within the waveform packet for this Point Record. + + +**Parametric dx, dy, dz** + +These parameters define a parametric line equation for extrapolating points +along the associated waveform. The position along the wave is given by: + +.. math:: + :nowrap: + + \begin {eqnarray} + X &= X_0 + t * dx \\ + Y &= Y_0 + t * dy \\ + Z &= Z_0 + t * dz + \end {eqnarray} + +where :math:`(X, Y, Z)` is the spatial position of a derived point, +:math:`(X_0, Y_0, Z_0)` is the position of the "anchor" point, and :math:`t` is +the time, in picoseconds, relative to the anchor point. + +The anchor point is an arbitrary location at the origin of the associated +waveform -- i.e. :math:`t = 0` at the anchor point -- with coordinates defined +by: + +.. math:: + :nowrap: + + \begin {eqnarray} + X_0 &= X_P + L * dx \\ + Y_0 &= Y_P + L * dy \\ + Z_0 &= Z_P + L * dz + \end {eqnarray} + +where :math:`(X_P, Y_P, Z_P)` is this Point Record's transformed position (as a +double) and :math:`L` is this Point Record's Return Point Waveform Location. + +The units of X, Y and Z are the units of the coordinate systems of the LAS data. +If the coordinate system is geographic, the horizontal units are decimal degrees +and the vertical units are meters. + +.. note:: + + Users seeking further clarity regarding LAS waveform encoding are encouraged + to learn more on the official LAS wiki: https://github.com/ASPRSorg/LAS/wiki + + .. raw:: latex \newpage From c72eb527c4cf3576576efe68aa65910e950e7983 Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Thu, 4 Jan 2024 11:26:22 -0600 Subject: [PATCH 016/103] WIP updates for WKT definitions --- source/03_required_vlrs.txt | 173 ++++++++++-------------------------- 1 file changed, 47 insertions(+), 126 deletions(-) diff --git a/source/03_required_vlrs.txt b/source/03_required_vlrs.txt index e3ae65c..9b7d1b8 100644 --- a/source/03_required_vlrs.txt +++ b/source/03_required_vlrs.txt @@ -4,37 +4,48 @@ Coordinate Reference System VLRs (Required) -------------------------------------------------------------------------------- -LAS 1.4 defines Variable Length Records (VLRs) and Extended Variable Length +LAS 1.5 defines Variable Length Records (VLRs) and Extended Variable Length Records (EVLRs). Coordinate Reference System (CRS) VLRs are defined in this section, while other VLRs and EVLRs are defined in the following two sections. Coordinate Reference System Information ................................................................................ -The Coordinate Reference System (CRS) information for the point data is -required for all data. The CRS information will be placed in Variable Length -Records or Extended Variable Length Records (note that if the writer wishes to -maintain legacy compatibility, then GeoTIFF in VLRs must be used). The CRS is -represented by either GeoTIFF or Well Known Text (WKT) as indicated by the WKT -:ref:`Global Encoding ` bit. Point Record Formats 0-5 can -use either GeoTIFF or WKT, but not both simultaneously. Point Data Record -Formats 6-10 must use WKT. +The Coordinate Reference System (CRS) information for the point data is required +for all data. The CRS information will be placed in Variable Length Records or +Extended Variable Length Records. The CRS is represented always `OGC Well Known +Text `__ (WKT) without regard to the +:ref:`Global Encoding ` bit. + +.. note:: + + LAS 1.4 supported dual definition of coordinate system depending on the + PDRF. PDRFs 0-5 were able to have their coordinate systems defined by + GeoTIFF keys but they were voided for LAS 1.5, and it is no longer possible + to define coordinate system information with GeoTIFF keys in LAS 1.5. Georeferencing Information Using WKT ................................................................................ -For definition of WKT, we refer to Open Geospatial Consortium (OGC) -specification "OpenGIS coordinate transformation service implementation -specification" revision 1.00 released 12 January 2001, section 7 (`"Coordinate -Transformation Service Spec" `_). -As there are a few dialects of WKT, please note that LAS is not using the "ESRI -WKT" dialect, which does not include TOWGS84 and Authority nodes. - -WKT georeferencing information can be specified in two optional variable length -records, the OGC math transform WKT record and the OGC coordinate system WKT -record, as follows. Note that the math transform WKT record is added for -completeness, and a coordinate system WKT *may* or *may not* require a math -transform WKT record (a parameterized math transform definition). +LAS 1.5 defers its CRS definition to The Open Geospatial Consortium (OGC) +specification "Well-known text representation of coordinate reference systems", +located at https://www.ogc.org/standard/wkt-crs/, which provides a comprehensive +industry standard for describing coordinate systems. + +*Any published version* of OGC WKT is a valid definition for LAS 1.5. Multiple +*versions OGC has published multiple versions of WKT, including `18-010 +`__ (commonly called "WKT2" or +"WKTv2") and `12-063r5 `__ +(commonly called "WKT1" and the formally ratified variant of WKT that was used +for LAS 1.4). If OGC were to publish a new WKT specification, it would +also be a valid definition for LAS 1.5. + +WKT georeferencing information must be specified in the +OGC CRS WKT record, as follows. Two optional VLRs define supporting +information for CRS defintions – the Math Transform Record and the Epoch Record. +A CRS WKT definition *may* or *may not* require a math transform WKT record (a +parameterized math transform definition). A CRS WKT definition *may* require an +epoch record to precisely define the time point at which the CRS definition refers. OGC Math Transform WKT Record ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -72,119 +83,29 @@ following notes: * The OGC Coordinate System WKT VLR data shall be considered C locale-based, and no localization of the numeric strings within the WKT should be performed. -Georeferencing Information Using GeoTIFF -................................................................................ - -The GeoTIFF specification is defined by http://geotiff.osgeo.org/. - -GeoTIFF georeferencing for the LAS formats uses the same mechanism that was -developed for the GeoTIFF standard. The variable length header records section -may contain the same data that would be contained in the GeoTIFF key tags of a -TIFF file. Since LAS is not a raster format and each point contains its own -absolute location information, only 3 of the 6 GeoTIFF tags are necessary when -using GeoTIFF records instead of WKT records. The ModelTiePointTag (33922), -ModelPixelScaleTag (33550), and ModelTransformationTag (34264) records can be -excluded. The GeoKeyDirectoryTag (34735), GeoDoubleParamsTag (34736), and -GeoAsciiParamsTag (34737) records are used. - -Only the GeoKeyDirectoryTag record is required when using GeoTIFF records -instead of WKT records. The GeoDoubleParamsTag and GeoAsciiParamsTag records -may or may not be present, depending on the content of the GeoKeyDirectoryTag -record. - -GeoKeyDirectoryTag Record -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -+-----------------+-----------------------------+ -| User ID | LASF_Projection | -+-----------------+-----------------------------+ -| Record ID | 34735 | -+-----------------+-----------------------------+ - -This record contains the key values that define the coordinate system. A -complete description can be found in the GeoTIFF format specification. Here is -a summary from a programmatic point of view for someone interested in -implementation. - -The GeoKeyDirectoryTag is defined as an array of uint16_t values. -Programmatically, the data can be structured as follows: - -:: - - struct sGeoKeys { - uint16_t wKeyDirectoryVersion; - uint16_t wKeyRevision; - uint16_t wMinorRevision; - uint16_t wNumberOfKeys; - - struct sKeyEntry { - uint16_t wKeyID; - uint16_t wTIFFTagLocation; - uint16_t wCount; - uint16_t wValue_Offset; - } pKey[1]; - }; - -...where... - -:: - - wKeyDirectoryVersion = 1; // Always - wKeyRevision = 1; // Always - wMinorRevision = 0; // Always - wNumberOfKeys // Number of sets of 4 uint16_t integers to follow - -.. tabularcolumns:: |p{4.5cm}|p{12.0cm}| - -.. table:: GeoKey Four uint16_t Integers - - +---------------------------------+----------------------------------------------------------+ - | Name | Definition | - +=================================+==========================================================+ - | ``wKeyID`` | Defined key ID for each piece of GeoTIFF data. IDs | - | | contained in the GeoTIFF specification. | - +---------------------------------+----------------------------------------------------------+ - | ``wTIFFTagLocation`` | Indicates where the data for this key is located: | - | | | - | | * 0 means data is in the ``wValue_Offset`` field as an | - | | uint16_t. | - | | * 34736 means the data is located at index | - | | ``wValue_Offset`` of the GeoDoubleParamsTag record. | - | | * 34737 means the data is located at index | - | | ``wValue_Offset`` of the GeoAsciiParamsTag record. | - +---------------------------------+----------------------------------------------------------+ - | ``wCount`` | Number of characters in string for values of | - | | GeoAsciiParamsTag, otherwise is 1. | - +---------------------------------+----------------------------------------------------------+ - | ``wValue_Offset`` | Contents vary depending on value for wTIFFTagLocation | - | | above. | - +---------------------------------+----------------------------------------------------------+ - - - -GeoDoubleParamsTag Record (Optional) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -+-----------------+-----------------------------+ -| User ID | LASF_Projection | -+-----------------+-----------------------------+ -| Record ID | 34736 | -+-----------------+-----------------------------+ +.. note:: -This record is simply an array of doubles that contain values referenced by tag -sets in the GeoKeyDirectoryTag record. + *Any published version* of OGC WKT is a valid definition for LAS 1.5. Multiple + *versions OGC has published multiple versions of WKT, including `18-010 + `__ (commonly called "WKT2" or + "WKTv2") and `12-063r5 `__ -GeoAsciiParamsTag Record (Optional) +Epoch Record ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-----------------+-----------------------------+ | User ID | LASF_Projection | +-----------------+-----------------------------+ -| Record ID | 34737 | +| Record ID | 2113 | +-----------------+-----------------------------+ -This record is simply an array of ASCII data. It contains many strings separated -by null terminator characters, which are referenced by position from data in the -GeoKeyDirectoryTag record. +The date at which coordinates in the LAS file are referenced to a dynamic +coordinate reference system is expressed as a decimal year in the Gregorian +calendar stored as a double. For example: 2017-03-25 in the +Gregorian calendar would be an epoch value of 2017.23. +.. note:: + `GDAL `__ provides excellent documentation on coordinate + epochs for coordinate reference systems and their usages in raster data formats + like GeoTIFF at https://gdal.org/user/coordinate_epoch.html \ No newline at end of file From e0377c98449e35a6836bd382ddeda760cd75cc28 Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Thu, 4 Jan 2024 11:34:30 -0600 Subject: [PATCH 017/103] try to get RTD operating --- .readthedocs.yaml | 27 +++++++++++++++++++++++++++ source/requirements.txt | 1 + 2 files changed, 28 insertions(+) create mode 100644 .readthedocs.yaml create mode 100644 source/requirements.txt diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..cf9f32e --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,27 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +build: + os: "ubuntu-22.04" + tools: + python: "3.11" + jobs: + pre_build: + - doxygen ./doc/doxygen/doxygen.conf 1> /dev/null + apt_packages: + - graphviz + +sphinx: + builder: html + configuration: doc/conf.py + fail_on_warning: true + +python: + install: + - requirements: doc/requirements.txt + +formats: all diff --git a/source/requirements.txt b/source/requirements.txt new file mode 100644 index 0000000..6a9445e --- /dev/null +++ b/source/requirements.txt @@ -0,0 +1 @@ +sphinxcontrib-spelling From 5f24ebe455b61df5ae1af51d6b15d39cbba77a06 Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Thu, 4 Jan 2024 11:40:40 -0600 Subject: [PATCH 018/103] bad path --- .readthedocs.yaml | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index cf9f32e..f2ad896 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -9,19 +9,14 @@ build: os: "ubuntu-22.04" tools: python: "3.11" - jobs: - pre_build: - - doxygen ./doc/doxygen/doxygen.conf 1> /dev/null - apt_packages: - - graphviz sphinx: builder: html - configuration: doc/conf.py - fail_on_warning: true + configuration: source/conf.py + fail_on_warning: false python: install: - - requirements: doc/requirements.txt + - requirements: source/requirements.txt formats: all From c97aaf68669f3e5b339ae055f2ada485858b47fc Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Thu, 4 Jan 2024 11:53:32 -0600 Subject: [PATCH 019/103] return RTD sha --- source/conf.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/conf.py b/source/conf.py index 46245fc..8a30de6 100644 --- a/source/conf.py +++ b/source/conf.py @@ -71,7 +71,11 @@ def get_git_revision_short_hash(): import os - return os.environ['GITHUB_SHA'] + if 'GITHUB_SHA' in os.environ: + return os.environ['GITHUB_SHA'] + elif 'READTHEDOCS_GIT_COMMIT_HASH': + return os.environ['READTHEDOCS_GIT_COMMIT_HASH'] + return '' gitsha = get_git_revision_short_hash() # The language for content autogenerated by Sphinx. Refer to documentation From bfcfe38d85f8d589d25c8e2b5d57ce22fbcf6a90 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 4 Jan 2024 11:47:53 -0800 Subject: [PATCH 020/103] Update Global Encoding byte to invalidate geotiff --- source/02.04_header.sub | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index 555c5a7..b5117ad 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -176,15 +176,12 @@ a value of 1). This bit field is defined as: | | | multiple returns. | +-------+-----------------------+------------------------------------------+ | 4 | WKT | If set, the Coordinate Reference System | - | | | (CRS) is WKT. If not set, the CRS is | - | | | GeoTIFF. It should not be set if the | - | | | file writer wishes to ensure legacy | - | | | compatibility (which means the CRS must | - | | | be GeoTIFF). | + | | | (CRS) is WKT. This bit must be set. | + | | | GeoTIFF CRS definitions are not | + | | | supported for legacy | + | | | compatibility beginning with LAS 1.5. | +-------+-----------------------+------------------------------------------+ - | 5 | Reserved | Must be set to zero (0). | - +-------+-----------------------+------------------------------------------+ - | 6 | Time Offset Flag | If set, GPS Time is defined as Offset | + | 5 | Time Offset Flag | If set, GPS Time is defined as Offset | | | | GPS Time. The Offset GPS Time is | | | | standard GPS Time (satellite GPS Time) | | | | minus 1 x :math:`10^6` x Time Offset. | @@ -199,7 +196,7 @@ a value of 1). This bit field is defined as: | | | The GPS Time Type flag must be set if | | | | the Time Offset Flag is set. | +-------+-----------------------+------------------------------------------+ - | 7:15 | Reserved | Must be set to zero (0). | + | 6:15 | Reserved | Must be set to zero (0). | +-------+-----------------------+------------------------------------------+ From 955c8cbbde0130b85f29760146e361f2ce93c6cd Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 4 Jan 2024 15:08:35 -0800 Subject: [PATCH 021/103] Added hyperlinks for GPS Time and Time Offset. --- source/02.04_header.sub | 36 +++++++++++++++++++++++++----------- source/02.06_point.sub | 2 ++ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index 555c5a7..62f83ac 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -138,11 +138,17 @@ a value of 1). This bit field is defined as: +-------+-----------------------+------------------------------------------+ | Bits | Field Name | Description | +=======+=======================+==========================================+ - | 0 | GPS Time Type | The meaning of GPS Time in the point | - | | | records. If this bit is not set, the GPS | - | | | time in the point record fields is GPS | + | 0 | GPS Time Type | Used in combination with Time Offset | + | | | Flag to indicate the meaning of | + | | | :ref:`GPS Time ` in the | + | | | point records. | + | | | | + | | | If neither bit is set, the GPS | + | | | Time in the point record fields is GPS | | | | Week Time (the same as versions 1.0 | - | | | through 1.2 of LAS). Otherwise, if this | + | | | through 1.2 of LAS). | + | | | | + | | | Otherwise, if this | | | | bit is set, the GPS Time is standard GPS | | | | Time (satellite GPS Time) minus | | | | 1 x :math:`10^9` (Adjusted Standard GPS | @@ -184,12 +190,18 @@ a value of 1). This bit field is defined as: +-------+-----------------------+------------------------------------------+ | 5 | Reserved | Must be set to zero (0). | +-------+-----------------------+------------------------------------------+ - | 6 | Time Offset Flag | If set, GPS Time is defined as Offset | - | | | GPS Time. The Offset GPS Time is | - | | | standard GPS Time (satellite GPS Time) | - | | | minus 1 x :math:`10^6` x Time Offset. | - | | | The Time Offset is specified in the LAS | - | | | header. | + | 6 | Time Offset Flag | Used in combination with GPS Time Type | + | | | to indicate the meaning of | + | | | :ref:`GPS Time ` in the | + | | | point records. | + | | | | + | | | If both bits are set, the GPS Time | + | | | is defined as Offset GPS Time. The | + | | | Offset GPS Time is standard GPS Time | + | | | (satellite GPS Time) minus | + | | | 1 x :math:`10^6` x Time Offset. The Time | + | | | :ref:`Time Offset ` | + | | | is specified in the LAS header. | | | | The offset moves time to near zero to | | | | improve floating-point resolution for a | | | | given time period. | @@ -426,9 +438,11 @@ if the file utilizes a point record format not supporting GPS Time, or if all point records within the file have GPS Time values set to zero, such as for certain :ref:`Aggregate Model Systems `. +.. _timeoffset_link: + **Time Offset** -The Time Offset field can be used to optimize GPS Time precision for a desired time period. +The Time Offset field can be used to optimize :ref:`GPS Time ` precision for a desired time period. Offset GPS Time for a point record is equal to standard GPS Time, minus :math:`10^6` * Time Offset. For example, Adjusted Standard GPS Time uses a total offset of 1 billion (:math:`10^9`) seconds, which would be specified by a Time Offset of 1000. diff --git a/source/02.06_point.sub b/source/02.06_point.sub index 4e94dbf..e49d118 100644 --- a/source/02.06_point.sub +++ b/source/02.06_point.sub @@ -789,6 +789,8 @@ implementers. For :ref:`Aggregate Model Systems `, the Point Source ID should be set to one (1) unless assigned from a component measurement. +.. _gpstime_link: + **GPS Time** The GPS Time is the double floating point time tag value at which the point was From 9f0b375d56cd1c91073bda3cd1632d8d4fbc46a9 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 1 Feb 2024 11:45:10 -0800 Subject: [PATCH 022/103] Typo fixes --- source/03_required_vlrs.txt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/source/03_required_vlrs.txt b/source/03_required_vlrs.txt index 9b7d1b8..2c22274 100644 --- a/source/03_required_vlrs.txt +++ b/source/03_required_vlrs.txt @@ -11,11 +11,11 @@ section, while other VLRs and EVLRs are defined in the following two sections. Coordinate Reference System Information ................................................................................ -The Coordinate Reference System (CRS) information for the point data is required -for all data. The CRS information will be placed in Variable Length Records or -Extended Variable Length Records. The CRS is represented always `OGC Well Known -Text `__ (WKT) without regard to the -:ref:`Global Encoding ` bit. +The Coordinate Reference System (CRS) information for the point data is +required for all data. The CRS information will be placed in Variable Length +Records or Extended Variable Length Records. The CRS is always represented +as `OGC Well Known Text `__ (WKT) +without regard to the :ref:`Global Encoding ` bit. .. note:: @@ -27,13 +27,13 @@ Text `__ (WKT) without regard to the Georeferencing Information Using WKT ................................................................................ -LAS 1.5 defers its CRS definition to The Open Geospatial Consortium (OGC) +LAS 1.5 defers its CRS definition to the Open Geospatial Consortium (OGC) specification "Well-known text representation of coordinate reference systems", located at https://www.ogc.org/standard/wkt-crs/, which provides a comprehensive industry standard for describing coordinate systems. -*Any published version* of OGC WKT is a valid definition for LAS 1.5. Multiple -*versions OGC has published multiple versions of WKT, including `18-010 +*Any published version* of OGC WKT is a valid definition for LAS 1.5. +OGC has published multiple versions of WKT, including `18-010 `__ (commonly called "WKT2" or "WKTv2") and `12-063r5 `__ (commonly called "WKT1" and the formally ratified variant of WKT that was used @@ -108,4 +108,4 @@ Gregorian calendar would be an epoch value of 2017.23. `GDAL `__ provides excellent documentation on coordinate epochs for coordinate reference systems and their usages in raster data formats - like GeoTIFF at https://gdal.org/user/coordinate_epoch.html \ No newline at end of file + like GeoTIFF at https://gdal.org/user/coordinate_epoch.html From c86e6c950adc6547b2b510fe76917b4225e1ad5e Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 1 Feb 2024 17:05:34 -0800 Subject: [PATCH 023/103] Typo fixes and added optional/required labels. Also fixed an accidental duplicated paragraph and capitalization errors. --- source/03_required_vlrs.txt | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/source/03_required_vlrs.txt b/source/03_required_vlrs.txt index 2c22274..d12a4b0 100644 --- a/source/03_required_vlrs.txt +++ b/source/03_required_vlrs.txt @@ -32,7 +32,7 @@ specification "Well-known text representation of coordinate reference systems", located at https://www.ogc.org/standard/wkt-crs/, which provides a comprehensive industry standard for describing coordinate systems. -*Any published version* of OGC WKT is a valid definition for LAS 1.5. +Any published version of OGC WKT is a valid definition for LAS 1.5. OGC has published multiple versions of WKT, including `18-010 `__ (commonly called "WKT2" or "WKTv2") and `12-063r5 `__ @@ -40,14 +40,21 @@ OGC has published multiple versions of WKT, including `18-010 for LAS 1.4). If OGC were to publish a new WKT specification, it would also be a valid definition for LAS 1.5. -WKT georeferencing information must be specified in the -OGC CRS WKT record, as follows. Two optional VLRs define supporting -information for CRS defintions – the Math Transform Record and the Epoch Record. -A CRS WKT definition *may* or *may not* require a math transform WKT record (a -parameterized math transform definition). A CRS WKT definition *may* require an +WKT georeferencing information must be specified in the VLRs described in the +subsections below, using the required OGC CRS WKT Record VLR at a minimum. +Two optional VLRs define supporting +information for CRS definitions – the Math Transform Record and the Epoch Record. +A CRS WKT definition may or may not require a Math Transform WKT Record, which is a +parameterized math transform definition. A CRS WKT definition may require an epoch record to precisely define the time point at which the CRS definition refers. -OGC Math Transform WKT Record +.. note:: + + Readers seeking further clarity regarding LAS WKT encoding are encouraged + to learn more on the official LAS wiki: https://github.com/ASPRSorg/LAS/wiki + + +OGC Math Transform WKT Record (Optional) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-----------------+-----------------------------+ @@ -90,7 +97,7 @@ following notes: `__ (commonly called "WKT2" or "WKTv2") and `12-063r5 `__ -Epoch Record +Epoch Record (Optional) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-----------------+-----------------------------+ From f83acb57cb7d925f8be6d74bc3accdbe4fc15d8b Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Sun, 11 Feb 2024 11:03:12 -0700 Subject: [PATCH 024/103] PDRFs 0-5 completely removed and flagged as no longer valid. --- source/02.06_point.sub | 491 +++-------------------------------------- 1 file changed, 27 insertions(+), 464 deletions(-) diff --git a/source/02.06_point.sub b/source/02.06_point.sub index e49d118..a4ec71c 100644 --- a/source/02.06_point.sub +++ b/source/02.06_point.sub @@ -8,11 +8,10 @@ Header Block to locate the starting position of the first Point Data Record. Note that all Point Data Records must be the same type (i.e., Point Data Record Format). +PDRFs 0-5 as defined in previous versions of LAS are no longer valid for LAS 1.5. Point Data Record Formats (PDRFs) 6-10 have improved several aspects of the core -information in the point data records, particularly support for 256 classes and -the definition of a specific "Overlap" bit. While all PDRFs (0-10) are supported -in LAS 1.4, the preferred formats are 6-10. PDRFs 0-5 are therefore designated -as the "legacy" point formats. +information in the point data records, particularly support for 256 classes, +the definition of a specific "Overlap" bit, support for multiple sensor channels, etc. **Required Point Attributes** @@ -41,456 +40,6 @@ Geiger-mode lidar processed with a consensus model. These systems are hereafter collectively denoted as "Aggregate Model Systems." -Point Data Record Format 0 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Point Data Record Format 0 contains the core 20 bytes that are shared by Point -Data Record Formats 0 to 5. - -.. tabularcolumns:: |p{7.0cm}|p{2.5cm}|p{1.2cm}|p{1.5cm}|p{1.8cm}| - -.. table:: Point Data Record Format 0 - - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Item | Format | Byte Offset | Size | Required | - +==================================+=========================+=============+===========+==========+ - | X | int32_t | 0 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Y | int32_t | 4 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Z | int32_t | 8 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Intensity | uint16_t | 12 | 2 bytes | no | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Return Number | 3 bits (bits 0-2) | 14 | 3 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Number of Returns (Given Pulse) | 3 bits (bits 3-5) | | 3 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scan Direction Flag | 1 bit (bit 6) | | 1 bit | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Edge of Flight Line | 1 bit (bit 7) | | 1 bit | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Classification | uint8_t | 15 | 1 byte | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Scan Angle Rank (-90 to +90) -- | int8_t | 16 | 1 byte | yes | - | Left Side | | | | | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | User Data | uint8_t | 17 | 1 byte | no | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Point Source ID | uint16_t | 18 | 2 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | *Minimum PDRF Size* [1]_ | *20 bytes* | - +------------------------------------------------------------+------------------------------------+ - -.. [1] Recall that the Point Data Record Size can be greater than the minimum - required for a PDRF. These "extra bytes" follow the standard Point Record - fields and are described in the :ref:`extrabytes_vlr_label` VLR section. - -**Classification** - -This field represents the "class" attributes of a point. The format for classification -is a bit encoded field with the lower five bits used for the class and the -three high bits used for flags. The bit definitions are listed in Table 8 and -the classification values in Table 9. If a point has never -been classified, the lowest five bits must be set to zero. - - -.. tabularcolumns:: |p{2.0cm}|p{3.0cm}|p{8.5cm}| - -.. table:: Classification Bit Field Encoding (Point Data Record Formats 0-5) - - +-------+-------------------------+------------------------------------------+ - | Bit | Field Name | Description | - +=======+=========================+==========================================+ - | 0:4 | Classification | Standard ASPRS classification from | - | | | 0 to 31 as defined in the classification | - | | | table for legacy point formats (see | - | | | :ref:`Reserved Point Classes | - | | | `). | - +-------+-------------------------+------------------------------------------+ - | 5 | Synthetic | If set, this point was created by a | - | | | technique other than direct observation | - | | | such as digitized from a photogrammetric | - | | | stereo model or by traversing a | - | | | waveform. Point attribute interpretation | - | | | might differ from non-Synthetic points. | - | | | Unused attributes must be set to the | - | | | appropriate default value. | - +-------+-------------------------+------------------------------------------+ - | 6 | Key-Point | If set, this point is considered to be a | - | | | model key-point and therefore generally | - | | | should not be withheld in a thinning | - | | | algorithm. | - +-------+-------------------------+------------------------------------------+ - | 7 | Withheld | If set, this point should not be | - | | | included in processing (synonymous with | - | | | Deleted). | - +-------+-------------------------+------------------------------------------+ - -.. note:: - - Note that bits 5, 6, and 7 are treated as flags and can be set or clear in - any combination. For example, a point with bits 5 and 6 both set to one and - the lower five bits set to 2 would be a *Ground* point that had been - *Synthetically* collected and marked as a model *Key-Point*. - -.. _legacy_pt_class_link: - -**Reserved Point Classes** - -Classification must adhere to the following standard: - -.. tabularcolumns:: |p{6.0cm}|p{8.0cm}| - -.. table:: ASPRS Standard Point Classes (Point Data Record Formats 0-5) - - +-----------------------------------+-----------------------------------------------+ - | Classification Value (Bits 0:4) | Meaning | - +===================================+===============================================+ - | 0 | Created, Never Classified | - +-----------------------------------+-----------------------------------------------+ - | 1 | Unclassified [2]_ | - +-----------------------------------+-----------------------------------------------+ - | 2 | Ground | - +-----------------------------------+-----------------------------------------------+ - | 3 | Low Vegetation | - +-----------------------------------+-----------------------------------------------+ - | 4 | Medium Vegetation | - +-----------------------------------+-----------------------------------------------+ - | 5 | High Vegetation | - +-----------------------------------+-----------------------------------------------+ - | 6 | Building | - +-----------------------------------+-----------------------------------------------+ - | 7 | Low Point (Noise) | - +-----------------------------------+-----------------------------------------------+ - | 8 | Model Key-Point (Mass Point) | - +-----------------------------------+-----------------------------------------------+ - | 9 | Water | - +-----------------------------------+-----------------------------------------------+ - | 10 | *Reserved for ASPRS Definition* | - +-----------------------------------+-----------------------------------------------+ - | 11 | *Reserved for ASPRS Definition* | - +-----------------------------------+-----------------------------------------------+ - | 12 | Overlap Points [3]_ | - +-----------------------------------+-----------------------------------------------+ - | 13-31 | *Reserved for ASPRS Definition* | - +-----------------------------------+-----------------------------------------------+ - -.. note:: - - A note on Bit Fields – The LAS storage format is "Little Endian." This - means that multi-byte data fields are stored in memory from least - significant byte at the low address to most significant byte at the high - address. Bit fields are always interpreted as bit 0 set to 1 equals 1, bit - 1 set to 1 equals 2, bit 2 set to 1 equals 4 and so forth. - - -.. [2] We are using both 0 and 1 as *Unclassified* to maintain compatibility with - current popular classification software such as TerraScan. We extend the idea - of classification value 1 to include cases in which data have been subjected to - a classification algorithm but emerged in an undefined state. For example, data - with class 0 is sent through an algorithm to detect man-made structures – - points that emerge without having been assigned as belonging to structures - could be remapped from class 0 to class 1. - -.. [3] Overlap Points are those points that were immediately culled during the - merging of overlapping flight lines. In general, the *Withheld* bit should be set - since these points are not subsequently classified. - -**Scan Angle Rank** - -The Scan Angle Rank is a signed one-byte integer with a valid range from -90 to -+90. The Scan Angle Rank is the angle (rounded to the nearest integer in the -absolute value sense) at which the laser point was output from the laser system -including the roll of the aircraft. The scan angle is within 1 degree of -accuracy from +90 to -90 degrees. The scan angle is an angle based on 0 degrees -being nadir, and -90 degrees to the left side of the aircraft in the direction -of flight. - -For :ref:`Aggregate Model Systems `, the Scan Angle Rank should -be set to zero unless assigned from a component measurement. - -.. raw:: latex - - \newpage - -Point Data Record Format 1 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Point Data Record Format 1 is the same as Point Data Record Format 0 with the -addition of GPS Time. - - -.. tabularcolumns:: |p{7.0cm}|p{2.5cm}|p{1.2cm}|p{1.5cm}|p{1.8cm}| - -.. table:: Point Data Record Format 1 - - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Item | Format | Byte Offset | Size | Required | - +==================================+=========================+=============+===========+==========+ - | X | int32_t | 0 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Y | int32_t | 4 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Z | int32_t | 8 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Intensity | uint16_t | 12 | 2 bytes | no | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Return Number | 3 bits (bits 0-2) | 14 | 3 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Number of Returns (Given Pulse) | 3 bits (bits 3-5) | | 3 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scan Direction Flag | 1 bit (bit 6) | | 1 bit | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Edge of Flight Line | 1 bit (bit 7) | | 1 bit | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Classification | uint8_t | 15 | 1 byte | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Scan Angle Rank (-90 to +90) -- | int8_t | 16 | 1 byte | yes | - | Left Side | | | | | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | User Data | uint8_t | 17 | 1 byte | no | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Point Source ID | uint16_t | 18 | 2 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | GPS Time | double | 20 | 8 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | *Minimum PDRF Size* | *28 bytes* | - +------------------------------------------------------------+------------------------------------+ - - -.. raw:: latex - - \newpage - -Point Data Record Format 2 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Point Data Record Format 2 is the same as Point Data Record Format 0 with the -addition of three color channels. These fields are used when "colorizing" a -point using ancillary data, typically from a camera. - -.. tabularcolumns:: |p{7.0cm}|p{2.5cm}|p{1.2cm}|p{1.5cm}|p{1.8cm}| - -.. table:: Point Data Record Format 2 - - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Item | Format | Byte Offset | Size | Required | - +==================================+=========================+=============+===========+==========+ - | X | int32_t | 0 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Y | int32_t | 4 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Z | int32_t | 8 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Intensity | uint16_t | 12 | 2 bytes | no | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Return Number | 3 bits (bits 0-2) | 14 | 3 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Number of Returns (Given Pulse) | 3 bits (bits 3-5) | | 3 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scan Direction Flag | 1 bit (bit 6) | | 1 bit | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Edge of Flight Line | 1 bit (bit 7) | | 1 bit | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Classification | uint8_t | 15 | 1 byte | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Scan Angle Rank (-90 to +90) -- | int8_t | 16 | 1 byte | yes | - | Left Side | | | | | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | User Data | uint8_t | 17 | 1 byte | no | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Point Source ID | uint16_t | 18 | 2 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Red | uint16_t | 20 | 2 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Green | uint16_t | 22 | 2 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Blue | uint16_t | 24 | 2 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | *Minimum PDRF Size* | *26 bytes* | - +------------------------------------------------------------+------------------------------------+ - - -.. raw:: latex - - \newpage - -Point Data Record Format 3 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Point Data Record Format 3 is the same as Point Data Record Format 2 with the -addition of GPS Time. - -.. tabularcolumns:: |p{7.0cm}|p{2.5cm}|p{1.2cm}|p{1.5cm}|p{1.8cm}| - -.. table:: Point Data Record Format 3 - - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Item | Format | Byte Offset | Size | Required | - +==================================+=========================+=============+===========+==========+ - | X | int32_t | 0 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Y | int32_t | 4 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Z | int32_t | 8 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Intensity | uint16_t | 12 | 2 bytes | no | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Return Number | 3 bits (bits 0-2) | 14 | 3 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Number of Returns (Given Pulse) | 3 bits (bits 3-5) | | 3 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scan Direction Flag | 1 bit (bit 6) | | 1 bit | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Edge of Flight Line | 1 bit (bit 7) | | 1 bit | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Classification | uint8_t | 15 | 1 byte | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Scan Angle Rank (-90 to +90) -- | int8_t | 16 | 1 byte | yes | - | Left Side | | | | | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | User Data | uint8_t | 17 | 1 byte | no | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Point Source ID | uint16_t | 18 | 2 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | GPS Time | double | 20 | 8 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Red | uint16_t | 28 | 2 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Green | uint16_t | 30 | 2 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Blue | uint16_t | 32 | 2 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | *Minimum PDRF Size* | *34 bytes* | - +------------------------------------------------------------+------------------------------------+ - -.. raw:: latex - - \newpage - -Point Data Record Format 4 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Point Data Record Format 4 adds Wave Packets to Point Data Record Format 1. - -.. tabularcolumns:: |p{7.0cm}|p{2.5cm}|p{1.2cm}|p{1.5cm}|p{1.8cm}| - -.. table:: Point Data Record Format 4 - - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Item | Format | Byte Offset | Size | Required | - +==================================+=========================+=============+===========+==========+ - | X | int32_t | 0 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Y | int32_t | 4 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Z | int32_t | 8 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Intensity | uint16_t | 12 | 2 bytes | no | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Return Number | 3 bits (bits 0-2) | 14 | 3 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Number of Returns (Given Pulse) | 3 bits (bits 3-5) | | 3 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scan Direction Flag | 1 bit (bit 6) | | 1 bit | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Edge of Flight Line | 1 bit (bit 7) | | 1 bit | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Classification | uint8_t | 15 | 1 byte | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Scan Angle Rank (-90 to +90) -- | int8_t | 16 | 1 byte | yes | - | Left Side | | | | | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | User Data | uint8_t | 17 | 1 byte | no | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Point Source ID | uint16_t | 18 | 2 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | GPS Time | double | 20 | 8 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Wave Packet Descriptor Index | uint8_t | 28 | 1 byte | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Byte Offset to Waveform Data | uint64_t | 29 | 8 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Waveform Packet Size in Bytes | uint32_t | 37 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Return Point Waveform Location | float | 41 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Parametric dx | float | 45 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Parametric dy | float | 49 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Parametric dz | float | 53 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | *Minimum PDRF Size* | *57 bytes* | - +------------------------------------------------------------+------------------------------------+ - - -.. raw:: latex - - \newpage - -Point Data Record Format 5 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Point Data Record Format 5 adds Wave Packets to Point Data Record Format 3. - -.. tabularcolumns:: |p{7.0cm}|p{2.5cm}|p{1.2cm}|p{1.5cm}|p{1.8cm}| - -.. table:: Point Data Record Format 5 - - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Item | Format | Byte Offset | Size | Required | - +==================================+=========================+=============+===========+==========+ - | X | int32_t | 0 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Y | int32_t | 4 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Z | int32_t | 8 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Intensity | uint16_t | 12 | 2 bytes | no | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Return Number | 3 bits (bits 0-2) | 14 | 3 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Number of Returns (Given Pulse) | 3 bits (bits 3-5) | | 3 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scan Direction Flag | 1 bit (bit 6) | | 1 bit | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Edge of Flight Line | 1 bit (bit 7) | | 1 bit | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Classification | uint8_t | 15 | 1 byte | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Scan Angle Rank (-90 to +90) -- | int8_t | 16 | 1 byte | yes | - | Left Side | | | | | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | User Data | uint8_t | 17 | 1 byte | no | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Point Source ID | uint16_t | 18 | 2 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | GPS Time | double | 20 | 8 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Red | uint16_t | 28 | 2 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Green | uint16_t | 30 | 2 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Blue | uint16_t | 32 | 2 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Wave Packet Descriptor Index | uint8_t | 34 | 1 byte | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Byte Offset to Waveform Data | uint64_t | 35 | 8 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Waveform Packet Size in Bytes | uint32_t | 43 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Return Point Waveform Location | float | 47 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Parametric dx | float | 51 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Parametric dy | float | 55 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Parametric dz | float | 59 | 4 bytes | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | *Minimum PDRF Size* | *63 bytes* | - +------------------------------------------------------------+------------------------------------+ .. raw:: latex @@ -500,11 +49,7 @@ Point Data Record Format 6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Point Data Record Format 6 contains the core 30 bytes that are shared by Point -Data Record Formats 6 to 10. The difference to the core 20 bytes of Point Data -Record Formats 0 to 5 is that there are more bits for return numbers in order -to support up to 15 returns, there are more bits for point classifications to -support up to 256 classes, there is a higher precision scan angle (16 bits -instead of 8), and the GPS time is mandatory. +Data Record Formats 6 to 10. .. tabularcolumns:: |p{6.0cm}|p{3.5cm}|p{1.2cm}|p{1.5cm}|p{1.5cm}| @@ -543,9 +88,21 @@ instead of 8), and the GPS time is mandatory. +----------------------------------+-------------------------+-------------+-----------+----------+ | GPS Time | double | 22 | 8 bytes | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ - | *Minimum PDRF Size* | *30 bytes* | + | *Minimum PDRF Size* [1]_ | *30 bytes* | +------------------------------------------------------------+------------------------------------+ +.. [1] Recall that the Point Data Record Size can be greater than the minimum + required for a PDRF. These "extra bytes" follow the standard Point Record + fields and are described in the :ref:`extrabytes_vlr_label` VLR section. + +.. note:: + + A note on Bit Fields – The LAS storage format is "Little Endian." This + means that multi-byte data fields are stored in memory from least + significant byte at the low address to most significant byte at the high + address. Bit fields are always interpreted as bit 0 set to 1 equals 1, bit + 1 set to 1 equals 2, bit 2 set to 1 equals 4 and so forth. + **X, Y, and Z** The X, Y, and Z values are stored as int32_t integers. The X, Y, and Z values are @@ -684,6 +241,12 @@ these cases, the Edge of Flight Line Flag should be set to zero. **Classification** +This field represents the "class" attributes of a point. Classifications 0-63 are +reserved for ASPRS-standard definitions, as defined in this specification and +approved :ref:`LAS Domain Profiles `. Classifications 64 and +above may be assigned meaning at the user's discretion. + + Classification must adhere to the following standard: @@ -694,7 +257,7 @@ Classification must adhere to the following standard: +------------------+-----------------------------+--------------------------------+ | Value | Meaning | Notes | +==================+=============================+================================+ - | 0 | Created, Never Classified | See note [4]_ | + | 0 | Created, Never Classified | See note [2]_ | +------------------+-----------------------------+ + | 1 | Unclassified | | +------------------+-----------------------------+--------------------------------+ @@ -710,7 +273,7 @@ Classification must adhere to the following standard: +------------------+-----------------------------+--------------------------------+ | 7 | Low Point (Noise) | | +------------------+-----------------------------+--------------------------------+ - | 8 | *Reserved* | | + | 8 | *Reserved* | Formerly Model Key-Point | +------------------+-----------------------------+--------------------------------+ | 9 | Water | | +------------------+-----------------------------+--------------------------------+ @@ -718,7 +281,7 @@ Classification must adhere to the following standard: +------------------+-----------------------------+--------------------------------+ | 11 | Road Surface | | +------------------+-----------------------------+--------------------------------+ - | 12 | *Reserved* | | + | 12 | *Reserved* | Formerly Overlap Point | +------------------+-----------------------------+--------------------------------+ | 13 | Wire -- Guard (Shield) | | +------------------+-----------------------------+--------------------------------+ @@ -750,7 +313,7 @@ Classification must adhere to the following standard: +------------------+-----------------------------+--------------------------------+ -.. [4] We are using both 0 and 1 as Unclassified to maintain compatibility +.. [2] We are using both 0 and 1 as Unclassified to maintain compatibility with current popular classification software such as TerraScan. We extend the idea of classification value 1 to include cases in which data have been subjected to a classification algorithm but emerged in an undefined state. For From 91fce1cfc25b74e777c6b2dcdf3f0ec594c0ec88 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Sun, 11 Feb 2024 11:29:03 -0700 Subject: [PATCH 025/103] Small editorial changes --- source/02.06_point.sub | 8 ++++---- source/06_profiles.txt | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/source/02.06_point.sub b/source/02.06_point.sub index a4ec71c..9aabe6b 100644 --- a/source/02.06_point.sub +++ b/source/02.06_point.sub @@ -8,8 +8,8 @@ Header Block to locate the starting position of the first Point Data Record. Note that all Point Data Records must be the same type (i.e., Point Data Record Format). -PDRFs 0-5 as defined in previous versions of LAS are no longer valid for LAS 1.5. -Point Data Record Formats (PDRFs) 6-10 have improved several aspects of the core +Point Data Record Formats (PDRFs) 0-5 as defined in previous versions of LAS are no longer valid for LAS 1.5. +PDRFs 6-10 have improved several aspects of the core information in the point data records, particularly support for 256 classes, the definition of a specific "Overlap" bit, support for multiple sensor channels, etc. @@ -273,7 +273,7 @@ Classification must adhere to the following standard: +------------------+-----------------------------+--------------------------------+ | 7 | Low Point (Noise) | | +------------------+-----------------------------+--------------------------------+ - | 8 | *Reserved* | Formerly Model Key-Point | + | 8 | *Reserved* | | +------------------+-----------------------------+--------------------------------+ | 9 | Water | | +------------------+-----------------------------+--------------------------------+ @@ -281,7 +281,7 @@ Classification must adhere to the following standard: +------------------+-----------------------------+--------------------------------+ | 11 | Road Surface | | +------------------+-----------------------------+--------------------------------+ - | 12 | *Reserved* | Formerly Overlap Point | + | 12 | *Reserved* | | +------------------+-----------------------------+--------------------------------+ | 13 | Wire -- Guard (Shield) | | +------------------+-----------------------------+--------------------------------+ diff --git a/source/06_profiles.txt b/source/06_profiles.txt index 0d06159..4dca982 100644 --- a/source/06_profiles.txt +++ b/source/06_profiles.txt @@ -2,6 +2,8 @@ \newpage +.. _domainprofile_label: + LAS Domain Profiles -------------------------------------------------------------------------------- From 52b987f4b985e1b03f4261e08e4a1329b6994f34 Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Thu, 8 Aug 2024 10:57:28 -0500 Subject: [PATCH 026/103] use -latest for python and os builders --- .readthedocs.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index f2ad896..6ee1cae 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -6,9 +6,9 @@ version: 2 build: - os: "ubuntu-22.04" + os: "ubuntu-lts-latest" tools: - python: "3.11" + python: "mambaforge-latest" sphinx: builder: html From 34c50e7618898f0963230520dbe7c5154ca25fbf Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Thu, 8 Aug 2024 13:59:42 -0500 Subject: [PATCH 027/103] refactor language of CRS VLRs --- source/03_required_vlrs.txt | 136 ++++++++++++++++++------------------ source/conf.py | 15 +++- 2 files changed, 81 insertions(+), 70 deletions(-) diff --git a/source/03_required_vlrs.txt b/source/03_required_vlrs.txt index 9b7d1b8..c73bb34 100644 --- a/source/03_required_vlrs.txt +++ b/source/03_required_vlrs.txt @@ -2,96 +2,93 @@ \newpage -Coordinate Reference System VLRs (Required) +Coordinate Reference System -------------------------------------------------------------------------------- -LAS 1.5 defines Variable Length Records (VLRs) and Extended Variable Length -Records (EVLRs). Coordinate Reference System (CRS) VLRs are defined in this -section, while other VLRs and EVLRs are defined in the following two sections. -Coordinate Reference System Information -................................................................................ +LAS 1.5 defines VLRs in :ref:`vlrdef_label` and EVLRs in :ref:`evlrdef_label` and +requires them for specifying the coordinate reference system of the file. +Specification of Coordinate Reference System (CRS) information is required. -The Coordinate Reference System (CRS) information for the point data is required -for all data. The CRS information will be placed in Variable Length Records or -Extended Variable Length Records. The CRS is represented always `OGC Well Known -Text `__ (WKT) without regard to the -:ref:`Global Encoding ` bit. +CRS information shall be placed in VLRs or EVLRs and represented as `OGC Well +Known Text `__ (WKT) without regard to +the :ref:`Global Encoding ` bit. -.. note:: +.. _crs_wkt: - LAS 1.4 supported dual definition of coordinate system depending on the - PDRF. PDRFs 0-5 were able to have their coordinate systems defined by - GeoTIFF keys but they were voided for LAS 1.5, and it is no longer possible - to define coordinate system information with GeoTIFF keys in LAS 1.5. - -Georeferencing Information Using WKT +`OGC Coordinate System WKT Record`_ ................................................................................ -LAS 1.5 defers its CRS definition to The Open Geospatial Consortium (OGC) -specification "Well-known text representation of coordinate reference systems", -located at https://www.ogc.org/standard/wkt-crs/, which provides a comprehensive -industry standard for describing coordinate systems. - -*Any published version* of OGC WKT is a valid definition for LAS 1.5. Multiple -*versions OGC has published multiple versions of WKT, including `18-010 -`__ (commonly called "WKT2" or -"WKTv2") and `12-063r5 `__ -(commonly called "WKT1" and the formally ratified variant of WKT that was used -for LAS 1.4). If OGC were to publish a new WKT specification, it would -also be a valid definition for LAS 1.5. - -WKT georeferencing information must be specified in the -OGC CRS WKT record, as follows. Two optional VLRs define supporting -information for CRS defintions – the Math Transform Record and the Epoch Record. -A CRS WKT definition *may* or *may not* require a math transform WKT record (a -parameterized math transform definition). A CRS WKT definition *may* require an -epoch record to precisely define the time point at which the CRS definition refers. - -OGC Math Transform WKT Record -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +**Required** + +The WKT record is **required** and can be specified as either a VLR or an +EVLR. An EVLR should **override** any definition provided by a VLR with the same +User ID and Record ID. +-----------------+-----------------------------+ | User ID | LASF_Projection | +-----------------+-----------------------------+ -| Record ID | 2111 | +| Record ID | 2112 | +-----------------+-----------------------------+ -This record contains the textual data representing a Math Transform WKT as -defined in section 7 of the Coordinate Transformation Service Spec, with the -following notes: +This record must contain the textual data representing a WKT as defined by any +published OGC Well Known Text standard with the following considerations: + +* The OGC Coordinate System WKT VLR data shall be a null-terminated string. +* The OGC Coordinate System WKT VLR data shall be considered UTF-8. +* The OGC Coordinate System WKT VLR data shall be considered C locale-based with + no localization of the numeric strings within the WKT being performed. -* The OGC Math Transform WKT VLR data shall be a null-terminated string. -* The OGC Math Transform WKT VLR data shall be considered UTF-8. -* The OGC Math Transform WKT VLR data shall be considered C locale-based, and - no localization of the numeric strings within the WKT should be performed. -OGC Coordinate System WKT Record -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. note:: + + **Any published version** of an OGC WKT standard is a valid definition for LAS + 1.5. Multiple + versions OGC has published multiple versions of WKT, including `18-010 + `__ (commonly called "WKT2" + or "WKTv2") and `12-063r5 `__ + (commonly called "WKT1" and the formally ratified variant of WKT that was used + for LAS 1.4). If OGC were to publish a new WKT standard, it would also be a + valid definition for LAS 1.5. + +.. note:: + + LAS 1.4 supported a dual definition of coordinate system depending on the + PDRF. PDRFs 0-5 were able to have their coordinate systems defined by + GeoTIFF keys. It is no longer possible or valid to define coordinate system + information with GeoTIFF keys in LAS 1.5. + +.. _math_wkt: + +`OGC Math Transform WKT Record`_ +................................................................................ + +**Optional** + +Writers may include an optional OGC Math Transform WKT Record to provide a +supplemental parameterized math transform definition. +-----------------+-----------------------------+ | User ID | LASF_Projection | +-----------------+-----------------------------+ -| Record ID | 2112 | +| Record ID | 2111 | +-----------------+-----------------------------+ -This record contains the textual data representing a Coordinate System WKT as -defined in section 7 of the Coordinate Transformation Service Spec, with the +This record must contain a Math Transform WKT consistent with the same WKT +specification being used by :ref:`crs_wkt`. + following notes: -* The OGC Coordinate System WKT VLR data shall be a null-terminated string. -* The OGC Coordinate System WKT VLR data shall be considered UTF-8. -* The OGC Coordinate System WKT VLR data shall be considered C locale-based, and +* The OGC Math Transform WKT VLR data shall be a null-terminated string. +* The OGC Math Transform WKT VLR data shall be considered UTF-8. +* The OGC Math Transform WKT VLR data shall be considered C locale-based, and no localization of the numeric strings within the WKT should be performed. -.. note:: +.. _epoch: - *Any published version* of OGC WKT is a valid definition for LAS 1.5. Multiple - *versions OGC has published multiple versions of WKT, including `18-010 - `__ (commonly called "WKT2" or - "WKTv2") and `12-063r5 `__ +`Epoch Record`_ +................................................................................ -Epoch Record -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +**Optional** +-----------------+-----------------------------+ | User ID | LASF_Projection | @@ -101,11 +98,16 @@ Epoch Record The date at which coordinates in the LAS file are referenced to a dynamic coordinate reference system is expressed as a decimal year in the Gregorian -calendar stored as a double. For example: 2017-03-25 in the -Gregorian calendar would be an epoch value of 2017.23. +calendar stored as a double. For example, an epoch of 2017-03-25 in the +Gregorian calendar would be stored as ``2017.23`` in the VLR. .. note:: + OGC WKT2 (18-010r7) and later supports the definition of ``EPOCH``, which + should negate the need for an explicit epoch VLR entry on the file. It is + recommended to add `Epoch Record`_ VLRs only for WKT versions earlier than + 18-010r7. + `GDAL `__ provides excellent documentation on coordinate - epochs for coordinate reference systems and their usages in raster data formats - like GeoTIFF at https://gdal.org/user/coordinate_epoch.html \ No newline at end of file + epochs for coordinate reference systems and their usages in raster data + formats like GeoTIFF at https://gdal.org/user/coordinate_epoch.html diff --git a/source/conf.py b/source/conf.py index 8a30de6..6cc7164 100644 --- a/source/conf.py +++ b/source/conf.py @@ -30,7 +30,16 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ['sphinx.ext.mathjax', 'sphinxcontrib.spelling'] + +HAVE_SPELLING = True +try: + import sphinxcontrib.spelling +except ImportError: + HAVE_SPELLING=False +extensions = ['sphinx.ext.mathjax'] + +if HAVE_SPELLING: + extensions.append('sphinxcontrib.spelling') # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -73,7 +82,7 @@ def get_git_revision_short_hash(): import os if 'GITHUB_SHA' in os.environ: return os.environ['GITHUB_SHA'] - elif 'READTHEDOCS_GIT_COMMIT_HASH': + elif 'READTHEDOCS_GIT_COMMIT_HASH' in os.environ: return os.environ['READTHEDOCS_GIT_COMMIT_HASH'] return '' gitsha = get_git_revision_short_hash() @@ -83,7 +92,7 @@ def get_git_revision_short_hash(): # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = 'en' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. From b6172862a1140ad7eaee2e11c4dc509ea37eed97 Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Thu, 8 Aug 2024 14:19:56 -0500 Subject: [PATCH 028/103] refactor working names of crs rst --- source/00_index.txt | 2 +- source/{03_required_vlrs.txt => 03_crs.txt} | 4 ++-- source/04_optional_vlrs.txt | 4 +++- source/conf.py | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) rename source/{03_required_vlrs.txt => 03_crs.txt} (96%) diff --git a/source/00_index.txt b/source/00_index.txt index ffcfc7e..50815e8 100644 --- a/source/00_index.txt +++ b/source/00_index.txt @@ -9,7 +9,7 @@ Welcome to LAS's documentation! 01_intro 02.00_definition - 03_required_vlrs + 03_crs 04_optional_vlrs 05_defined_evlrs 06_profiles diff --git a/source/03_required_vlrs.txt b/source/03_crs.txt similarity index 96% rename from source/03_required_vlrs.txt rename to source/03_crs.txt index c73bb34..c25dbf3 100644 --- a/source/03_required_vlrs.txt +++ b/source/03_crs.txt @@ -21,8 +21,8 @@ the :ref:`Global Encoding ` bit. **Required** The WKT record is **required** and can be specified as either a VLR or an -EVLR. An EVLR should **override** any definition provided by a VLR with the same -User ID and Record ID. +EVLR. If an EVLR is to override an already existing CRS VLR, writers +should also write a :ref:`Superseded VLR ` to label it. +-----------------+-----------------------------+ | User ID | LASF_Projection | diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index 2e8c7b4..877eec8 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -2,7 +2,9 @@ \newpage -Other Specification Defined VLRs (Optional) +.. _optional_vlrs: + +Optional VLR Definitions -------------------------------------------------------------------------------- Classification Lookup diff --git a/source/conf.py b/source/conf.py index 6cc7164..316e7a4 100644 --- a/source/conf.py +++ b/source/conf.py @@ -55,7 +55,7 @@ # General information about the project. project = u'LAS' -copyright = u'2019, ASPRS' +copyright = u'2024, ASPRS' author = u'ASPRS' # The version info for the project you're documenting, acts as replacement for From de29a4a5884cc9253151d6cce4eb3fda1b8daa80 Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Thu, 8 Aug 2024 14:35:12 -0500 Subject: [PATCH 029/103] delete old required_vlrs file --- source/03_required_vlrs.txt | 119 ------------------------------------ 1 file changed, 119 deletions(-) delete mode 100644 source/03_required_vlrs.txt diff --git a/source/03_required_vlrs.txt b/source/03_required_vlrs.txt deleted file mode 100644 index b49e484..0000000 --- a/source/03_required_vlrs.txt +++ /dev/null @@ -1,119 +0,0 @@ -.. raw:: latex - - \newpage - -Coordinate Reference System VLRs (Required) --------------------------------------------------------------------------------- -LAS 1.5 defines Variable Length Records (VLRs) and Extended Variable Length -Records (EVLRs). Coordinate Reference System (CRS) VLRs are defined in this -section, while other VLRs and EVLRs are defined in the following two sections. - -Coordinate Reference System Information -................................................................................ - -The Coordinate Reference System (CRS) information for the point data is -required for all data. The CRS information will be placed in Variable Length -Records or Extended Variable Length Records. The CRS is always represented -as `OGC Well Known Text `__ (WKT) -without regard to the :ref:`Global Encoding ` bit. - -.. note:: - - LAS 1.4 supported dual definition of coordinate system depending on the - PDRF. PDRFs 0-5 were able to have their coordinate systems defined by - GeoTIFF keys but they were voided for LAS 1.5, and it is no longer possible - to define coordinate system information with GeoTIFF keys in LAS 1.5. - -Georeferencing Information Using WKT -................................................................................ - -LAS 1.5 defers its CRS definition to the Open Geospatial Consortium (OGC) -specification "Well-known text representation of coordinate reference systems", -located at https://www.ogc.org/standard/wkt-crs/, which provides a comprehensive -industry standard for describing coordinate systems. - -Any published version of OGC WKT is a valid definition for LAS 1.5. -OGC has published multiple versions of WKT, including `18-010 -`__ (commonly called "WKT2" or -"WKTv2") and `12-063r5 `__ -(commonly called "WKT1" and the formally ratified variant of WKT that was used -for LAS 1.4). If OGC were to publish a new WKT specification, it would -also be a valid definition for LAS 1.5. - -WKT georeferencing information must be specified in the VLRs described in the -subsections below, using the required OGC CRS WKT Record VLR at a minimum. -Two optional VLRs define supporting -information for CRS definitions – the Math Transform Record and the Epoch Record. -A CRS WKT definition may or may not require a Math Transform WKT Record, which is a -parameterized math transform definition. A CRS WKT definition may require an -epoch record to precisely define the time point at which the CRS definition refers. - -.. note:: - - Readers seeking further clarity regarding LAS WKT encoding are encouraged - to learn more on the official LAS wiki: https://github.com/ASPRSorg/LAS/wiki - - -OGC Math Transform WKT Record (Optional) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -+-----------------+-----------------------------+ -| User ID | LASF_Projection | -+-----------------+-----------------------------+ -| Record ID | 2111 | -+-----------------+-----------------------------+ - -This record contains the textual data representing a Math Transform WKT as -defined in section 7 of the Coordinate Transformation Service Spec, with the -following notes: - -* The OGC Math Transform WKT VLR data shall be a null-terminated string. -* The OGC Math Transform WKT VLR data shall be considered UTF-8. -* The OGC Math Transform WKT VLR data shall be considered C locale-based, and - no localization of the numeric strings within the WKT should be performed. - -OGC Coordinate System WKT Record -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -+-----------------+-----------------------------+ -| User ID | LASF_Projection | -+-----------------+-----------------------------+ -| Record ID | 2112 | -+-----------------+-----------------------------+ - -This record contains the textual data representing a Coordinate System WKT as -defined in section 7 of the Coordinate Transformation Service Spec, with the -following notes: - -* The OGC Coordinate System WKT VLR data shall be a null-terminated string. -* The OGC Coordinate System WKT VLR data shall be considered UTF-8. -* The OGC Coordinate System WKT VLR data shall be considered C locale-based, and - no localization of the numeric strings within the WKT should be performed. - -.. note:: - - *Any published version* of OGC WKT is a valid definition for LAS 1.5. Multiple - *versions OGC has published multiple versions of WKT, including `18-010 - `__ (commonly called "WKT2" or - "WKTv2") and `12-063r5 `__ - -Epoch Record (Optional) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -+-----------------+-----------------------------+ -| User ID | LASF_Projection | -+-----------------+-----------------------------+ -| Record ID | 2113 | -+-----------------+-----------------------------+ - -The date at which coordinates in the LAS file are referenced to a dynamic -coordinate reference system is expressed as a decimal year in the Gregorian -calendar stored as a double. For example: 2017-03-25 in the -Gregorian calendar would be an epoch value of 2017.23. - -.. note:: - - `GDAL `__ provides excellent documentation on coordinate - epochs for coordinate reference systems and their usages in raster data formats - like GeoTIFF at https://gdal.org/user/coordinate_epoch.html - From c541843d9f81b691ddc62adfe99f9e966c7f6835 Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Thu, 8 Aug 2024 14:39:05 -0500 Subject: [PATCH 030/103] use conda environment --- .readthedocs.yaml | 3 +++ source/environment.yml | 10 ++++++++++ source/requirements.txt | 1 - 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 source/environment.yml delete mode 100644 source/requirements.txt diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 6ee1cae..cdb71f9 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -19,4 +19,7 @@ python: install: - requirements: source/requirements.txt +conda: + environment: docs/environment.yml + formats: all diff --git a/source/environment.yml b/source/environment.yml new file mode 100644 index 0000000..9d1f5a0 --- /dev/null +++ b/source/environment.yml @@ -0,0 +1,10 @@ +name: asprsorg +channels: + - conda-forge +dependencies: + - pip + - pip: + - pybtex + - sphinxcontrib-bibtex + - sphinxcontrib-spelling + diff --git a/source/requirements.txt b/source/requirements.txt deleted file mode 100644 index 6a9445e..0000000 --- a/source/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -sphinxcontrib-spelling From 6952fbaf32bfaaaea852457df8e4b08b98235f05 Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Thu, 8 Aug 2024 14:46:16 -0500 Subject: [PATCH 031/103] point to correct environment.yml location --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index cdb71f9..6b8c633 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -20,6 +20,6 @@ python: - requirements: source/requirements.txt conda: - environment: docs/environment.yml + environment: source/environment.yml formats: all From 2cd35e892fea0db32e117d9df5c1ef801eb24e16 Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Thu, 8 Aug 2024 14:51:33 -0500 Subject: [PATCH 032/103] need first doc to be called index --- source/conf.py | 2 +- source/{00_index.txt => index.txt} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename source/{00_index.txt => index.txt} (100%) diff --git a/source/conf.py b/source/conf.py index 316e7a4..fbf4a8b 100644 --- a/source/conf.py +++ b/source/conf.py @@ -51,7 +51,7 @@ source_suffix = '.txt' # The master toctree document. -master_doc = '00_index' +master_doc = 'index' # General information about the project. project = u'LAS' diff --git a/source/00_index.txt b/source/index.txt similarity index 100% rename from source/00_index.txt rename to source/index.txt From 196b438a994ae2e44f6472ad94c462cefd179f8f Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Thu, 8 Aug 2024 15:28:20 -0500 Subject: [PATCH 033/103] pdf format --- .readthedocs.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 6b8c633..a1a2d62 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -22,4 +22,6 @@ python: conda: environment: source/environment.yml -formats: all +formats: + - pdf + - epub From d6c38b957bb485f94c56e82feab96d83ffb3d139 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 21 Nov 2024 10:40:25 -0800 Subject: [PATCH 034/103] Typo corrections --- source/03_crs.txt | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/source/03_crs.txt b/source/03_crs.txt index c25dbf3..8627bd2 100644 --- a/source/03_crs.txt +++ b/source/03_crs.txt @@ -41,9 +41,8 @@ published OGC Well Known Text standard with the following considerations: .. note:: - **Any published version** of an OGC WKT standard is a valid definition for LAS - 1.5. Multiple - versions OGC has published multiple versions of WKT, including `18-010 + Any published version of an OGC WKT standard is a valid definition for LAS 1.5. + OGC has published multiple versions of WKT, including `18-010 `__ (commonly called "WKT2" or "WKTv2") and `12-063r5 `__ (commonly called "WKT1" and the formally ratified variant of WKT that was used @@ -54,8 +53,8 @@ published OGC Well Known Text standard with the following considerations: LAS 1.4 supported a dual definition of coordinate system depending on the PDRF. PDRFs 0-5 were able to have their coordinate systems defined by - GeoTIFF keys. It is no longer possible or valid to define coordinate system - information with GeoTIFF keys in LAS 1.5. + GeoTIFF keys, but they were removed in LAS 1.5. It is no longer possible + or valid to define coordinate system information with GeoTIFF keys in LAS 1.5. .. _math_wkt: @@ -74,9 +73,7 @@ supplemental parameterized math transform definition. +-----------------+-----------------------------+ This record must contain a Math Transform WKT consistent with the same WKT -specification being used by :ref:`crs_wkt`. - -following notes: +specification being used by :ref:`crs_wkt`, with the following considerations: * The OGC Math Transform WKT VLR data shall be a null-terminated string. * The OGC Math Transform WKT VLR data shall be considered UTF-8. @@ -96,10 +93,10 @@ following notes: | Record ID | 2113 | +-----------------+-----------------------------+ -The date at which coordinates in the LAS file are referenced to a dynamic +The date against which coordinates in the LAS file are referenced in a dynamic coordinate reference system is expressed as a decimal year in the Gregorian calendar stored as a double. For example, an epoch of 2017-03-25 in the -Gregorian calendar would be stored as ``2017.23`` in the VLR. +Gregorian calendar would be stored as ``2017.23`` in the VLR (``2017 + 84/365``). .. note:: From 22fff55809d531ac3bac057bb7e5c1989acb29ba Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 21 Nov 2024 11:28:33 -0800 Subject: [PATCH 035/103] Move required/optional tags to heading --- source/03_crs.txt | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/source/03_crs.txt b/source/03_crs.txt index 8627bd2..ba31dfb 100644 --- a/source/03_crs.txt +++ b/source/03_crs.txt @@ -15,11 +15,9 @@ the :ref:`Global Encoding ` bit. .. _crs_wkt: -`OGC Coordinate System WKT Record`_ +`OGC Coordinate System WKT Record`_ (Required) ................................................................................ -**Required** - The WKT record is **required** and can be specified as either a VLR or an EVLR. If an EVLR is to override an already existing CRS VLR, writers should also write a :ref:`Superseded VLR ` to label it. @@ -58,11 +56,9 @@ published OGC Well Known Text standard with the following considerations: .. _math_wkt: -`OGC Math Transform WKT Record`_ +`OGC Math Transform WKT Record`_ (Optional) ................................................................................ -**Optional** - Writers may include an optional OGC Math Transform WKT Record to provide a supplemental parameterized math transform definition. @@ -82,11 +78,9 @@ specification being used by :ref:`crs_wkt`, with the following considerations: .. _epoch: -`Epoch Record`_ +`Epoch Record`_ (Optional) ................................................................................ -**Optional** - +-----------------+-----------------------------+ | User ID | LASF_Projection | +-----------------+-----------------------------+ From dd10f3b0fa4f952e944065e3ed265e2f7163d83c Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 21 Nov 2024 11:35:54 -0800 Subject: [PATCH 036/103] Choose one anchor tag system --- source/03_crs.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/03_crs.txt b/source/03_crs.txt index ba31dfb..e700e97 100644 --- a/source/03_crs.txt +++ b/source/03_crs.txt @@ -15,7 +15,7 @@ the :ref:`Global Encoding ` bit. .. _crs_wkt: -`OGC Coordinate System WKT Record`_ (Required) +OGC Coordinate System WKT Record (Required) ................................................................................ The WKT record is **required** and can be specified as either a VLR or an @@ -56,7 +56,7 @@ published OGC Well Known Text standard with the following considerations: .. _math_wkt: -`OGC Math Transform WKT Record`_ (Optional) +OGC Math Transform WKT Record (Optional) ................................................................................ Writers may include an optional OGC Math Transform WKT Record to provide a @@ -78,7 +78,7 @@ specification being used by :ref:`crs_wkt`, with the following considerations: .. _epoch: -`Epoch Record`_ (Optional) +Epoch Record (Optional) ................................................................................ +-----------------+-----------------------------+ From 1d8a49c0f0ecdd330cb44ccee948f330ffb53b86 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 21 Nov 2024 11:41:48 -0800 Subject: [PATCH 037/103] Fixed accidental removal of Time offset --- source/02.04_header.sub | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index c8b7bb5..585ba90 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -201,8 +201,16 @@ a value of 1). This bit field is defined as: | | | 1 x :math:`10^6` x Time Offset. The Time | | | | :ref:`Time Offset ` | | | | is specified in the LAS header. | + | | | The offset moves time to near zero to | + | | | improve floating-point resolution for a | + | | | given time period. | + | | | The origin of standard GPS | + | | | Time is defined as midnight of the | + | | | morning of January 6, 1980. | + | | | The GPS Time Type flag must be set if | + | | | the Time Offset Flag is set. | +-------+-----------------------+------------------------------------------+ - | 6:15 | Reserved | Must be set to zero (0). | + | 7:15 | Reserved | Must be set to zero (0). | +-------+-----------------------+------------------------------------------+ From e61c56b94bbb24dfe9916836d593ac5281a30640 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 21 Nov 2024 11:50:16 -0800 Subject: [PATCH 038/103] Added CRS diff to intro --- source/01_intro.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/01_intro.txt b/source/01_intro.txt index a1b08d6..2db1b80 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -32,10 +32,14 @@ The additions of LAS 1.5 include: * Backward compatibility with LAS 1.1 – LAS 1.4. * LAS 1.5 mode which supports: + * Removed support for PDRFs 0-5. + (`I-128 `_) * Added Max/Min GPS Time fields to header block. (`I-118 `_) * Added Offset GPS Time definition. (`I-6 `_) + * CRS support expanded to all published WKT versions, removing support for GeoTIFF CRS encoding. + (`I-144 `_) LAS 1.4 Revision History ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 200d59d3df80575b39265db4e1b0307edba39abf Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 21 Nov 2024 11:55:01 -0800 Subject: [PATCH 039/103] Clarify WKT global encoding bit --- source/02.04_header.sub | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index 585ba90..d592873 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -182,8 +182,8 @@ a value of 1). This bit field is defined as: | | | multiple returns. | +-------+-----------------------+------------------------------------------+ | 4 | WKT | If set, the Coordinate Reference System | - | | | (CRS) is WKT. This bit must be set. | - | | | GeoTIFF CRS definitions are not | + | | | (CRS) is WKT. This bit must be set in | + | | | LAS 1.5; GeoTIFF CRS definitions are not | | | | supported for legacy | | | | compatibility beginning with LAS 1.5. | +-------+-----------------------+------------------------------------------+ From 4b69b02081686e4024e6bfd8ecc7439c1eea8efe Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 21 Nov 2024 12:00:00 -0800 Subject: [PATCH 040/103] Strengthen prohibition against geotiff encoding --- source/03_crs.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/03_crs.txt b/source/03_crs.txt index e700e97..9426d8a 100644 --- a/source/03_crs.txt +++ b/source/03_crs.txt @@ -5,14 +5,16 @@ Coordinate Reference System -------------------------------------------------------------------------------- +Coordinate Reference System (CRS) information is required for a LAS 1.5 file. LAS 1.5 defines VLRs in :ref:`vlrdef_label` and EVLRs in :ref:`evlrdef_label` and -requires them for specifying the coordinate reference system of the file. -Specification of Coordinate Reference System (CRS) information is required. +requires them for specifying the Coordinate Reference System (CRS) of the file. CRS information shall be placed in VLRs or EVLRs and represented as `OGC Well Known Text `__ (WKT) without regard to the :ref:`Global Encoding ` bit. +GeoTIFF CRS representations are no longer supported as of LAS 1.5. + .. _crs_wkt: OGC Coordinate System WKT Record (Required) From 0d896fdd5e5b4453545546560162caef9ba0567e Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 21 Nov 2024 16:17:27 -0800 Subject: [PATCH 041/103] Fixed WKT issue links --- source/01_intro.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/01_intro.txt b/source/01_intro.txt index 2db1b80..f3ad64b 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -39,7 +39,8 @@ The additions of LAS 1.5 include: * Added Offset GPS Time definition. (`I-6 `_) * CRS support expanded to all published WKT versions, removing support for GeoTIFF CRS encoding. - (`I-144 `_) + (`I-95 `_, + `I-129 `_) LAS 1.4 Revision History ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 467380fa41ce79b3362e5455f7880077c8ee995c Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 19 Dec 2024 11:41:38 -0800 Subject: [PATCH 042/103] Clarify that there must only be one ExtraBytes VLR. (#150) --- source/01_intro.txt | 2 ++ source/04_optional_vlrs.txt | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/source/01_intro.txt b/source/01_intro.txt index 3fc1630..fa27a06 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -34,6 +34,8 @@ The additions of LAS 1.5 include: * Added Max/Min GPS Time fields to header block. (`I-118 `_) + * Clarify requirement that the Extra Bytes VLR must be unique. + (`I-150 `_) LAS 1.4 Revision History ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index 2e8c7b4..2ca8430 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -106,6 +106,10 @@ by another software. Descriptive names such as "normalized reflectivity", "echo width", or "shading normal" are encouraged. The use of generic names such as "variable1" or "temp1" is discouraged. +Only one Extra Bytes VLR may exist in a given LAS file. If an Extra Bytes VLR +already exists in a LAS file, then new Extra Byte definitions must be added to +the existing Extra Bytes VLR. + Multiple sequential "extra byte" records can compose an array of associated values. It is recommended that each member's name be consistent with other members, only varying by an index number wrapped in square brackets, as in From 79371bbd78689cf31578285cffae8571ff15baed Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 19 Dec 2024 11:59:42 -0800 Subject: [PATCH 043/103] Add OGC citation for epoch VLR and strength language --- source/03_crs.txt | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/source/03_crs.txt b/source/03_crs.txt index 9426d8a..d3ffe37 100644 --- a/source/03_crs.txt +++ b/source/03_crs.txt @@ -92,15 +92,15 @@ Epoch Record (Optional) The date against which coordinates in the LAS file are referenced in a dynamic coordinate reference system is expressed as a decimal year in the Gregorian calendar stored as a double. For example, an epoch of 2017-03-25 in the -Gregorian calendar would be stored as ``2017.23`` in the VLR (``2017 + 84/365``). - -.. note:: - - OGC WKT2 (18-010r7) and later supports the definition of ``EPOCH``, which - should negate the need for an explicit epoch VLR entry on the file. It is - recommended to add `Epoch Record`_ VLRs only for WKT versions earlier than - 18-010r7. - - `GDAL `__ provides excellent documentation on coordinate - epochs for coordinate reference systems and their usages in raster data - formats like GeoTIFF at https://gdal.org/user/coordinate_epoch.html +Gregorian calendar would be stored as ``2017.23`` in the VLR (``2017 + 84/365``), +as described in OGC Abstract Specification Topic 2 +(`18-005r4`__). + +OGC WKT2 (18-010r7) and later supports the definition of ``EPOCH``, which +should negate the need for an explicit epoch VLR entry on the file. It is +strongly recommended to add Epoch Record VLRs only for CRS definitions +relying on WKT versions earlier than 18-010r7. + +`GDAL `__ provides excellent documentation on coordinate +epochs for coordinate reference systems and their usages in raster data +formats like GeoTIFF. From df8a259fa909413b356d79e7b3c347f33f8e2eeb Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 16 Jan 2025 11:49:01 -0800 Subject: [PATCH 044/103] Converted epoch VLR to summary of WKT versions --- source/03_crs.txt | 44 ++++++++++++-------------------------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/source/03_crs.txt b/source/03_crs.txt index d3ffe37..3670135 100644 --- a/source/03_crs.txt +++ b/source/03_crs.txt @@ -42,11 +42,18 @@ published OGC Well Known Text standard with the following considerations: .. note:: Any published version of an OGC WKT standard is a valid definition for LAS 1.5. - OGC has published multiple versions of WKT, including `18-010 - `__ (commonly called "WKT2" - or "WKTv2") and `12-063r5 `__ - (commonly called "WKT1" and the formally ratified variant of WKT that was used - for LAS 1.4). If OGC were to publish a new WKT standard, it would also be a + OGC has published multiple versions of WKT, including the following noteworthy versions: + + * `18-010r11 `__ - Commonly called "WKT2" + or "WKTv2" and is the most current version of WKT as of this publication. + * `18-010r7 `__ - This variant of "WKT2" + added supports the definition of ``EPOCH`` for defining the date against which + coordinates in the LAS file are referenced in a dynamic coordinate reference system. + * `12-063r5 `__ - + Commonly called "WKT1" and the formally ratified variant of WKT that was used + for LAS 1.4. + + If OGC were to publish a new WKT standard, it would also be a valid definition for LAS 1.5. .. note:: @@ -77,30 +84,3 @@ specification being used by :ref:`crs_wkt`, with the following considerations: * The OGC Math Transform WKT VLR data shall be considered UTF-8. * The OGC Math Transform WKT VLR data shall be considered C locale-based, and no localization of the numeric strings within the WKT should be performed. - -.. _epoch: - -Epoch Record (Optional) -................................................................................ - -+-----------------+-----------------------------+ -| User ID | LASF_Projection | -+-----------------+-----------------------------+ -| Record ID | 2113 | -+-----------------+-----------------------------+ - -The date against which coordinates in the LAS file are referenced in a dynamic -coordinate reference system is expressed as a decimal year in the Gregorian -calendar stored as a double. For example, an epoch of 2017-03-25 in the -Gregorian calendar would be stored as ``2017.23`` in the VLR (``2017 + 84/365``), -as described in OGC Abstract Specification Topic 2 -(`18-005r4`__). - -OGC WKT2 (18-010r7) and later supports the definition of ``EPOCH``, which -should negate the need for an explicit epoch VLR entry on the file. It is -strongly recommended to add Epoch Record VLRs only for CRS definitions -relying on WKT versions earlier than 18-010r7. - -`GDAL `__ provides excellent documentation on coordinate -epochs for coordinate reference systems and their usages in raster data -formats like GeoTIFF. From 63dd862008c2d97c60eefeeba378390b670cbb82 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 16 Jan 2025 11:51:11 -0800 Subject: [PATCH 045/103] Removed redundant note about Geotiff not being supported --- source/03_crs.txt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/source/03_crs.txt b/source/03_crs.txt index 3670135..924534f 100644 --- a/source/03_crs.txt +++ b/source/03_crs.txt @@ -56,13 +56,6 @@ published OGC Well Known Text standard with the following considerations: If OGC were to publish a new WKT standard, it would also be a valid definition for LAS 1.5. -.. note:: - - LAS 1.4 supported a dual definition of coordinate system depending on the - PDRF. PDRFs 0-5 were able to have their coordinate systems defined by - GeoTIFF keys, but they were removed in LAS 1.5. It is no longer possible - or valid to define coordinate system information with GeoTIFF keys in LAS 1.5. - .. _math_wkt: OGC Math Transform WKT Record (Optional) From ad1a63137a983676fdfe56f64b964549bc82334a Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 16 Jan 2025 12:00:04 -0800 Subject: [PATCH 046/103] Typo fix --- source/03_crs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/03_crs.txt b/source/03_crs.txt index 924534f..6705af8 100644 --- a/source/03_crs.txt +++ b/source/03_crs.txt @@ -47,7 +47,7 @@ published OGC Well Known Text standard with the following considerations: * `18-010r11 `__ - Commonly called "WKT2" or "WKTv2" and is the most current version of WKT as of this publication. * `18-010r7 `__ - This variant of "WKT2" - added supports the definition of ``EPOCH`` for defining the date against which + added support for the definition of ``EPOCH`` for defining the date against which coordinates in the LAS file are referenced in a dynamic coordinate reference system. * `12-063r5 `__ - Commonly called "WKT1" and the formally ratified variant of WKT that was used From 307acab478f47c6788c4137530973150a0c73bcd Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 16 Jan 2025 13:32:43 -0800 Subject: [PATCH 047/103] Update copyright year --- source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/conf.py b/source/conf.py index fbf4a8b..c226979 100644 --- a/source/conf.py +++ b/source/conf.py @@ -55,7 +55,7 @@ # General information about the project. project = u'LAS' -copyright = u'2024, ASPRS' +copyright = u'2025, ASPRS' author = u'ASPRS' # The version info for the project you're documenting, acts as replacement for From a9dfa226444fe1a2cf0692f182bb4fb17ab7cbeb Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 16 Jan 2025 13:38:40 -0800 Subject: [PATCH 048/103] Added #104 to WKT ticket list --- source/01_intro.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/source/01_intro.txt b/source/01_intro.txt index 8644d36..ed0750b 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -40,6 +40,7 @@ The additions of LAS 1.5 include: (`I-6 `_) * CRS support expanded to all published WKT versions, removing support for GeoTIFF CRS encoding. (`I-95 `_, + `I-104 `_, `I-129 `_) * Clarify requirement that the Extra Bytes VLR must be unique. (`I-150 `_) From b7c55f81a8e314df59cd2a998bb8613dd061c7d6 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 20 Feb 2025 09:46:37 -0800 Subject: [PATCH 049/103] Moved page break to start of 2.0 for consistency --- source/01_intro.txt | 4 ---- source/02.00_definition.txt | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/01_intro.txt b/source/01_intro.txt index ed0750b..72e1ace 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -217,7 +217,3 @@ followed at http://www.opengeospatial.org/standards/community. .. _`OGC`: http://www.opengeospatial.org -.. raw:: latex - - \newpage - diff --git a/source/02.00_definition.txt b/source/02.00_definition.txt index 6e80c14..3c41061 100644 --- a/source/02.00_definition.txt +++ b/source/02.00_definition.txt @@ -1,3 +1,7 @@ +.. raw:: latex + + \newpage + LAS Format Definition -------------------------------------------------------------------------------- From 518b5b8b09e8e2706eae3e55d7e5c55eba992a1e Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 20 Feb 2025 09:53:32 -0800 Subject: [PATCH 050/103] Update OGC links --- source/01_intro.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/01_intro.txt b/source/01_intro.txt index 72e1ace..c88916a 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -207,13 +207,13 @@ this standard can be directed to ASPRS: OGC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -LAS has been recognized by the Open Geospatial Consortium (`OGC`_) in 2018 as an +LAS has been recognized by the Open Geospatial Consortium (`OGC`_) since 2018 as an OGC Community Standard. The OGC version of the document with forward material about standards that LAS references and its status within the standard body can -be found at https://portal.opengeospatial.org/files/17-030r1. +be found at https://www.ogc.org/publications/standard/las/. Future recognition and activity on OGC referencing activities of LAS can be -followed at http://www.opengeospatial.org/standards/community. +followed at https://www.ogc.org/publications/. -.. _`OGC`: http://www.opengeospatial.org +.. _`OGC`: https://www.ogc.org From f17bc21651fa656b367f5d18ed43de380a72ac61 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 20 Feb 2025 10:01:09 -0800 Subject: [PATCH 051/103] Add vscode to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 567609b..f785746 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ build/ +.vscode From 913e9b462e2f6c9268e7f2b403bd227b12120a90 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 20 Feb 2025 10:01:09 -0800 Subject: [PATCH 052/103] Add vscode to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 567609b..f785746 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ build/ +.vscode From 61e250b8b44b247a946d201b871366f50b206a0a Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Tue, 11 Mar 2025 10:15:46 -0700 Subject: [PATCH 053/103] Add wiki link for user-contributed VLRs. --- source/04_optional_vlrs.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index 8086fd9..f7f0823 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -7,6 +7,13 @@ Optional VLR Definitions -------------------------------------------------------------------------------- +LAS 1.5 defines Variable Length Records (VLRs) in :ref:`vlrdef_label` and EVLRs +in :ref:`evlrdef_label`. Definitions for official VLRs as part of the specification +are provided in this section as a means to extend the LAS file format. + +Additional VLR definitions contributed by the LAS Working Group and the +LAS community can be found on the official LAS wiki: https://github.com/ASPRSorg/LAS/ + Classification Lookup ................................................................................ From c2293ca1591e0f97f2e52f15b4a7653550877f59 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Tue, 11 Mar 2025 10:16:13 -0700 Subject: [PATCH 054/103] Removed outdated Classification Lookup VLR. (#82) --- source/04_optional_vlrs.txt | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index f7f0823..d63ff09 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -14,25 +14,6 @@ are provided in this section as a means to extend the LAS file format. Additional VLR definitions contributed by the LAS Working Group and the LAS community can be found on the official LAS wiki: https://github.com/ASPRSorg/LAS/ -Classification Lookup -................................................................................ - -+----------------------------+-----------------------------------+ -| User ID | LASF_Spec | -+----------------------------+-----------------------------------+ -| Record ID | 0 | -+----------------------------+-----------------------------------+ -| Record Length after Header | 256 records * 16 bytes per struct | -+----------------------------+-----------------------------------+ - -:: - - struct CLASSIFICATION { - uint8_t ClassNumber; - char Description[15]; - }; //total of 16 bytes - - Text Area Description ................................................................................ From 329e138631596b40d217c3d998a844c0b38ad757 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Tue, 11 Mar 2025 10:47:16 -0700 Subject: [PATCH 055/103] Update upload-artifact to v4 --- .github/workflows/pdf.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index e2af798..8ac9311 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -28,11 +28,11 @@ jobs: - name: Spelling run: | make spelling - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: PDF path: build/latex/LAS.pdf - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: Misspelled path: build/spelling/output.txt From aef2601ea69f5e41dfccb01f64b31b3649ccdd87 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Tue, 11 Mar 2025 10:51:41 -0700 Subject: [PATCH 056/103] Configure warnings for file-not-found. --- .github/workflows/pdf.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index 8ac9311..b749a9d 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -32,10 +32,12 @@ jobs: with: name: PDF path: build/latex/LAS.pdf + if-no-files-found: error - uses: actions/upload-artifact@v4 with: name: Misspelled path: build/spelling/output.txt + if-no-files-found: ignore From 6e9bd9b1c3cb345d14e852a4c730e118b1695fe5 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Tue, 11 Mar 2025 10:56:12 -0700 Subject: [PATCH 057/103] Improve readability of Optional VLR section intro. --- source/04_optional_vlrs.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index d63ff09..2ba702b 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -7,11 +7,9 @@ Optional VLR Definitions -------------------------------------------------------------------------------- -LAS 1.5 defines Variable Length Records (VLRs) in :ref:`vlrdef_label` and EVLRs -in :ref:`evlrdef_label`. Definitions for official VLRs as part of the specification +Definitions for official :ref:`vlrdef_label` and :ref:`evlrdef_label` are provided in this section as a means to extend the LAS file format. - -Additional VLR definitions contributed by the LAS Working Group and the +Additional (E)VLR definitions contributed by the LAS Working Group and the LAS community can be found on the official LAS wiki: https://github.com/ASPRSorg/LAS/ Text Area Description From 5631cae7309fbcee57cc1720df067b6ddca2b0d6 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Tue, 11 Mar 2025 10:57:53 -0700 Subject: [PATCH 058/103] Standardize VLR/EVLR notation --- source/02.02_crs.sub | 6 +++--- source/04_optional_vlrs.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/02.02_crs.sub b/source/02.02_crs.sub index 9b0cdb6..bc7e71b 100644 --- a/source/02.02_crs.sub +++ b/source/02.02_crs.sub @@ -27,9 +27,9 @@ The CRS representation is summarized below: | 6-10 | Error | WKT | +-----------------------+----------------------------+-----------------------+ -It is considered a file error to have more than one GeoTIFF (E)VLR or more than -one WKT (E)VLR in the file. A writer can append a new CRS EVLR to a file by -"superseding" the existing CRS (E)VLR. Superseding is performed by changing the +It is considered a file error to have more than one GeoTIFF VLR/EVLR or more than +one WKT VLR/EVLR in the file. A writer can append a new CRS EVLR to a file by +"superseding" the existing CRS VLR/EVLR. Superseding is performed by changing the LAS_Spec ID of the record to ":ref:`superseded_vlr_label`", a new LASF_Spec defined in this release. diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index 2ba702b..d0f5f6c 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -9,7 +9,7 @@ Optional VLR Definitions Definitions for official :ref:`vlrdef_label` and :ref:`evlrdef_label` are provided in this section as a means to extend the LAS file format. -Additional (E)VLR definitions contributed by the LAS Working Group and the +Additional VLR/EVLR definitions contributed by the LAS Working Group and the LAS community can be found on the official LAS wiki: https://github.com/ASPRSorg/LAS/ Text Area Description From 95149934a9e8c19bd783dde933194bcffa82a629 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Tue, 11 Mar 2025 12:32:06 -0700 Subject: [PATCH 059/103] Update ASPRS logo on title page (#131) --- source/_static/ASPRS_Logo_Blue.png | Bin 0 -> 54977 bytes source/_static/asprslogo45.png | Bin 20512 -> 0 bytes source/conf.py | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 source/_static/ASPRS_Logo_Blue.png delete mode 100644 source/_static/asprslogo45.png diff --git a/source/_static/ASPRS_Logo_Blue.png b/source/_static/ASPRS_Logo_Blue.png new file mode 100644 index 0000000000000000000000000000000000000000..d392414c7c1d2475ba654b7480627b4bcb21aec2 GIT binary patch literal 54977 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 YA!2UQ{(uxc3+-X3DrzZI%2|c|4}j_@XaE2J literal 0 HcmV?d00001 diff --git a/source/_static/asprslogo45.png b/source/_static/asprslogo45.png deleted file mode 100644 index 79fff8df5b786bfeb2a4917f152279859716b7a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20512 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 CYv$kp diff --git a/source/conf.py b/source/conf.py index c226979..f8d6045 100644 --- a/source/conf.py +++ b/source/conf.py @@ -277,7 +277,7 @@ def get_git_revision_short_hash(): latex_toplevel_sectioning='section' latex_show_urls='footnote' -latex_logo = './_static/asprslogo45.png' +latex_logo = './_static/ASPRS_Logo_Blue.png' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, From 4fd594d561a369adb4f415dc5b3f772ae7c763ab Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Tue, 11 Mar 2025 10:47:16 -0700 Subject: [PATCH 060/103] Update upload-artifact to v4 --- .github/workflows/pdf.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index e2af798..8ac9311 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -28,11 +28,11 @@ jobs: - name: Spelling run: | make spelling - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: PDF path: build/latex/LAS.pdf - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: Misspelled path: build/spelling/output.txt From 2b1218ee5a65fbf343ca2f89fe215e9a108b75f7 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Tue, 11 Mar 2025 10:51:41 -0700 Subject: [PATCH 061/103] Configure warnings for file-not-found. --- .github/workflows/pdf.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index 8ac9311..b749a9d 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -32,10 +32,12 @@ jobs: with: name: PDF path: build/latex/LAS.pdf + if-no-files-found: error - uses: actions/upload-artifact@v4 with: name: Misspelled path: build/spelling/output.txt + if-no-files-found: ignore From a56fb964e444f338c1468a45fd9cf2efac8cd310 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Tue, 11 Mar 2025 13:40:55 -0700 Subject: [PATCH 062/103] Update upload-artifact to v4 --- .github/workflows/pdf.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index e2af798..b749a9d 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -28,14 +28,16 @@ jobs: - name: Spelling run: | make spelling - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: PDF path: build/latex/LAS.pdf - - uses: actions/upload-artifact@v3 + if-no-files-found: error + - uses: actions/upload-artifact@v4 with: name: Misspelled path: build/spelling/output.txt + if-no-files-found: ignore From df162fafb2c395c9e324a46ba05ab8ac1024d958 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Tue, 11 Mar 2025 15:06:54 -0700 Subject: [PATCH 063/103] Normalize LAS wiki links to be internal links --- source/01_intro.txt | 13 ++++++++++++- source/02.04_header.sub | 6 +++--- source/02.06_point.sub | 2 +- source/04_optional_vlrs.txt | 2 +- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/source/01_intro.txt b/source/01_intro.txt index c88916a..b25a7d5 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -145,6 +145,8 @@ Summary of LAS 1.4 revisions (GitHub Issue numbers included when applicable): (`I-55 `_) * Clarified how and when certain header fields should be zero-filled. (`I-101 `_) + * Added Official LAS Wiki section. + (`I-71 `_) * More closely aligned data types with C99 definitions. (`I-115 `_) @@ -178,7 +180,7 @@ The additions of LAS 1.4 include: * Added definitions for "LAS Domain Profile" and "LAS Domain Profile Description". - * Added links to official LAS wiki: https://github.com/ASPRSorg/LAS/wiki + * Added references to :ref:`Official LAS Wiki `. Conformance @@ -217,3 +219,12 @@ followed at https://www.ogc.org/publications/. .. _`OGC`: https://www.ogc.org + +.. _laswiki_link: + +Official LAS Wiki +................................................................................ + +The official LAS wiki hosts supplemental guidance pages, links to external +resources, public registries, and more LAS-related resources. +The wiki can be found at https://github.com/ASPRSorg/LAS/wiki. diff --git a/source/02.04_header.sub b/source/02.04_header.sub index d592873..66a7376 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -227,7 +227,7 @@ file can be uniquely identified, globally. .. note:: Example implementations of representing the Project ID fields as a GUID can - be found on the official LAS wiki: https://github.com/ASPRSorg/LAS/wiki + be found on the :ref:`Official LAS Wiki `. **Version Number** @@ -445,8 +445,8 @@ The Time Offset field can be used to optimize :ref:`GPS Time ` pre Offset GPS Time for a point record is equal to standard GPS Time, minus :math:`10^6` * Time Offset. For example, Adjusted Standard GPS Time uses a total offset of 1 billion (:math:`10^9`) seconds, which would be specified by a Time Offset of 1000. -This achieves 100 nanosecond precision for the years 2007-2015. The LAS wiki provides -`recommended values `_ +This achieves 100 nanosecond precision for the years 2007-2015. The +:ref:`Official LAS Wiki ` provides recommended values and year ranges that users are encouraged to use to maximize compatibility between datasets. This value must be set to zero if there are no point records in the file, diff --git a/source/02.06_point.sub b/source/02.06_point.sub index 9aabe6b..c859231 100644 --- a/source/02.06_point.sub +++ b/source/02.06_point.sub @@ -668,7 +668,7 @@ and the vertical units are meters. .. note:: Users seeking further clarity regarding LAS waveform encoding are encouraged - to learn more on the official LAS wiki: https://github.com/ASPRSorg/LAS/wiki + to learn more on the :ref:`Official LAS Wiki `. .. raw:: latex diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index 8086fd9..47299c2 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -306,6 +306,6 @@ absolute digitizer voltage using the formula: .. note:: Users seeking further clarity regarding LAS waveform encoding are encouraged - to learn more on the official LAS wiki: https://github.com/ASPRSorg/LAS/wiki + to learn more on the :ref:`Official LAS Wiki `. From 6e715a9a775956500039ef77b0f51f839384e90f Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 20 Mar 2025 11:35:48 -0700 Subject: [PATCH 064/103] Restore Classification Lookup VLR, but deprecated --- source/04_optional_vlrs.txt | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index d0f5f6c..3278fd1 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -12,6 +12,29 @@ are provided in this section as a means to extend the LAS file format. Additional VLR/EVLR definitions contributed by the LAS Working Group and the LAS community can be found on the official LAS wiki: https://github.com/ASPRSorg/LAS/ +Classification Lookup (Deprecated) +................................................................................ + ++----------------------------+-----------------------------------+ +| User ID | LASF_Spec | ++----------------------------+-----------------------------------+ +| Record ID | 0 | ++----------------------------+-----------------------------------+ +| Record Length after Header | 256 records * 16 bytes per struct | ++----------------------------+-----------------------------------+ + +The legacy Classification Lookup VLR has a feature of the LAS specification +since LAS 1.0. This VLR has been deprecated in LAS 1.5 due to 15 characters +being too short to store a sufficiently detailed description. An updated +version of the VLR can be found on the LAS wiki. + +:: + + struct CLASSIFICATION { + uint8_t ClassNumber; + char Description[15]; + }; //total of 16 bytes + Text Area Description ................................................................................ From 9d7c138606d159908ae2f9f7850e3ee590e9a194 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 20 Mar 2025 11:37:10 -0700 Subject: [PATCH 065/103] Normalize LAS wiki links to match #71 --- source/04_optional_vlrs.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index 7fca436..72ccae0 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -10,7 +10,7 @@ Optional VLR Definitions Definitions for official :ref:`vlrdef_label` and :ref:`evlrdef_label` are provided in this section as a means to extend the LAS file format. Additional VLR/EVLR definitions contributed by the LAS Working Group and the -LAS community can be found on the official LAS wiki: https://github.com/ASPRSorg/LAS/ +LAS community can be found on the :ref:`Official LAS Wiki `. Classification Lookup (Deprecated) ................................................................................ @@ -26,7 +26,7 @@ Classification Lookup (Deprecated) The legacy Classification Lookup VLR has a feature of the LAS specification since LAS 1.0. This VLR has been deprecated in LAS 1.5 due to 15 characters being too short to store a sufficiently detailed description. An updated -version of the VLR can be found on the LAS wiki. +version of the VLR can be found on the :ref:`Official LAS Wiki `. :: From d1f9b555675538cbcea1b32bf99ae139ee52d9e2 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 20 Mar 2025 11:40:57 -0700 Subject: [PATCH 066/103] Added deprecation notice to intro. #82 --- source/01_intro.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/01_intro.txt b/source/01_intro.txt index b25a7d5..32609ea 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -44,6 +44,8 @@ The additions of LAS 1.5 include: `I-129 `_) * Clarify requirement that the Extra Bytes VLR must be unique. (`I-150 `_) + * Deprecated Classification Lookup VLR. + (`I-82 `_) LAS 1.4 Revision History ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 323af37583f8dfc42e6ae90a8ce82ea96457580c Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 20 Mar 2025 11:57:36 -0700 Subject: [PATCH 067/103] Wording changes to deprecation notice. #82 --- source/04_optional_vlrs.txt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index 72ccae0..400e722 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -23,11 +23,6 @@ Classification Lookup (Deprecated) | Record Length after Header | 256 records * 16 bytes per struct | +----------------------------+-----------------------------------+ -The legacy Classification Lookup VLR has a feature of the LAS specification -since LAS 1.0. This VLR has been deprecated in LAS 1.5 due to 15 characters -being too short to store a sufficiently detailed description. An updated -version of the VLR can be found on the :ref:`Official LAS Wiki `. - :: struct CLASSIFICATION { @@ -35,6 +30,12 @@ version of the VLR can be found on the :ref:`Official LAS Wiki `. char Description[15]; }; //total of 16 bytes +The legacy Classification Lookup VLR (Record ID 0) has been a feature of the LAS specification +since LAS 1.0. This VLR is deprecated in LAS 1.5 due to the limitation of +15 characters being insufficient for a detailed description. An updated +version of the VLR may be found on the :ref:`Official LAS Wiki `. + + Text Area Description ................................................................................ From 2f23ade1ea5f699f6aae2189666ad98ecbc6e01f Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Mon, 7 Apr 2025 09:04:19 -0700 Subject: [PATCH 068/103] Table formatting corrections --- .github/workflows/pdf.yml | 5 +++++ source/02.04_header.sub | 4 ++-- source/conf.py | 20 ++++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index b749a9d..ec6300c 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -33,6 +33,11 @@ jobs: name: PDF path: build/latex/LAS.pdf if-no-files-found: error + - uses: actions/upload-artifact@v4 + with: + name: TEX + path: build/latex/LAS.tex + if-no-files-found: error - uses: actions/upload-artifact@v4 with: name: Misspelled diff --git a/source/02.04_header.sub b/source/02.04_header.sub index 66a7376..a6acade 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -8,8 +8,8 @@ Public Header Block .. table:: Public Header Block +----------------------------------+-------------------------+-----------------+-----------+--------------+ - | **Item** | **Format** | **Byte Offset** | **Size** | **Required** | - +----------------------------------+-------------------------+-----------------+-----------+--------------+ + | Item | Format | Byte Offset | Size | Required | + +==================================+=========================+=================+===========+==============+ | File Signature ("LASF") | char[4] | 0 | 4 bytes | yes | +----------------------------------+-------------------------+-----------------+-----------+--------------+ | File Source ID | uint16_t | 4 | 2 bytes | yes | diff --git a/source/conf.py b/source/conf.py index c226979..07c9906 100644 --- a/source/conf.py +++ b/source/conf.py @@ -117,6 +117,11 @@ def get_git_revision_short_hash(): # further. For a list of options available for each theme, see the # documentation. # +# HTML theme options in Alabaster here: +# https://alabaster.readthedocs.io/en/latest/customization.html +# Alabaster default CSS is here: +# https://github.com/sphinx-doc/alabaster/blob/master/alabaster/static/alabaster.css_t + # html_theme_options = {} # Add any paths that contain custom static files (such as style sheets) here, @@ -158,6 +163,7 @@ def get_git_revision_short_hash(): % Override Sphinx defaults for table heading (bold instead of sans serif) % https://stackoverflow.com/a/42988749/1666676 +% https://github.com/sphinx-doc/sphinx/blob/a6d7ae16739bf92a032a7c4df0297db7cf120ec9/sphinx/texinputs/sphinxlatexstyletext.sty#L46 \protected\def\sphinxstyletheadfamily{\bfseries} % leave this here... https://tex.stackexchange.com/a/8353/143333 @@ -273,8 +279,22 @@ def get_git_revision_short_hash(): # Don't use atendofbody. Use fancyhdr calls in preamble instead (above). # 'atendofbody': """American Society for Photogrammetry \& Remote Sensing \\ LAS SPECIFICATION \\""" + releasename + + # Customize sphinx setup parameters + # https://www.sphinx-doc.org/en/master/latex.html#latexsphinxsetup + # 'sphinxsetup': "TableRowColorOdd={rgb}{0,0,255},TableRowColorEven={rgb}{0,255,0}", + # 'sphinxsetup': "TableRowColorHeader={rgb}{235,235,235}", } +# Customize latex table styles: https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-latex_table_style +# Defaults are latex_table_style = ['booktabs', 'colorrows'] +# You can override for specific tables using rst-class directive +# https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#rstclass + +# Override default table styles back to plain tables because of aliasing issues with booktabs +# latex_table_style = ['booktabs', 'colorrows'] +latex_table_style = ['standard'] + latex_toplevel_sectioning='section' latex_show_urls='footnote' latex_logo = './_static/asprslogo45.png' From f5cb11722ecc6580bdc1ca9425c93cfb5727deaa Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Mon, 7 Apr 2025 09:21:57 -0700 Subject: [PATCH 069/103] Spellcheck updates --- .github/workflows/pdf.yml | 2 -- source/spelling_wordlist.txt | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index ec6300c..bc52adc 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -44,5 +44,3 @@ jobs: path: build/spelling/output.txt if-no-files-found: ignore - - diff --git a/source/spelling_wordlist.txt b/source/spelling_wordlist.txt index c775cf5..d98547c 100644 --- a/source/spelling_wordlist.txt +++ b/source/spelling_wordlist.txt @@ -38,3 +38,4 @@ photogrammetrically Geospatial TerraScan OpenGIS +uint From 51a6ebca2934a9f366952a55ae1cb72ee3dd34f7 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Mon, 7 Apr 2025 13:09:20 -0700 Subject: [PATCH 070/103] Update ASPRS contact info. --- source/01_intro.txt | 2 +- source/conf.py | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/source/01_intro.txt b/source/01_intro.txt index b25a7d5..8953b5b 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -202,7 +202,7 @@ organization as directed by the ASPRS Board of Directors. Questions related to this standard can be directed to ASPRS: * Online at https://github.com/ASPRSorg/LAS -* By phone at 301-493-0290 +* By phone at 225-408-4747 * By email at las@asprs.org or asprs@asprs.org * By mail at 8550 United Plaza Blvd, Suite 1001 Baton Rouge, LA 70809 diff --git a/source/conf.py b/source/conf.py index 07c9906..3f826aa 100644 --- a/source/conf.py +++ b/source/conf.py @@ -223,10 +223,9 @@ def get_git_revision_short_hash(): \noindent Published by:\\ } The American Society for Photogrammetry \& Remote Sensing\\ -425 Barlow Place, Suite 210\\ -Bethesda, Maryland 20814-2160\\ -Voice: 301-493-0290\\ -Fax: 225-408-4422\\ +8550 United Plaza Blvd, Suite 1001\\ +Baton Rouge, Louisiana 70809\\ +Voice: 225-408-4747\\ Web: \underline{www.asprs.org}\\ From 47adfeafb4d6479d32d91bf4a934561c1d6c598e Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 17 Apr 2025 10:56:25 -0700 Subject: [PATCH 071/103] Collapse LAS 1.4 references. (#131) --- source/01_intro.txt | 128 +++----------------------------------------- 1 file changed, 8 insertions(+), 120 deletions(-) diff --git a/source/01_intro.txt b/source/01_intro.txt index c88916a..fd2a252 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -21,16 +21,7 @@ LAS 1.5 Revision History Summary of LAS 1.5 revisions (GitHub Issue numbers included when applicable): -* R00 - Approved Version (XXXXXXX). - - -Comparison of LAS 1.5 to Previous Versions -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The additions of LAS 1.5 include: - -* Backward compatibility with LAS 1.1 – LAS 1.4. -* LAS 1.5 mode which supports: +* R00 - Approved Version (Summer 2025). The additions of LAS 1.5 include: * Removed support for PDRFs 0-5. (`I-128 `_) @@ -45,119 +36,13 @@ The additions of LAS 1.5 include: * Clarify requirement that the Extra Bytes VLR must be unique. (`I-150 `_) -LAS 1.4 Revision History -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Summary of LAS 1.4 revisions (GitHub Issue numbers included when applicable): - -* R11 - Approved Version (Nov 2011). -* R12 - Errata (June 2012) - Typographical corrections: - - * Corrected Public Header Size in descriptive paragraph to 375 bytes. - * Corrected two instances of Scan Angle Rank from "Unsigned Char" to "Char". - -* R13 - Added Domain Profile Section (July 2013). -* R14 - Multiple updates (March 2019): - - * Aesthetic changes from migration to GitHub. - * Multiple capitalization & typo corrections. - * Updated ASPRS contact info. - (`I-30 `_) - * Additional standard classifications 19-22 for PDRFs 6-10: - (`I-11 `_, - `I-26 `_) - - * Class 19 -- Overhead Structure in PDRFs 6-10. - * Class 20 -- Ignored Ground. - * Class 21 -- Snow. - * Class 22 -- Temporal Exclusion. - - * Added OGC endorsement. - (`I-31 `_) - * Added minimum PDRF sizes to attribute tables. - (`I-47 `_) - * Section reorganization: - (`I-57 `_) - - * Addition of Table of Contents with section numbers. (c.f. - `I-27 `_, - `I-49 `_) - * Divided Defined Variable Length Records section into Coordinate - Reference System VLRs section (s3) and Other Specification Defined - VLRs (s4). - * Expanded EVLR discussion in Legacy Compatibility section (s2.1) and moved - Legacy Compatibility section to EVLR definition (now s2.7.1). - * Swapped order of LAS 1.4 Revision History (now s1.1.1) and - LAS 1.4 Additions (now s1.1.2). - * Rearranged paragraphs in Extra Bytes VLR description. - - * Deprecated "tuple" and "triple" extra byte data types. - (`I-1 `_) - - * Added explanation and example of implicit arrays from descriptor names. - - * Clarified that ExtraByte min/max should be an untransformed value. - (`I-4 `_) - * Clarified that Legacy Point Counts should be set to zero if using non-legacy - PDRFs. (`I-12 `_) - * Clarified Full Waveform descriptions and added wiki link. - (`I-9 `_) - * Renamed X(t), Y(t), and Z(t) from waveform packets to Parametric dx/dy/dz. - * PDRF9 now correctly requires Scanner Channel like other PDRFs. - (`I-29 `_) - * Clarified origin date/time for Adjusted Standard GPS Time. - (`I-40 `_) - * Clarified null-termination of fixed-length ``char`` arrays, especially VLR - Description. (`I-46 `_) - * Clarified relationship between FileSourceID and PointSourceID. - (`I-59 `_) - * Added language to support technologies other than conventional linear-mode - lidar scanners. (`I-35 `_) - - * Clarified and renamed Synthetic Return Numbers Global Encoding bit. - * Clarified Synthetic point classification flag. - * Clarified validity of zero-value PointSourceID. - * Unified Return Number and Number of Returns descriptions between - legacy and non-legacy PDRFs. - * Clarified Scan Direction and Edge of Flight Line Flags for non-rotational systems. - - * Added wiki link for Project ID examples. - (`I-38 `_) - -* R15 - Errata and typo corrections for R14 (July 2019): - - * Minor editorial punctuation corrections. - (`I-78 `_) - * Fixed unintended reordering of Min/Max XYZ in R14 LAS header. - (`I-79 `_) - * Added missing Scanner Channel field in note about PDRF6-10 bit field. - (`I-80 `_) - -* R16 - DRAFT - - * Clarified uniformity of GPS Time for all returns of a pulse. - (`I-81 `_) - * Added example usage of Overlap bit. - (`I-5 `_) - * Reworded mandatory zero Classification for Synthetic PDRF0-5. - (`I-86 `_) - * Added Byte Offset columns to Header, VLR, EVLR, and PDRF tables. - (`I-55 `_) - * Clarified how and when certain header fields should be zero-filled. - (`I-101 `_) - * More closely aligned data types with C99 definitions. - (`I-115 `_) - -For detailed information on changes in revisions R14 and newer, review the -inline differencing provided on the `GitHub page `_. - Comparison of LAS 1.4 to Previous Versions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The additions of LAS 1.4 include: +The additions of LAS 1.4 (2011-2025) include: -* Backward compatibility with LAS 1.1 – LAS 1.3 when payloads consist of only +* Backward compatibility with LAS 1.1 - LAS 1.3 when payloads consist of only legacy content. * LAS 1.4 mode which supports: @@ -176,9 +61,12 @@ The additions of LAS 1.4 include: * Other minor changes: - * Added definitions for "LAS Domain Profile" and "LAS Domain Profile - Description". + * Added recognition of :ref:`domainprofile_label` functionality. * Added links to official LAS wiki: https://github.com/ASPRSorg/LAS/wiki + * Migration of specification management to GitHub. + * Added language to support technologies other than conventional linear-mode + lidar scanners. + * Closer alignment of data types with C99 definitions. Conformance From 2fc893e1067f1d4622418eeece42e1890e2536c9 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 17 Apr 2025 14:17:54 -0700 Subject: [PATCH 072/103] Remove references to legacy geotiff support. (#131, #128) --- source/02.02_crs.sub | 36 +++++++++--------------------------- source/02.04_header.sub | 5 ++--- 2 files changed, 11 insertions(+), 30 deletions(-) diff --git a/source/02.02_crs.sub b/source/02.02_crs.sub index 9b0cdb6..443c71f 100644 --- a/source/02.02_crs.sub +++ b/source/02.02_crs.sub @@ -1,37 +1,19 @@ Coordinate Reference System (CRS) Representation ................................................................................ -GeoTIFF is being replaced by Well Known Text (WKT) as the required Coordinate -Reference System (CRS) representation for the new point types (6-10) introduced -by LAS 1.4. +Well Known Text (WKT) is the required Coordinate +Reference System (CRS) representation for LAS 1.5. -GeoTIFF is maintained for legacy reasons for point types 0-5. +A "WKT" bit is included in the :ref:`globalencoding_link` field in the Public Header +Block. This bit must be set for LAS 1.5; GeoTIFF CRS definitions for legacy +point formats are no longer supported in LAS 1.5. The CRS for the file must be +located in the WKT (Extended) Variable Length Records (EVLR, VLR). -A "WKT" bit has been added to the Global Encoding flag in the Public Header -Block. If this bit is set, the CRS for the file will be located in the WKT -(Extended) Variable Length Records (EVLR, VLR). - -A file writer who desires to maintain backward compatibility with legacy LAS -for point types 0-5 must add a GeoTIFF VLR to represent the CRS for the file -and ensure that the WKT bit is false. - -The CRS representation is summarized below: - -.. table:: Coordinate Reference System Representation - - +-----------------------+----------------------------+-----------------------+ - | Point Type | WKT bit == False | WKT bit == True | - +=======================+============================+=======================+ - | 0-5 | GeoTIFF | WKT | - +-----------------------+----------------------------+-----------------------+ - | 6-10 | Error | WKT | - +-----------------------+----------------------------+-----------------------+ - -It is considered a file error to have more than one GeoTIFF (E)VLR or more than +It is considered a file error to have more than one WKT (E)VLR in the file. A writer can append a new CRS EVLR to a file by "superseding" the existing CRS (E)VLR. Superseding is performed by changing the -LAS_Spec ID of the record to ":ref:`superseded_vlr_label`", a new LASF_Spec defined in this -release. +Record ID of the (E)VLR to match the :ref:`superseded_vlr_label` VLR defined +later in this document. .. raw:: latex diff --git a/source/02.04_header.sub b/source/02.04_header.sub index d592873..381bdd5 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -183,9 +183,8 @@ a value of 1). This bit field is defined as: +-------+-----------------------+------------------------------------------+ | 4 | WKT | If set, the Coordinate Reference System | | | | (CRS) is WKT. This bit must be set in | - | | | LAS 1.5; GeoTIFF CRS definitions are not | - | | | supported for legacy | - | | | compatibility beginning with LAS 1.5. | + | | | LAS 1.5; GeoTIFF CRS definitions are no | + | | | longer supported in LAS 1.5. | +-------+-----------------------+------------------------------------------+ | 5 | Reserved | Must be set to zero (0). | +-------+-----------------------+------------------------------------------+ From cb6409a401da9654efda5ac5a886b4c6fe846cd9 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 17 Apr 2025 14:26:05 -0700 Subject: [PATCH 073/103] Updated "current" version to LAS 1.5. (#131) Clarify usage of "Legacy" header fields. --- source/01_intro.txt | 2 +- source/02.00_definition.txt | 2 +- source/02.01_legacy.sub | 22 ++++++++++------------ source/04_optional_vlrs.txt | 19 ++++++++++++------- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/source/01_intro.txt b/source/01_intro.txt index fd2a252..26f0b32 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -12,7 +12,7 @@ produce points with X, Y, and Z coordinates. The purpose of LAS is to provide an open format that allows different hardware and software tools to exchange point cloud data in a common format. -This document reflects the fourth revision of the LAS format specification +This document reflects the fifth version of the LAS format specification since its initial version 1.0 release. diff --git a/source/02.00_definition.txt b/source/02.00_definition.txt index 3c41061..beb8966 100644 --- a/source/02.00_definition.txt +++ b/source/02.00_definition.txt @@ -22,7 +22,7 @@ allows, for example, adding projection information to a LAS file without having to rewrite the entire file. -.. table:: LAS 1.4 Format Definition +.. table:: LAS 1.5 Format Definition +--------------------------------------------+ | :ref:`headerblock_label` | diff --git a/source/02.01_legacy.sub b/source/02.01_legacy.sub index 2bb011a..ea00f85 100644 --- a/source/02.01_legacy.sub +++ b/source/02.01_legacy.sub @@ -1,17 +1,15 @@ Legacy Compatibility (LAS 1.1 - LAS 1.3) ................................................................................ -LAS 1.4 moves the file specification from a 32 bit file structure (maximum -value of :math:`2^{32}-1 \equiv 4,294,967,295 \equiv \mbox{UINT32\_MAX}`) to a -64 bit file structure (:math:`2^{64} - 1`). - -To maintain the ability to place a LAS 1.1 through LAS 1.3 payload (point -record types 0-5, GeoTIFF coordinate reference system, referred to as "Legacy" -payloads) in a LAS 1.4 file structure, it is necessary to duplicate some of -the fields within the LAS 1.4 file structure. These duplicate fields are named +LAS 1.4 moved the file specification from a 32 bit file structure to a +64 bit file structure. +To maintain the ability to place a LAS 1.1 through LAS 1.3 payload +in a LAS 1.4 or LAS 1.5 file header, optional support for the 32 bit field +variants is retained alongside the required 64 bit fields. +These duplicate 32 bit fields are named "Legacy xxx" where "xxx" denotes the meaning of the field. -A LAS 1.4 file writer who wishes to maintain backward compatibility must +A LAS 1.5 file writer who wishes to maintain backward compatibility must maintain both the legacy fields and the equivalent non-legacy fields in synchronization. However, this is not possible if the number of points exceeds UINT32_MAX, in which case the legacy fields must be set to zero. If a @@ -19,12 +17,12 @@ file writer is not maintaining backward compatibility, the legacy fields must always be set to zero. If there is a discrepancy between a non-zero legacy field and the equivalent -LAS 1.4 field, the LAS 1.4 reader should use the legacy value to maintain the -same behavior as a LAS 1.1 through LAS 1.3 reader. Best practice is to also +LAS 1.5 field, the LAS reader should use the legacy value to maintain the +same behavior as prior versions of LAS. Best practice is to also throw an informative error so that the file can be repaired. LAS 1.4 introduced the option to define Variable Length Records (VLRs) as -Extended Variable Length Records (EVLRs) instead. A LAS 1.4 file writer wishing +Extended Variable Length Records (EVLRs) instead. A LAS file writer wishing to maintain backward compatibility must use only VLRs. See the :ref:`evlr_legacy_label` section for more information. diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index 8086fd9..dfa298a 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -52,8 +52,9 @@ Extra Bytes +----------------------------+-----------------------------+ The Extra Bytes VLR provides a mechanism whereby additional information can be -added to the end of a standard Point Record. This VLR has been added to LAS 1.4 -to formalize a process that has been used in prior versions of LAS. It is +added to the end of a standard Point Record. This VLR was added to LAS 1.4 +to formalize a process that had been used in prior versions of LAS, and is +a core feature of the LAS 1.5 specification. It is envisioned that software that is not cognizant of the meaning of the extra bytes will simply copy these bytes when manipulating files. @@ -115,11 +116,15 @@ the existing Extra Bytes VLR. Multiple sequential "extra byte" records can compose an array of associated values. It is recommended that each member's name be consistent with other members, only varying by an index number wrapped in square brackets, as in -the above example. Zero-indexed arrays are encouraged. Previous revisions -of the LAS 1.4 specification utilized data_types 11-30 to define standard -two- and three-member arrays, but this feature was never widely implemented -and was `deprecated in R14 `_ to -simplify implementation. +the above example. Zero-indexed arrays are encouraged. + +.. note:: + + Previous versions of the LAS specification utilized data_type values 11-30 to define + two- and three-member arrays, but this feature was never widely implemented + and was `deprecated in LAS 1.4 R14 `_ to + simplify implementation. + Any unused characters in the "name" or "description" fields must be set to zero. From b82b3d0ce14c20c2ed37607355c1df096339a650 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Fri, 18 Apr 2025 12:49:59 -0700 Subject: [PATCH 074/103] Fixed global encoding link in CRS section. --- source/02.02_crs.sub | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/02.02_crs.sub b/source/02.02_crs.sub index 443c71f..6d4d455 100644 --- a/source/02.02_crs.sub +++ b/source/02.02_crs.sub @@ -4,7 +4,7 @@ Coordinate Reference System (CRS) Representation Well Known Text (WKT) is the required Coordinate Reference System (CRS) representation for LAS 1.5. -A "WKT" bit is included in the :ref:`globalencoding_link` field in the Public Header +A "WKT" bit is included in the :ref:`Global Encoding ` field in the Public Header Block. This bit must be set for LAS 1.5; GeoTIFF CRS definitions for legacy point formats are no longer supported in LAS 1.5. The CRS for the file must be located in the WKT (Extended) Variable Length Records (EVLR, VLR). From 11442a613bb0ac31116fb37fb6aed5fd75743170 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Fri, 18 Apr 2025 13:46:26 -0700 Subject: [PATCH 075/103] Remove unnecessary reference to LAS 1.2. (#131) --- source/02.04_header.sub | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index 381bdd5..a4a4093 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -125,10 +125,8 @@ systems. **Global Encoding** -This is a bit field used to indicate certain global properties about the file. -In LAS 1.2 (the version in which this field was introduced), only the low bit -is defined (this is the bit, that if set, would have the unsigned integer yield -a value of 1). This bit field is defined as: +This is a bit field used to indicate certain global properties about the file, +defined as follows: .. tabularcolumns:: |p{2.0cm}|p{3.0cm}|p{11.0cm}| From bd858a2f97c3e373ffde9664bcb5b99de264a60d Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Fri, 18 Apr 2025 14:43:40 -0700 Subject: [PATCH 076/103] Remove version history for LAS 1.4 based on this week's LWG meeting. (#131) --- source/01_intro.txt | 44 ++++++++++---------------------------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/source/01_intro.txt b/source/01_intro.txt index 26f0b32..b8ce51d 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -21,9 +21,17 @@ LAS 1.5 Revision History Summary of LAS 1.5 revisions (GitHub Issue numbers included when applicable): -* R00 - Approved Version (Summer 2025). The additions of LAS 1.5 include: +* R00 - Approved Version (Summer 2025). - * Removed support for PDRFs 0-5. + +Comparison of LAS 1.5 to Previous Versions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The additions of LAS 1.5 include: + + * Backward compatibility with 64-bit LAS 1.4 files. + * Header compatibility with LAS 1.1-1.3 files. + * Removed support for legacy Point Data Record Formats 0-5. (`I-128 `_) * Added Max/Min GPS Time fields to header block. (`I-118 `_) @@ -37,38 +45,6 @@ Summary of LAS 1.5 revisions (GitHub Issue numbers included when applicable): (`I-150 `_) -Comparison of LAS 1.4 to Previous Versions -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The additions of LAS 1.4 (2011-2025) include: - -* Backward compatibility with LAS 1.1 - LAS 1.3 when payloads consist of only - legacy content. -* LAS 1.4 mode which supports: - - * Extension of offsets and field sizes to support full 64 bit. - * Support for up to 15 returns per outgoing pulse. - * Extension of the Point Class field to support 256 classes. - * Definition of several new ASPRS standard classes. - * Extension of the Scan Angle field to 2 bytes to support finer angle resolution. - * Addition of a Sensor Channel bit field to support mobile mapping systems. - * Addition of Well Known Text (WKT) definitions for Coordinate Reference - Systems. - * Addition of an Overlap bit to indicate points in the overlap - region while maintaining the class definition. - * Addition of an (optional) :ref:`extrabytes_vlr_label` Variable Length Record to describe - "extra bytes" stored with each point. - -* Other minor changes: - - * Added recognition of :ref:`domainprofile_label` functionality. - * Added links to official LAS wiki: https://github.com/ASPRSorg/LAS/wiki - * Migration of specification management to GitHub. - * Added language to support technologies other than conventional linear-mode - lidar scanners. - * Closer alignment of data types with C99 definitions. - - Conformance ................................................................................ From d78180b39780fd00cf48a2fb9dba1505a4507ae7 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Fri, 18 Apr 2025 14:46:34 -0700 Subject: [PATCH 077/103] Removed refs to PDRF 4-5 from waveform sections. (#128, #131) --- source/02.00_definition.txt | 2 +- source/05_defined_evlrs.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/02.00_definition.txt b/source/02.00_definition.txt index beb8966..7884cf2 100644 --- a/source/02.00_definition.txt +++ b/source/02.00_definition.txt @@ -35,7 +35,7 @@ to rewrite the entire file. +--------------------------------------------+ -A LAS file that contains point record types 4, 5, 9, or 10 could potentially +A LAS file that contains point record types 9 or 10 could potentially contain one block of waveform data packets that is stored as the payload of any Extended Variable Length Record (EVLR). Unlike other EVLRs, the Waveform Data Packets (if stored internally to the file) have the offset to the storage diff --git a/source/05_defined_evlrs.txt b/source/05_defined_evlrs.txt index cb964c2..901f9dc 100644 --- a/source/05_defined_evlrs.txt +++ b/source/05_defined_evlrs.txt @@ -13,7 +13,7 @@ Waveform Data Packets .. warning:: This EVLR is REQUIRED internally or externally when using Point Data Record - Formats 4, 5, 9, or 10. + Formats 9 or 10. +-----------------+-----------------------------+ | User ID | LASF_Spec | From a84d65b77dd335c18872cefeeb30fec2add5c5f1 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Fri, 18 Apr 2025 15:17:22 -0700 Subject: [PATCH 078/103] Add cross references to Global Encoding section. --- source/02.06_point.sub | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/02.06_point.sub b/source/02.06_point.sub index 9aabe6b..9ca523f 100644 --- a/source/02.06_point.sub +++ b/source/02.06_point.sub @@ -141,7 +141,7 @@ be between 1 and the Number of Returns, inclusive. For systems unable to record multiple returns, the Return Number should be set to one, unless it is synthetically derived and the Synthetic Return Number -Global Encoding bit is set. +:ref:`Global Encoding ` bit is set. **Number of Returns (Given Pulse)** @@ -151,7 +151,7 @@ number of up to fifteen returns. For systems unable to record multiple returns, the Number of Returns should be set to one, unless it is synthetically derived and the Synthetic Return Number -Global Encoding bit is set. +:ref:`Global Encoding ` bit is set. .. note:: From f6ca1073aa9b477a14c2654700fb2673ad141cba Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Fri, 18 Apr 2025 15:17:35 -0700 Subject: [PATCH 079/103] Remove more references to old specs. --- source/01_intro.txt | 4 ++-- source/02.04_header.sub | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/source/01_intro.txt b/source/01_intro.txt index b8ce51d..bd2d463 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -12,7 +12,7 @@ produce points with X, Y, and Z coordinates. The purpose of LAS is to provide an open format that allows different hardware and software tools to exchange point cloud data in a common format. -This document reflects the fifth version of the LAS format specification +This document reflects the fifth version of the LAS file specification since its initial version 1.0 release. @@ -30,7 +30,7 @@ Comparison of LAS 1.5 to Previous Versions The additions of LAS 1.5 include: * Backward compatibility with 64-bit LAS 1.4 files. - * Header compatibility with LAS 1.1-1.3 files. + * Header compatibility with LAS 1.1 - 1.4 files. * Removed support for legacy Point Data Record Formats 0-5. (`I-128 `_) * Added Max/Min GPS Time fields to header block. diff --git a/source/02.04_header.sub b/source/02.04_header.sub index a4a4093..b7ebf1a 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -312,9 +312,11 @@ This field is unrelated to the number of EVLRs appended to the file. **Point Data Record Format** -The point data record indicates the type of point data records contained in the -file. LAS 1.4 defines types 0 through 10. These types are defined in the +The point data record format (PDRF) value indicates the type of point data records contained in the +file. LAS 1.5 defines types 6 through 10. These types are defined in the :ref:`ptrecords_label` section of this specification. +PDRFs 0-5 as defined in previous versions of LAS are no longer valid +for LAS 1.5. **Point Data Record Length** From 1a9efa3fe8680e8b9eb911b26a26333673844ea1 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Wed, 23 Apr 2025 08:33:06 -0700 Subject: [PATCH 080/103] Reset table formatting to standard because of distracting aliasing at table borders. Sync conf.py comments to match LAS 1.4R16. --- source/conf.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/source/conf.py b/source/conf.py index f8d6045..b2cf2e5 100644 --- a/source/conf.py +++ b/source/conf.py @@ -117,6 +117,11 @@ def get_git_revision_short_hash(): # further. For a list of options available for each theme, see the # documentation. # +# HTML theme options in Alabaster here: +# https://alabaster.readthedocs.io/en/latest/customization.html +# Alabaster default CSS is here: +# https://github.com/sphinx-doc/alabaster/blob/master/alabaster/static/alabaster.css_t + # html_theme_options = {} # Add any paths that contain custom static files (such as style sheets) here, @@ -158,6 +163,7 @@ def get_git_revision_short_hash(): % Override Sphinx defaults for table heading (bold instead of sans serif) % https://stackoverflow.com/a/42988749/1666676 +% https://github.com/sphinx-doc/sphinx/blob/a6d7ae16739bf92a032a7c4df0297db7cf120ec9/sphinx/texinputs/sphinxlatexstyletext.sty#L46 \protected\def\sphinxstyletheadfamily{\bfseries} % leave this here... https://tex.stackexchange.com/a/8353/143333 @@ -272,9 +278,23 @@ def get_git_revision_short_hash(): 'maketitle': title, # Don't use atendofbody. Use fancyhdr calls in preamble instead (above). -# 'atendofbody': """American Society for Photogrammetry \& Remote Sensing \\ LAS SPECIFICATION \\""" + releasename + # 'atendofbody': """American Society for Photogrammetry \& Remote Sensing \\ LAS SPECIFICATION \\""" + releasename + + # Customize sphinx setup parameters + # https://www.sphinx-doc.org/en/master/latex.html#latexsphinxsetup + # 'sphinxsetup': "TableRowColorOdd={rgb}{0,0,255},TableRowColorEven={rgb}{0,255,0}", + # 'sphinxsetup': "TableRowColorHeader={rgb}{235,235,235}", } +# Customize latex table styles: https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-latex_table_style +# Defaults are latex_table_style = ['booktabs', 'colorrows'] +# You can override for specific tables using rst-class directive +# https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#rstclass + +# Override default table styles back to plain tables because of aliasing issues with booktabs +# latex_table_style = ['booktabs', 'colorrows'] +latex_table_style = ['standard'] + latex_toplevel_sectioning='section' latex_show_urls='footnote' latex_logo = './_static/ASPRS_Logo_Blue.png' From 5ec6db159f281dd1598f22956faf96e89faa14ec Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Wed, 23 Apr 2025 08:44:53 -0700 Subject: [PATCH 081/103] Normalized return number notation to numerals. (#131) --- source/02.06_point.sub | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/02.06_point.sub b/source/02.06_point.sub index 9ca523f..c4f6c83 100644 --- a/source/02.06_point.sub +++ b/source/02.06_point.sub @@ -135,22 +135,22 @@ pulse return magnitude, and may be derived from multiple sources. The Return Number is the pulse return number for a given output pulse. A given output laser pulse can have many returns, and they must be marked in sequence -of return. The first return will have a Return Number of one, the second a -Return Number of two, and so on up to fifteen returns. The Return Number must +of return. The first return will have a Return Number of 1, the second a +Return Number of 2, and so on up to 15 returns. The Return Number must be between 1 and the Number of Returns, inclusive. For systems unable to record multiple returns, the Return Number should be -set to one, unless it is synthetically derived and the Synthetic Return Number +set to 1, unless it is synthetically derived and the Synthetic Return Number :ref:`Global Encoding ` bit is set. **Number of Returns (Given Pulse)** The Number of Returns is the total number of returns for a given pulse. For -example, a laser data point may be return two (Return Number) within a total -number of up to fifteen returns. +example, a laser data point may be return 2 (Return Number) within a total +number of up to 15 returns. For systems unable to record multiple returns, the Number of Returns should be -set to one, unless it is synthetically derived and the Synthetic Return Number +set to 1, unless it is synthetically derived and the Synthetic Return Number :ref:`Global Encoding ` bit is set. .. note:: From 30754893192e526ea7673cb5e7464afb84b693ed Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Wed, 23 Apr 2025 08:49:55 -0700 Subject: [PATCH 082/103] Improve wording. --- source/01_intro.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/01_intro.txt b/source/01_intro.txt index bd2d463..ee8162d 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -19,7 +19,7 @@ since its initial version 1.0 release. LAS 1.5 Revision History ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Summary of LAS 1.5 revisions (GitHub Issue numbers included when applicable): +Summary of LAS 1.5 revisions (topic links included when applicable): * R00 - Approved Version (Summer 2025). @@ -27,7 +27,7 @@ Summary of LAS 1.5 revisions (GitHub Issue numbers included when applicable): Comparison of LAS 1.5 to Previous Versions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The additions of LAS 1.5 include: +The additions of LAS 1.5 include (topic links included when applicable): * Backward compatibility with 64-bit LAS 1.4 files. * Header compatibility with LAS 1.1 - 1.4 files. From 7a5fc25e91eec81177fc5b7518a3f93ad305e16c Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Wed, 23 Apr 2025 10:47:02 -0700 Subject: [PATCH 083/103] Unmerge all vertical table cells. (#131) --- source/02.06_point.sub | 108 ++++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/source/02.06_point.sub b/source/02.06_point.sub index c4f6c83..02e27b2 100644 --- a/source/02.06_point.sub +++ b/source/02.06_point.sub @@ -66,17 +66,17 @@ Data Record Formats 6 to 10. +----------------------------------+-------------------------+-------------+-----------+----------+ | Intensity | uint16_t | 12 | 2 bytes | no | +----------------------------------+-------------------------+-------------+-----------+----------+ - | Return Number | 4 bits (bits 0-3) | 14 | 4 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Number of Returns (Given Pulse) | 4 bits (bits 4-7) | | 4 bits | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Classification Flags | 4 bits (bits 0-3) | 15 | 4 bits | no | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scanner Channel | 2 bits (bits 4-5) | | 2 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scan Direction Flag | 1 bit (bit 6) | | 1 bit | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Edge of Flight Line | 1 bit (bit 7) | | 1 bit | yes | + | Return Number | 4 bits (bits 0-3) | 14:0 | 4 bits | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Number of Returns (Given Pulse) | 4 bits (bits 4-7) | 14:4 | 4 bits | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Classification Flags | 4 bits (bits 0-3) | 15:0 | 4 bits | no | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Scanner Channel | 2 bits (bits 4-5) | 15:4 | 2 bits | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Scan Direction Flag | 1 bit (bit 6) | 15:6 | 1 bit | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Edge of Flight Line | 1 bit (bit 7) | 15:7 | 1 bit | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ | Classification | uint8_t | 16 | 1 byte | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ @@ -258,8 +258,8 @@ Classification must adhere to the following standard: | Value | Meaning | Notes | +==================+=============================+================================+ | 0 | Created, Never Classified | See note [2]_ | - +------------------+-----------------------------+ + - | 1 | Unclassified | | + +------------------+-----------------------------+--------------------------------+ + | 1 | Unclassified | See note [2]_ | +------------------+-----------------------------+--------------------------------+ | 2 | Ground | | +------------------+-----------------------------+--------------------------------+ @@ -411,17 +411,17 @@ point using ancillary data, typically from a camera. +----------------------------------+-------------------------+-------------+-----------+----------+ | Intensity | uint16_t | 12 | 2 bytes | no | +----------------------------------+-------------------------+-------------+-----------+----------+ - | Return Number | 4 bits (bits 0-3) | 14 | 4 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Number of Returns (Given Pulse) | 4 bits (bits 4-7) | | 4 bits | yes | + | Return Number | 4 bits (bits 0-3) | 14:0 | 4 bits | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ - | Classification Flags | 4 bits (bits 0-3) | 15 | 4 bits | no | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scanner Channel | 2 bits (bits 4-5) | | 2 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scan Direction Flag | 1 bit (bit 6) | | 1 bit | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Edge of Flight Line | 1 bit (bit 7) | | 1 bit | yes | + | Number of Returns (Given Pulse) | 4 bits (bits 4-7) | 14:4 | 4 bits | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Classification Flags | 4 bits (bits 0-3) | 15:0 | 4 bits | no | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Scanner Channel | 2 bits (bits 4-5) | 15:4 | 2 bits | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Scan Direction Flag | 1 bit (bit 6) | 15:6 | 1 bit | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Edge of Flight Line | 1 bit (bit 7) | 15:7 | 1 bit | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ | Classification | uint8_t | 16 | 1 byte | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ @@ -479,17 +479,17 @@ addition of a NIR (near infrared) channel. +----------------------------------+-------------------------+-------------+-----------+----------+ | Intensity | uint16_t | 12 | 2 bytes | no | +----------------------------------+-------------------------+-------------+-----------+----------+ - | Return Number | 4 bits (bits 0-3) | 14 | 4 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Number of Returns (Given Pulse) | 4 bits (bits 4-7) | | 4 bits | yes | + | Return Number | 4 bits (bits 0-3) | 14:0 | 4 bits | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Number of Returns (Given Pulse) | 4 bits (bits 4-7) | 14:4 | 4 bits | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Classification Flags | 4 bits (bits 0-3) | 15:0 | 4 bits | no | +----------------------------------+-------------------------+-------------+-----------+----------+ - | Classification Flags | 4 bits (bits 0-3) | 15 | 4 bits | no | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scanner Channel | 2 bits (bits 4-5) | | 2 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scan Direction Flag | 1 bit (bit 6) | | 1 bit | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Edge of Flight Line | 1 bit (bit 7) | | 1 bit | yes | + | Scanner Channel | 2 bits (bits 4-5) | 15:4 | 2 bits | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Scan Direction Flag | 1 bit (bit 6) | 15:6 | 1 bit | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Edge of Flight Line | 1 bit (bit 7) | 15:7 | 1 bit | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ | Classification | uint8_t | 16 | 1 byte | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ @@ -548,17 +548,17 @@ Point Data Record Format 9 adds Wave Packets to Point Data Record Format 6. +----------------------------------+-------------------------+-------------+-----------+----------+ | Intensity | uint16_t | 12 | 2 bytes | no | +----------------------------------+-------------------------+-------------+-----------+----------+ - | Return Number | 4 bits (bits 0-3) | 14 | 4 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Number of Returns (Given Pulse) | 4 bits (bits 4-7) | | 4 bits | yes | + | Return Number | 4 bits (bits 0-3) | 14:0 | 4 bits | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Number of Returns (Given Pulse) | 4 bits (bits 4-7) | 14:4 | 4 bits | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Classification Flags | 4 bits (bits 0-3) | 15:0 | 4 bits | no | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Scanner Channel | 2 bits (bits 4-5) | 15:4 | 2 bits | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Scan Direction Flag | 1 bit (bit 6) | 15:6 | 1 bit | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ - | Classification Flags | 4 bits (bits 0-3) | 15 | 4 bits | no | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scanner Channel | 2 bits (bits 4-5) | | 2 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scan Direction Flag | 1 bit (bit 6) | | 1 bit | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Edge of Flight Line | 1 bit (bit 7) | | 1 bit | yes | + | Edge of Flight Line | 1 bit (bit 7) | 15:7 | 1 bit | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ | Classification | uint8_t | 16 | 1 byte | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ @@ -695,17 +695,17 @@ Point Data Record Format 10 is the same as Point Data Record Format 9 with RGB a +----------------------------------+-------------------------+-------------+-----------+----------+ | Intensity | uint16_t | 12 | 2 bytes | no | +----------------------------------+-------------------------+-------------+-----------+----------+ - | Return Number | 4 bits (bits 0-3) | 14 | 4 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Number of Returns (Given Pulse) | 4 bits (bits 4-7) | | 4 bits | yes | - +----------------------------------+-------------------------+-------------+-----------+----------+ - | Classification Flags | 4 bits (bits 0-3) | 15 | 4 bits | no | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scanner Channel | 2 bits (bits 4-5) | | 2 bits | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Scan Direction Flag | 1 bit (bit 6) | | 1 bit | yes | - +----------------------------------+-------------------------+ +-----------+----------+ - | Edge of Flight Line | 1 bit (bit 7) | | 1 bit | yes | + | Return Number | 4 bits (bits 0-3) | 14:0 | 4 bits | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Number of Returns (Given Pulse) | 4 bits (bits 4-7) | 14:4 | 4 bits | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Classification Flags | 4 bits (bits 0-3) | 15:0 | 4 bits | no | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Scanner Channel | 2 bits (bits 4-5) | 15:4 | 2 bits | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Scan Direction Flag | 1 bit (bit 6) | 15:6 | 1 bit | yes | + +----------------------------------+-------------------------+-------------+-----------+----------+ + | Edge of Flight Line | 1 bit (bit 7) | 15:7 | 1 bit | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ | Classification | uint8_t | 16 | 1 byte | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ From cb1ccf51360cee7a1fcaddc3f77971e76361af68 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Fri, 25 Apr 2025 10:07:18 -0700 Subject: [PATCH 084/103] Add page break before FWF VLR for readability --- source/04_optional_vlrs.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index 8d7b08e..85ef2a5 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -247,6 +247,10 @@ updating a record such as projection information where a new EVLR is appended to the end of the LAS file. The existing VLR which has been superseded must be marked with the SUPERSEDED Record ID. +.. raw:: latex + + \newpage + .. _fwf_descriptor_label: Waveform Packet Descriptor From 8c422d1fa7dad04ebe076ce205f4fb7e302a144c Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 15 May 2025 16:16:26 -0700 Subject: [PATCH 085/103] Replicating PR#164 on LAS 1.5 branch. Font fixes for fixed-width (code) rendering (#131, #162) Add missing Courier font Make Times font explicit. Reduce font size from 12pt to 11pt --- .github/workflows/pdf.yml | 2 ++ source/conf.py | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pdf.yml b/.github/workflows/pdf.yml index 175ccdb..2801154 100644 --- a/.github/workflows/pdf.yml +++ b/.github/workflows/pdf.yml @@ -19,6 +19,8 @@ jobs: run: | python3 --version sphinx-build --version + DEBIAN_FRONTEND=noninteractive apt-get update -y + DEBIAN_FRONTEND=noninteractive apt-get install texlive-fonts-recommended -y - name: Lint .rst files run: | if find . -name '*.rst' | xargs grep -P '\t'; then echo 'Tabs are bad, please use four spaces in .rst files.'; false; fi diff --git a/source/conf.py b/source/conf.py index a8955f8..8fbcc80 100644 --- a/source/conf.py +++ b/source/conf.py @@ -149,6 +149,8 @@ def get_git_revision_short_hash(): \usepackage{titling} \usepackage{fancyhdr} +\usepackage{times} +\usepackage{courier} \makeatletter \fancypagestyle{normal}{ \fancyhf{} @@ -261,7 +263,7 @@ def get_git_revision_short_hash(): # The font size ('10pt', '11pt' or '12pt'). # - 'pointsize': '12pt', + 'pointsize': '11pt', # Other document class options - ensure uniform header/footer 'classoptions': ',oneside,openany', From c2ce58b2551f14a1382bbae9b3151a7b92f381e5 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 17 Jul 2025 11:30:13 -0700 Subject: [PATCH 086/103] Removed references to point formats without Time. (#6, #118) --- source/02.04_header.sub | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index b677342..b92e89a 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -431,8 +431,7 @@ generally) GPS Time values stored with the point records in this LAS file. The GPS Time in this field will be in the same encoding described in the file's :ref:`Global Encoding ` field. -These values must be set to zero if there are no point records in the file, -if the file utilizes a point record format not supporting GPS Time, or if +These values must be set to zero if there are no point records in the file or if all point records within the file have GPS Time values set to zero, such as for certain :ref:`Aggregate Model Systems `. @@ -451,7 +450,6 @@ and year ranges that users are encouraged to use to maximize compatibility betwe This value must be set to zero if there are no point records in the file, if the file is derived from a source not utilizing GPS Time (such as for certain :ref:`Aggregate Model Systems `), -if the file utilizes a point record format not supporting GPS Time, or if -the Time Offset Flag is unset. +or if the Time Offset Flag is unset. It is invalid for the GPS Time Type bit to be unset if the Offset Time Flag bit is set. From d4d8904e8f7b071915671d4450a0e78ae24280e8 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 17 Jul 2025 11:38:07 -0700 Subject: [PATCH 087/103] Clarify valid vs non-zero GPS Time. --- source/02.04_header.sub | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index b92e89a..3fcd206 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -426,8 +426,8 @@ intent. **Max and Min GPS Time** -The max and min GPS Time fields reflect the highest and lowest valid (non-zero, -generally) GPS Time values stored with the point records in this LAS file. The +The max and min GPS Time fields reflect the highest and lowest non-zero +GPS Time values stored with the point records in this LAS file. The GPS Time in this field will be in the same encoding described in the file's :ref:`Global Encoding ` field. From 05b03dd3a2a0dfe0d1f0653607aab1293db4e24f Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 17 Jul 2025 11:42:07 -0700 Subject: [PATCH 088/103] Replace reference to PDRF 1 with PDRF 6 (#162) --- source/02.04_header.sub | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index 3fcd206..d2e3ceb 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -321,9 +321,9 @@ for LAS 1.5. **Point Data Record Length** The size, in bytes, of the Point Data Record. All Point Data Records within a -single LAS file must be the same type and hence the same length. If the -specified size is larger than implied by the point format type (e.g., 32 bytes -instead of 28 bytes for type 1) the remaining bytes are user-specific "extra +single LAS file must be the same PDRF and hence the same length. If the +specified size is larger than implied by the PDRF type (e.g., 32 bytes +instead of 30 bytes for PDRF 6) the remaining bytes are user-specific "extra bytes". The format and meaning of such "extra bytes" can (optionally) be described with an :ref:`extrabytes_vlr_label` VLR. From 4eade1a986c722e46144cf8579eb55933b6ed5ae Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 17 Jul 2025 11:46:56 -0700 Subject: [PATCH 089/103] Normalize PDRF Size to PDRF Length Fix one other reference to PDRF 1 --- source/02.06_point.sub | 12 ++++++------ source/04_optional_vlrs.txt | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/source/02.06_point.sub b/source/02.06_point.sub index 2dd9c82..6196347 100644 --- a/source/02.06_point.sub +++ b/source/02.06_point.sub @@ -88,10 +88,10 @@ Data Record Formats 6 to 10. +----------------------------------+-------------------------+-------------+-----------+----------+ | GPS Time | double | 22 | 8 bytes | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ - | *Minimum PDRF Size* [1]_ | *30 bytes* | + | *Minimum PDRF Length* [1]_ | *30 bytes* | +------------------------------------------------------------+------------------------------------+ -.. [1] Recall that the Point Data Record Size can be greater than the minimum +.. [1] Recall that the Point Data Record Length can be greater than the minimum required for a PDRF. These "extra bytes" follow the standard Point Record fields and are described in the :ref:`extrabytes_vlr_label` VLR section. @@ -439,7 +439,7 @@ point using ancillary data, typically from a camera. +----------------------------------+-------------------------+-------------+-----------+----------+ | Blue | uint16_t | 34 | 2 bytes | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ - | *Minimum PDRF Size* | *36 bytes* | + | *Minimum PDRF Length* | *36 bytes* | +------------------------------------------------------------+------------------------------------+ **Red, Green, and Blue** @@ -509,7 +509,7 @@ addition of a NIR (near infrared) channel. +----------------------------------+-------------------------+-------------+-----------+----------+ | NIR | uint16_t | 36 | 2 bytes | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ - | *Minimum PDRF Size* | *38 bytes* | + | *Minimum PDRF Length* | *38 bytes* | +------------------------------------------------------------+------------------------------------+ **NIR** @@ -584,7 +584,7 @@ Point Data Record Format 9 adds Wave Packets to Point Data Record Format 6. +----------------------------------+-------------------------+-------------+-----------+----------+ | Parametric dz | float | 55 | 4 bytes | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ - | *Minimum PDRF Size* | *59 bytes* | + | *Minimum PDRF Length* | *59 bytes* | +------------------------------------------------------------+------------------------------------+ **Wave Packet Descriptor Index** @@ -739,7 +739,7 @@ Point Data Record Format 10 is the same as Point Data Record Format 9 with RGB a +----------------------------------+-------------------------+-------------+-----------+----------+ | Parametric dz | float | 63 | 4 bytes | yes | +----------------------------------+-------------------------+-------------+-----------+----------+ - | *Minimum PDRF Size* | *67 bytes* | + | *Minimum PDRF Length* | *67 bytes* | +------------------------------------------------------------+------------------------------------+ .. raw:: latex diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index bbef937..cc5ee13 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -59,9 +59,9 @@ envisioned that software that is not cognizant of the meaning of the extra bytes will simply copy these bytes when manipulating files. This VLR is only required for LAS files where points contain user-defined -"extra bytes". This happens when the point record size is set to a larger value +"extra bytes". This happens when the point record length is set to a larger value than required by the point type. For example, if a LAS file that contains -point type 1 has a point record size of 32 instead of 28, there are 4 "extra +point type 6 has a point record length of 34 instead of 30, there are 4 "extra bytes". The Extra Bytes VLR contains a simple description of the type and the meaning of these "extra bytes" so they can be accessed in a consistent manner across applications. The extra bytes descriptor is defined as follows: From 2c2ad0fe00ecada3d4605c834ce5ee2ba10a423e Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 17 Jul 2025 11:54:15 -0700 Subject: [PATCH 090/103] Fix repeated words (typo, #162) Make zero notation consistent. --- source/02.04_header.sub | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index d2e3ceb..bc311b8 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -184,7 +184,7 @@ defined as follows: | | | LAS 1.5; GeoTIFF CRS definitions are no | | | | longer supported in LAS 1.5. | +-------+-----------------------+------------------------------------------+ - | 5 | Reserved | Must be set to zero (0). | + | 5 | Reserved | Must be set to zero. | +-------+-----------------------+------------------------------------------+ | 6 | Time Offset Flag | Used in combination with GPS Time Type | | | | to indicate the meaning of | @@ -195,7 +195,7 @@ defined as follows: | | | is defined as Offset GPS Time. The | | | | Offset GPS Time is standard GPS Time | | | | (satellite GPS Time) minus | - | | | 1 x :math:`10^6` x Time Offset. The Time | + | | | 1 x :math:`10^6` x Time Offset. The | | | | :ref:`Time Offset ` | | | | is specified in the LAS header. | | | | The offset moves time to near zero to | @@ -207,7 +207,7 @@ defined as follows: | | | The GPS Time Type flag must be set if | | | | the Time Offset Flag is set. | +-------+-----------------------+------------------------------------------+ - | 7:15 | Reserved | Must be set to zero (0). | + | 7:15 | Reserved | Must be set to zero. | +-------+-----------------------+------------------------------------------+ @@ -400,8 +400,7 @@ If there are no EVLRs, this value must be zero. This field contains the current number of EVLRs (including, if present, the Waveform Data Packet Record) that are stored in the file after the Point Data -Records. If the number of EVLRs changes, then this number must be updated. If there -are no EVLRs this value is zero. +Records. If the number of EVLRs changes, then this number must be updated. If there are no EVLRs, this value must be zero. From a4d50ccfa4449cc394c770bf52c5f026d668ed19 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 17 Jul 2025 11:56:30 -0700 Subject: [PATCH 091/103] Fix lingering reference to LAS 1.4 (#131) --- source/02.04_header.sub | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index bc311b8..21136fa 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -384,8 +384,8 @@ point records in the file, these values must be set to zero. This value provides the offset, in bytes, from the beginning of the LAS file to the first byte of the Waveform Data Package Record. Note that this will be the first byte of the Waveform Data Packet header. If no waveform records are -contained within the file or they are stored externally, this value must be zero. It should be noted that LAS -1.4 allows multiple Extended Variable Length Records (EVLRs) and that the +contained within the file or they are stored externally, this value must be zero. It should be noted that +LAS 1.5 allows multiple Extended Variable Length Records (EVLRs) and that the Waveform Data Packet Record is not necessarily the first EVLR in the file. **Start of First Extended Variable Length Record** From bb171f5e4c5773404f035954844b4084e64d4ba4 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 21 Aug 2025 10:52:16 -0700 Subject: [PATCH 092/103] Replicate redundant CRS section 2.2 in header and CRS sections --- source/02.04_header.sub | 16 ++++++++++++---- source/03_crs.txt | 23 ++++++++++++++--------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/source/02.04_header.sub b/source/02.04_header.sub index 21136fa..2af3060 100644 --- a/source/02.04_header.sub +++ b/source/02.04_header.sub @@ -1,3 +1,7 @@ +.. raw:: latex + + \newpage + .. _headerblock_label: Public Header Block @@ -179,10 +183,14 @@ defined as follows: | | | for a system not directly supporting | | | | multiple returns. | +-------+-----------------------+------------------------------------------+ - | 4 | WKT | If set, the Coordinate Reference System | - | | | (CRS) is WKT. This bit must be set in | - | | | LAS 1.5; GeoTIFF CRS definitions are no | - | | | longer supported in LAS 1.5. | + | 4 | Well Known Text (WKT) | If set, the Coordinate Reference System | + | | | (CRS) is formatted as OGC WKT. This bit | + | | | must be set in LAS 1.5; GeoTIFF CRS | + | | | definitions from prior versions of LAS | + | | | are no longer supported in LAS 1.5. | + | | | The CRS definition will be located in | + | | | the WKT VLR(s) or EVLR(s) as defined in | + | | | the :ref:`crs_label` section. | +-------+-----------------------+------------------------------------------+ | 5 | Reserved | Must be set to zero. | +-------+-----------------------+------------------------------------------+ diff --git a/source/03_crs.txt b/source/03_crs.txt index 6705af8..9143da8 100644 --- a/source/03_crs.txt +++ b/source/03_crs.txt @@ -2,18 +2,23 @@ \newpage +.. _crs_label: + Coordinate Reference System -------------------------------------------------------------------------------- -Coordinate Reference System (CRS) information is required for a LAS 1.5 file. -LAS 1.5 defines VLRs in :ref:`vlrdef_label` and EVLRs in :ref:`evlrdef_label` and -requires them for specifying the Coordinate Reference System (CRS) of the file. - -CRS information shall be placed in VLRs or EVLRs and represented as `OGC Well -Known Text `__ (WKT) without regard to +Coordinate Reference System (CRS) information is required for a LAS 1.5 file +and must be placed in :ref:`vlrdef_label` or :ref:`evlrdef_label`. +LAS 1.5 CRS information shall be represented as `OGC Well +Known Text `__ (WKT), as indicated by the :ref:`Global Encoding ` bit. -GeoTIFF CRS representations are no longer supported as of LAS 1.5. +GeoTIFF CRS representations from prior versions of LAS are not supported in LAS 1.5. + +It is considered a file error to have more than one WKT VLR or EVLR in the file. +A writer can efficiently revise a CRS VLR or EVLR without rewriting the entire LAS file by +"superseding" the existing CRS VLR or EVLR. Superseding is performed by changing the +Record ID of the VLR or EVLR to match the :ref:`superseded_vlr_label` VLR definition. .. _crs_wkt: @@ -70,8 +75,8 @@ supplemental parameterized math transform definition. | Record ID | 2111 | +-----------------+-----------------------------+ -This record must contain a Math Transform WKT consistent with the same WKT -specification being used by :ref:`crs_wkt`, with the following considerations: +This record must contain a Math Transform WKT Record consistent with the same WKT +specification being used by the :ref:`Coordinate System WKT Record `, with the following considerations: * The OGC Math Transform WKT VLR data shall be a null-terminated string. * The OGC Math Transform WKT VLR data shall be considered UTF-8. From 0cf1760de9c2d4093efd330c08924616b4c5a151 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 21 Aug 2025 10:54:24 -0700 Subject: [PATCH 093/103] Remove redundant section 2.2 --- source/02.00_definition.txt | 1 - source/02.02_crs.sub | 22 ---------------------- source/02.03_datatypes.sub | 4 ++++ 3 files changed, 4 insertions(+), 23 deletions(-) delete mode 100644 source/02.02_crs.sub diff --git a/source/02.00_definition.txt b/source/02.00_definition.txt index 7884cf2..5861987 100644 --- a/source/02.00_definition.txt +++ b/source/02.00_definition.txt @@ -43,7 +43,6 @@ header contained within the Public Header Block ("Start of Waveform Data Packet Record"). .. include:: ./02.01_legacy.sub -.. include:: ./02.02_crs.sub .. include:: ./02.03_datatypes.sub .. include:: ./02.04_header.sub .. include:: ./02.05_vlr.sub diff --git a/source/02.02_crs.sub b/source/02.02_crs.sub deleted file mode 100644 index 6d4d455..0000000 --- a/source/02.02_crs.sub +++ /dev/null @@ -1,22 +0,0 @@ -Coordinate Reference System (CRS) Representation -................................................................................ - -Well Known Text (WKT) is the required Coordinate -Reference System (CRS) representation for LAS 1.5. - -A "WKT" bit is included in the :ref:`Global Encoding ` field in the Public Header -Block. This bit must be set for LAS 1.5; GeoTIFF CRS definitions for legacy -point formats are no longer supported in LAS 1.5. The CRS for the file must be -located in the WKT (Extended) Variable Length Records (EVLR, VLR). - -It is considered a file error to have more than -one WKT (E)VLR in the file. A writer can append a new CRS EVLR to a file by -"superseding" the existing CRS (E)VLR. Superseding is performed by changing the -Record ID of the (E)VLR to match the :ref:`superseded_vlr_label` VLR defined -later in this document. - - -.. raw:: latex - - \newpage - diff --git a/source/02.03_datatypes.sub b/source/02.03_datatypes.sub index 0cd6bc9..594da39 100644 --- a/source/02.03_datatypes.sub +++ b/source/02.03_datatypes.sub @@ -1,3 +1,7 @@ +.. raw:: latex + + \newpage + Data Types ................................................................................ From 59bdce33f7f822e3f0014fd0d5bc4179dc6c26a8 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 21 Aug 2025 10:54:40 -0700 Subject: [PATCH 094/103] Normalize mixed notation of VLR/EVLR --- source/04_optional_vlrs.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index cc5ee13..2288cac 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -35,7 +35,7 @@ Text Area Description | Record ID | 3 | +-----------------+-----------------------------+ -This VLR/EVLR is used for providing a textual description of the content of the +This VLR is used for providing a textual description of the content of the LAS file. It is a null-terminated, free-form ASCII string. .. _extrabytes_vlr_label: @@ -231,8 +231,8 @@ Superseded | Record ID | 7 | +-----------------+-----------------------------+ -This LASF Record ID is used to negate an existing VLR/EVLR when rewriting the -file (to remove the undesired VLR/EVLR). It is used, for example, when +This LASF Record ID is used to negate an existing VLR or EVLR when rewriting the +file (to remove the undesired VLR or EVLR). It is used, for example, when updating a record such as projection information where a new EVLR is appended to the end of the LAS file. The existing VLR which has been superseded must be marked with the SUPERSEDED Record ID. From 467db49c9fe974166e85e4c7c82570e1ae9dd0cd Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 21 Aug 2025 11:18:58 -0700 Subject: [PATCH 095/103] Add missing note about appending the CRS definition as a EVLR. --- source/03_crs.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/03_crs.txt b/source/03_crs.txt index 9143da8..47a870c 100644 --- a/source/03_crs.txt +++ b/source/03_crs.txt @@ -16,8 +16,9 @@ the :ref:`Global Encoding ` bit. GeoTIFF CRS representations from prior versions of LAS are not supported in LAS 1.5. It is considered a file error to have more than one WKT VLR or EVLR in the file. -A writer can efficiently revise a CRS VLR or EVLR without rewriting the entire LAS file by -"superseding" the existing CRS VLR or EVLR. Superseding is performed by changing the +A writer can efficiently revise a CRS definition without rewriting the entire LAS file by +"superseding" the existing CRS VLR or EVLR and appending a new CRS definition in an EVLR. +Superseding is performed by changing the Record ID of the VLR or EVLR to match the :ref:`superseded_vlr_label` VLR definition. .. _crs_wkt: From c1a5a8b9ce75e0a29ef6397cfb1be1732ff642a1 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Thu, 21 Aug 2025 11:22:39 -0700 Subject: [PATCH 096/103] Change section 2 filenames to match original section numbering --- source/02.00_definition.txt | 10 +++++----- source/{02.03_datatypes.sub => 02.02_datatypes.sub} | 0 source/{02.04_header.sub => 02.03_header.sub} | 0 source/{02.05_vlr.sub => 02.04_vlr.sub} | 0 source/{02.06_point.sub => 02.05_point.sub} | 0 source/{02.07_evlr.sub => 02.06_evlr.sub} | 0 6 files changed, 5 insertions(+), 5 deletions(-) rename source/{02.03_datatypes.sub => 02.02_datatypes.sub} (100%) rename source/{02.04_header.sub => 02.03_header.sub} (100%) rename source/{02.05_vlr.sub => 02.04_vlr.sub} (100%) rename source/{02.06_point.sub => 02.05_point.sub} (100%) rename source/{02.07_evlr.sub => 02.06_evlr.sub} (100%) diff --git a/source/02.00_definition.txt b/source/02.00_definition.txt index 5861987..bdd34ed 100644 --- a/source/02.00_definition.txt +++ b/source/02.00_definition.txt @@ -43,10 +43,10 @@ header contained within the Public Header Block ("Start of Waveform Data Packet Record"). .. include:: ./02.01_legacy.sub -.. include:: ./02.03_datatypes.sub -.. include:: ./02.04_header.sub -.. include:: ./02.05_vlr.sub -.. include:: ./02.06_point.sub -.. include:: ./02.07_evlr.sub +.. include:: ./02.02_datatypes.sub +.. include:: ./02.03_header.sub +.. include:: ./02.04_vlr.sub +.. include:: ./02.05_point.sub +.. include:: ./02.06_evlr.sub diff --git a/source/02.03_datatypes.sub b/source/02.02_datatypes.sub similarity index 100% rename from source/02.03_datatypes.sub rename to source/02.02_datatypes.sub diff --git a/source/02.04_header.sub b/source/02.03_header.sub similarity index 100% rename from source/02.04_header.sub rename to source/02.03_header.sub diff --git a/source/02.05_vlr.sub b/source/02.04_vlr.sub similarity index 100% rename from source/02.05_vlr.sub rename to source/02.04_vlr.sub diff --git a/source/02.06_point.sub b/source/02.05_point.sub similarity index 100% rename from source/02.06_point.sub rename to source/02.05_point.sub diff --git a/source/02.07_evlr.sub b/source/02.06_evlr.sub similarity index 100% rename from source/02.07_evlr.sub rename to source/02.06_evlr.sub From b7545b2aadc4d8ca805a1b3fdf0f6fbae3de3918 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Mon, 25 Aug 2025 12:55:09 -0700 Subject: [PATCH 097/103] Update ASPRS address to match 1.4R16 --- source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/conf.py b/source/conf.py index 8fbcc80..0e2066c 100644 --- a/source/conf.py +++ b/source/conf.py @@ -225,8 +225,8 @@ def get_git_revision_short_hash(): \noindent Published by:\\ } The American Society for Photogrammetry \& Remote Sensing\\ -8550 United Plaza Blvd, Suite 1001\\ -Baton Rouge, Louisiana 70809\\ +8550 United Plaza Blvd. Suite 1001\\ +Baton Rouge, LA 70809\\ Voice: 225-408-4747\\ Web: \underline{www.asprs.org}\\ From c4b98cc5fe0ac1615826e8f539b6544d0bc5dd77 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Mon, 25 Aug 2025 12:55:41 -0700 Subject: [PATCH 098/103] Add missing comma --- source/01_intro.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/01_intro.txt b/source/01_intro.txt index 4c6695b..9e06e09 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -66,7 +66,7 @@ this standard can be directed to ASPRS: * Online at https://github.com/ASPRSorg/LAS * By phone at 225-408-4747 * By email at las@asprs.org or asprs@asprs.org -* By mail at 8550 United Plaza Blvd, Suite 1001 Baton Rouge, LA 70809 +* By mail at 8550 United Plaza Blvd, Suite 1001, Baton Rouge, LA 70809 OGC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 2666a2404c8cac0a1341239004235652cd963912 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Mon, 25 Aug 2025 14:42:25 -0700 Subject: [PATCH 099/103] Revert conflicting changes to CRS section --- source/02.02_crs.sub | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/02.02_crs.sub b/source/02.02_crs.sub index 1100a31..6d4d455 100644 --- a/source/02.02_crs.sub +++ b/source/02.02_crs.sub @@ -10,9 +10,9 @@ point formats are no longer supported in LAS 1.5. The CRS for the file must be located in the WKT (Extended) Variable Length Records (EVLR, VLR). It is considered a file error to have more than -one WKT VLR/EVLR in the file. A writer can append a new CRS EVLR to a file by -"superseding" the existing CRS VLR/EVLR. Superseding is performed by changing the -Record ID of the VLR/EVLR to match the :ref:`superseded_vlr_label` VLR defined +one WKT (E)VLR in the file. A writer can append a new CRS EVLR to a file by +"superseding" the existing CRS (E)VLR. Superseding is performed by changing the +Record ID of the (E)VLR to match the :ref:`superseded_vlr_label` VLR defined later in this document. From 22c69db8143d4382371ecd8d6f2a13ddd75f5cc5 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Mon, 25 Aug 2025 14:57:42 -0700 Subject: [PATCH 100/103] Normalize VLR/EVLR wording to match current LAS 1.5 --- source/04_optional_vlrs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index 85ef2a5..6f968b6 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -9,7 +9,7 @@ Optional VLR Definitions Definitions for official :ref:`vlrdef_label` and :ref:`evlrdef_label` are provided in this section as a means to extend the LAS file format. -Additional VLR/EVLR definitions contributed by the LAS Working Group and the +Additional VLR and EVLR definitions contributed by the LAS Working Group and the LAS community can be found on the :ref:`Official LAS Wiki `. Classification Lookup (Deprecated) From c0b5db409ad9edc8f3fab1a80fcfcd65fa231b77 Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Mon, 25 Aug 2025 15:22:26 -0700 Subject: [PATCH 101/103] Remove draft notation for final publication --- source/01_intro.txt | 2 +- source/conf.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/source/01_intro.txt b/source/01_intro.txt index 79e12d2..8a99a40 100644 --- a/source/01_intro.txt +++ b/source/01_intro.txt @@ -21,7 +21,7 @@ LAS 1.5 Revision History Summary of LAS 1.5 revisions (topic links included when applicable): -* R00 - Approved Version (Summer 2025). +* R00 - Approved Version (August 2025). Comparison of LAS 1.5 to Previous Versions diff --git a/source/conf.py b/source/conf.py index 0e2066c..64bd122 100644 --- a/source/conf.py +++ b/source/conf.py @@ -65,15 +65,14 @@ # The short X.Y version. #version = u'1.4' # Custom non-keyword version tag for header -myversion = u'1.5 - R20 DRAFT' +myversion = u'1.5 - R00' # The full version, including alpha/beta/rc tags. release = u'VERSION ' + myversion releasename = release version='' # Publication info (approval date, release date, and GitHub SHA) -today='09 July 2019' -releasedate='09 July 2019' +releasedate='XX XXX 2025' approvaldate = 'November 2011' import subprocess From c3bc700f2a04a820e900ebaaf2b0db883985e74e Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Mon, 25 Aug 2025 15:28:34 -0700 Subject: [PATCH 102/103] Better readability without page break before FWF VLR --- source/04_optional_vlrs.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/04_optional_vlrs.txt b/source/04_optional_vlrs.txt index 9974644..e5e261a 100644 --- a/source/04_optional_vlrs.txt +++ b/source/04_optional_vlrs.txt @@ -247,10 +247,6 @@ updating a record such as projection information where a new EVLR is appended to the end of the LAS file. The existing VLR which has been superseded must be marked with the SUPERSEDED Record ID. -.. raw:: latex - - \newpage - .. _fwf_descriptor_label: Waveform Packet Descriptor From 706664b4b373fc8512cdc1f8b53cac29778e23cc Mon Sep 17 00:00:00 2001 From: Evon Silvia Date: Tue, 26 Aug 2025 10:07:52 -0700 Subject: [PATCH 103/103] Finalize publication dates of LAS 1.5 Revision 00 (Aug 2025) --- source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/conf.py b/source/conf.py index 64bd122..45d6937 100644 --- a/source/conf.py +++ b/source/conf.py @@ -72,8 +72,8 @@ version='' # Publication info (approval date, release date, and GitHub SHA) -releasedate='XX XXX 2025' -approvaldate = 'November 2011' +releasedate='27 August 2025' +approvaldate = 'August 2025' import subprocess