# STLocateBetweenElevations

STLocateBetweenElevations — Computes and returns elements that intersect the specified Z range.

Function Specification

```Function [\$(lrsowner)].[STLocateBetweenElevations] (
@p_linestring geometry,
@p_start_z    Float,
@p_end_z      Float = null,
@p_round_xy   int   = 3,
@p_round_zm   int   = 2
)
Returns geometry
```

Description

Is implementation of PostGIS:

```      geometry ST_LocateBetweenElevations(geometry geom_mline,
float8 elevation_start,
float8 elevation_end);
```

Processes the supplied (3D, 3DM) (multi)linestring returning the elements that intersect the specified range of elevations inclusively.

May return points and/or linestrings in the appropriate geometry type.

Where a new xy position is to be computed, the value is rounded using @p_round_xm.

Computes M values if exist on @p_linestring and rounds the values based on @p_round_zm.

Notes

Does not currently support Linestrings with CircularString elements (2012+).

Parameters

```    @p_linestring (geometry) - Linestring geometry with Z ordinates (could have M ordinates).
@p_start_z       (float) - Start Elevation.
@p_end_z         (float) - End Elevation.
@p_round_xy        (int) - Decimal degrees of precision to which calculated XY ordinates are rounded.
@p_round_zm        (int) - Decimal degrees of precision to which calculated ZM ordinates are rounded.
```

Result

This function computes and extracts the geometry of the appropriate type.

Examples

```-- PostGIS 1
select [\$(lrsowner)].[STLocateBetweenElevations](
geometry::STGeomFromText('LINESTRING(1 2 3, 4 5 6)',0),
2,4,
3,2
).AsTextZM() as geomZ;

geomz
LINESTRING (1 2 3, 2 3 4)

-- PostGIS 2
select [\$(lrsowner)].[STLocateBetweenElevations](
geometry::STGeomFromText('LINESTRING(1 2 6, 4 5 -1, 7 8 9)',0),
6,9,
3,2
).AsTextZM() as geomZ;

geomz
GEOMETRYCOLLECTION (POINT (1 2 6), LINESTRING (6.1 7.1 6, 7 8 9))

-- PostGIS 3
SELECT d.geom.AsTextZM() as geomWKT
FROM (SELECT [\$(lrsowner)].[STLocateBetweenElevations](
geometry::STGeomFromText('LINESTRING(1 2 6, 4 5 -1, 7 8 9)',0),
6,9,
3,2
) As the_geom
) As foo
cross apply
[\$(owner)].[STExtract](foo.the_geom,default) as d;

geomWKT
POINT (1 2 6)
LINESTRING (6.1 7.1 6, 7 8 9)
```