Skip to content

ASSIGN_PROJECTION

Assigns a coordinate reference system (CRS) to a LAS/LAZ point cloud that carries no valid projection metadata. Unlike REPROJECT_LAS, this executor does not transform coordinates — it stamps the projection definition onto the dataset as-is using PDAL's a_srs (assign SRS) property.

Projection definitions are fetched from epsg.io in PROJJSON format, which PDAL handles more reliably than bare EPSG codes in edge cases. Both simple horizontal and compound horizontal+vertical CRS definitions are supported.

Typical use: fixing unprojected or mis-tagged datasets before further processing. Use this when the coordinates are already correct but the file lacks a CRS definition (or carries the wrong one). If the coordinates themselves need to change, use REPROJECT_LAS instead.


Contract

TypeASSIGN_PROJECTION
Acceptsinput_las: las
Producesoutput_las: las
Paramstarget_epsg (string)

Inputs

SlotTypeDescription
input_laslasSource point cloud dataset

Outputs

SlotTypeDescription
output_laslasPoint cloud with the specified CRS stamped into its metadata

Parameters

NameTypeDescription
target_epsgstringCRS to assign to the dataset (e.g. "EPSG:2271" or "EPSG:26915+EPSG:5703")

Accepts standard EPSG codes, ESRI codes, and compound CRS strings (horizontal+vertical joined with +).

Only target_epsg is needed — there is no source_epsg because the source CRS is treated as undefined (or irrelevant).


What it does internally

1. Download artifact

The input LAS is downloaded from MinIO to a temporary local path.

2. Split and clean EPSG codes

target_epsg is split on + to extract component codes. EPSG: and ESRI: prefixes are stripped from each code before lookup.

3. Fetch PROJJSON definitions

For each component code, the workflow fetches https://epsg.io/{code}.json to retrieve the full PROJJSON definition. This is a different format from REPROJECT_LAS, which uses .wkt — PROJJSON is the native JSON representation of CRS objects used by PROJ 6+.

4. Build PDAL pipeline

Depending on whether the CRS is simple or compound:

Simple (horizontal only):

LAS → writers.copc  (a_srs = horizontal PROJJSON)

Compound (horizontal + vertical):

The two PROJJSON components are assembled into a CompoundCRS object:

json
{
  "type": "CompoundCRS",
  "name": "EPSG:XXXX+EPSG:YYYY",
  "components": [ <horizontal PROJJSON>, <vertical PROJJSON> ]
}

This compound object is then passed as a_srs:

LAS → writers.copc  (a_srs = compound PROJJSON)

In both cases the output is a COPC file with scale_x/y/z = 0.001 and offset = auto. No coordinate transformation is applied.

5. Run PDAL and upload

The pipeline JSON is saved to disk and executed. On success, the output file is uploaded to MinIO, inspected with pdal info, hashed with md5sum, and returned as the output_las artifact.


Recipe usage

json
{
  "id": "assign_projection",
  "type": "ASSIGN_PROJECTION",
  "inputs":  { "input_las": "job:input_las" },
  "outputs": { "output_las": "step:assign_projection.output_las" },
  "param_keys": ["target_epsg"]
}

Job params:

json
"params": {
  "assign_projection": {
    "target_epsg": "EPSG:2271"
  }
}

Compound CRS example (horizontal + vertical):

json
"params": {
  "assign_projection": {
    "target_epsg": "EPSG:26915+EPSG:5703"
  }
}

Artifact storage path

artifacts/job_{id}/assign_projection/output.las

  • REPROJECT_LAS — transforms coordinates from one CRS to another; use when the source CRS is known and coordinates need to change