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
| Type | ASSIGN_PROJECTION |
| Accepts | input_las: las |
| Produces | output_las: las |
| Params | target_epsg (string) |
Inputs
| Slot | Type | Description |
|---|---|---|
input_las | las | Source point cloud dataset |
Outputs
| Slot | Type | Description |
|---|---|---|
output_las | las | Point cloud with the specified CRS stamped into its metadata |
Parameters
| Name | Type | Description |
|---|---|---|
target_epsg | string | CRS 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.lasRelated executors
REPROJECT_LAS— transforms coordinates from one CRS to another; use when the source CRS is known and coordinates need to change