Skip to content
πŸŽ‰ Apache Sedona 1.9.1 is out now! πŸ—ΊοΈ Geography SQL functions, Box2D & Box3D types, raster Python UDFs & more. Read the release notes β†’

ST_SharedPaths

Introduction: Returns the paths shared by two lineal geometries, grouped by traversal direction.

Format: ST_SharedPaths(A: geometry, B: geometry)

Return type: Geometry

This function supports Snowflake GEOMETRY values. It is not available for GEOGRAPHY values. Both inputs must be a LineString or MultiLineString. The result is a GeometryCollection containing exactly two MultiLineString elements. The first contains paths traversed in the same direction by both inputs; the second contains paths traversed in opposite directions. Coordinates in both elements follow the direction of A.

Use ST_GeometryN(result, 1) to access the first element and ST_GeometryN(result, 2) to access the second.

For non-simple inputs that traverse the same path more than once, direction follows the first matching source traversal. Consequently, swapping A and B can change which result element contains a path.

Snowflake's native GEOMETRY bridge passes values to Sedona as GeoJSON, which does not carry SRID metadata. Consequently, this variant cannot reject mixed input SRIDs or preserve a matching SRID; its result has SRID 0. The legacy binary geometry interface preserves matching SRIDs. A non-empty result retains Z only when at least one input has Z and every coordinate of every returned shared path resolves to a finite Z from the input geometries. If any returned coordinate does not resolve to a finite source Z, the entire result is two-dimensional. M values are always dropped. A result with no shared paths is also two-dimensional.

When the inputs do not share a path, including when they intersect only at points, both elements are empty MultiLineString geometries.

Visual examples

Same and opposite directions

Input B first follows A, leaves it, and later traverses another part of A backwards. The single result therefore populates both direction buckets. Notice that the path in the second element is reoriented to follow A, even though B traverses it in the opposite direction.

Same-direction and opposite-direction paths returned together by ST_SharedPaths

Multipart input and noded output

Input A can be a MultiLineString. In this example, B shares part of two different components of A. The vertex at (90 161) belongs to B and splits the shared diagonal into two paths in the first element.

ST_SharedPaths over multipart input with a shared path split at an input vertex

Point-only intersections

Crossing at an interior point and touching at an endpoint are both zero-dimensional contacts. Neither is a shared path, so both MultiLineString elements are empty.

ST_SharedPaths ignores interior crossings and endpoint-only touches

SQL examples

Wrap the result in ST_AsText to display its two direction buckets as WKT.

Same direction

The shared interval is returned in the first element because both inputs traverse it from left to right.

SELECT ST_AsText(ST_SharedPaths(
    ST_GeometryFromWKT('LINESTRING (0 0, 10 0)'),
    ST_GeometryFromWKT('LINESTRING (5 0, 15 0)')
));

Output:

GEOMETRYCOLLECTION (MULTILINESTRING ((5 0, 10 0)), MULTILINESTRING EMPTY)

Opposite direction

The shared interval is returned in the second element because B traverses it from right to left. Its coordinates still follow the left-to-right direction of A.

SELECT ST_AsText(ST_SharedPaths(
    ST_GeometryFromWKT('LINESTRING (0 0, 10 0)'),
    ST_GeometryFromWKT('LINESTRING (15 0, 5 0)')
));

Output:

GEOMETRYCOLLECTION (MULTILINESTRING EMPTY, MULTILINESTRING ((5 0, 10 0)))

Same and opposite paths in one result

One input pair can populate both elements. Here, B first follows A, leaves it, and later returns along A in the opposite direction.

SELECT ST_AsText(ST_SharedPaths(
    ST_GeometryFromWKT('LINESTRING (0 0, 100 0)'),
    ST_GeometryFromWKT('LINESTRING (20 0, 30 0, 30 50, 80 0, 70 0)')
));

Output:

GEOMETRYCOLLECTION (MULTILINESTRING ((20 0, 30 0)), MULTILINESTRING ((70 0, 80 0)))

Multipart input and noded output

Shared paths can come from different components of a MultiLineString. The overlay is noded at vertices from either input, so a shared path may be shorter than its containing input segment.

SELECT ST_AsText(ST_SharedPaths(
    ST_GeometryFromWKT(
        'MULTILINESTRING ((1 3, 4 2, 7 2, 7 5), (13 10, 14 7, 11 6, 15 5))'
    ),
    ST_GeometryFromWKT(
        'LINESTRING (2 1, 4 2, 7 2, 8 3, 10 6, 11 6, 14 7, 16 9)'
    )
));

Output:

GEOMETRYCOLLECTION (MULTILINESTRING ((4 2, 7 2)), MULTILINESTRING ((14 7, 11 6)))

No lineal overlap

Lines that cross only at a point do not share a path, so both elements are empty.

SELECT ST_AsText(ST_SharedPaths(
    ST_GeometryFromWKT('LINESTRING (0 0, 10 0)'),
    ST_GeometryFromWKT('LINESTRING (5 -5, 5 5)')
));

Output:

GEOMETRYCOLLECTION (MULTILINESTRING EMPTY, MULTILINESTRING EMPTY)

Practical use: comparing linear networks

ST_SharedPaths is useful when two road, rail, pipeline, or utility-network datasets contain coincident centerlines and direction matters. For example, it can distinguish a road segment digitized consistently in two datasets from a one-way segment digitized in reverse. It can also measure how much of an inspected utility route follows its reference alignment in either direction.

The following query assumes that a spatial join has already paired candidate segments. The first element measures consistently directed overlap, while the second element measures reversed overlap:

WITH compared AS (
    SELECT
        segment_id,
        ST_SharedPaths(reference_geom, candidate_geom) AS shared
    FROM network_segment_pairs
)
SELECT
    segment_id,
    ST_Length(ST_GeometryN(shared, 1)) AS same_direction_length,
    ST_Length(ST_GeometryN(shared, 2)) AS opposite_direction_length
FROM compared;

Rows with a positive opposite_direction_length are useful candidates for direction or one-way attribute review. Apply ST_SharedPaths after candidate matching rather than to every possible pair in two large networks. The function finds exact lineal overlap; snap or otherwise normalize nearly coincident datasets first when their coordinates differ within an accepted tolerance.