# Projecting (snapping) a SQL Server Spatial point to a geometry using TSQL

## STProjectPoint

— Returns a measured point by snapping provided point to the provided line.

**Function Specification.**

Function [lrs].[STProjectPoint] ( @p_linestring geometry, @p_point geometry, @p_round_xy int = 3, @p_round_zm int = 2 ) Returns geometry

**Description.**

This function snaps supplied point to @p_linestring, returning the snapped point.

If there is more than one possible solution the first point is returned.

Computes Z and M values if exist on @p_linestring.

If input @p_linestring is 2D, length from start of @p_linestring to point is returned in M ordinate of snapped point.

Returned points ordinate values are rounded to @p_round_xy/@p_round_zm decimal digits of precision.

**Notes.**

Supports linestrings with CircularString elements.

**Parameters.**

@p_linestring (geometry) - Measured linestring with or without Z ordinates. @p_point (geometry) - Point near to linestring. @p_round_xy (int) - Decimal digits of precision for XY ordinates. @p_round_zm (int) - Decimal digits of precision for M ordinate.

**Result.**

The function snaps the supplied @p_point to @p_linestring computing XY, Z (if exists) and M ordinate values.

**Example.**

select CAST('Actual Measure' as varchar(20)) as test, [lrs].[STProjectPoint] ( geometry::STGeomFromText('LINESTRING(-4 -4 0 1, 0 0 0 5.6, 10 0 0 15.61, 10 10 0 25.4)',28355), geometry::Point(8,8,28355), 3,2).AsTextZM() as project_point union all select '2D return length in measure' as test, [lrs].[STProjectPoint] ( geometry::STGeomFromText('LINESTRING(-4 -4, 0 0, 10 0, 10 10)',28355), geometry::Point(8,8,28355), 3,2).AsTextZM() as project_point GO test project_point Actual Measure POINT (10 8 NULL 23.44) 2D return length in measure POINT (10 8 NULL 23.66)