Skip to content
Closed
Show file tree
Hide file tree
Changes from 13 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 95 additions & 49 deletions contrib/babelfishpg_common/sql/geography.sql
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,24 @@ CREATE OR REPLACE FUNCTION sys.Geography__STPointFromText(text, integer)
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.Geography__STLineFromText(text, integer)
RETURNS sys.GEOGRAPHY
AS $$
DECLARE
Geomtype text;
geom sys.GEOGRAPHY;
BEGIN
geom = (SELECT sys.geogfromtext_helper($1, $2));
Geomtype = (SELECT sys.ST_GeometryType(geom));

IF Geomtype = 'ST_Linestring' THEN
RETURN geom;
ELSE
RAISE EXCEPTION '% is not supported', Geomtype;
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.ST_GeometryType(sys.GEOGRAPHY)
RETURNS text
AS '$libdir/postgis-3', 'geometry_geometrytype'
Expand All @@ -242,10 +260,17 @@ CREATE OR REPLACE FUNCTION sys.ST_zmflag(sys.GEOGRAPHY)
AS '$libdir/postgis-3', 'LWGEOM_zmflag'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.STArea(sys.GEOGRAPHY)
CREATE OR REPLACE FUNCTION sys.STArea(geom sys.GEOGRAPHY)
RETURNS float8
AS '$libdir/postgis-3','ST_Area'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
AS $$
BEGIN
IF STIsValid(geom) = 0 THEN
RAISE EXCEPTION 'The geography instance is not valid';
ELSE
RETURN sys.STArea_helper(geom);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.STSrid(sys.GEOGRAPHY)
RETURNS integer
Expand All @@ -258,6 +283,8 @@ CREATE OR REPLACE FUNCTION sys.STEquals(geom1 sys.GEOGRAPHY, geom2 sys.GEOGRAPHY
BEGIN
IF STSrid(geom1) != STSrid(geom2) THEN
RETURN NULL;
ELSEIF STIsValid(geom1) = 0 OR STIsValid(geom2) = 0 THEN
RAISE EXCEPTION 'The geography instance is not valid';
ELSE
Return sys.STEquals_helper($1,$2);
END IF;
Expand All @@ -270,6 +297,8 @@ CREATE OR REPLACE FUNCTION sys.STContains(geom1 sys.GEOGRAPHY, geom2 sys.GEOGRAP
BEGIN
IF STSrid(geom1) != STSrid(geom2) THEN
RETURN NULL;
ELSEIF STIsValid(geom1) = 0 OR STIsValid(geom2) = 0 THEN
RAISE EXCEPTION 'The geography instance is not valid';
ELSE
Return sys.STContains_helper($1,$2);
END IF;
Expand Down Expand Up @@ -322,64 +351,73 @@ CREATE OPERATOR sys.<> (
-- STDimension
-- Retrieves spatial dimension
CREATE OR REPLACE FUNCTION sys.STDimension(geom sys.GEOGRAPHY)
RETURNS integer
AS $$
BEGIN
-- Check if the geography is empty
IF STIsEmpty(geom) = 1 THEN
RETURN -1;
END IF;
RETURN sys.STDimension_helper($1);
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
RETURNS integer
AS $$
BEGIN
-- Check if the geography is valid
IF STIsValid(geom) = 0 THEN
RAISE EXCEPTION 'The geography instance is not valid';
-- Check if the geography is empty
ELSEIF STIsEmpty(geom) = 1 THEN
RETURN -1;
ELSE
RETURN sys.STDimension_helper($1);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

-- STDisjoint
-- Checks if two geometries have no points in common
CREATE OR REPLACE FUNCTION sys.STDisjoint(geom1 sys.GEOGRAPHY, geom2 sys.GEOGRAPHY)
RETURNS sys.BIT
AS $$
BEGIN
--Check if the SRIDs do not match
IF sys.STSrid(geom1) != sys.STSrid(geom2) THEN
RETURN NULL;
END IF;
RETURN sys.STDisjoint_helper($1, $2);
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
RETURNS sys.BIT
AS $$
BEGIN
--Check if the SRIDs do not match
IF sys.STSrid(geom1) != sys.STSrid(geom2) THEN
RETURN NULL;
ELSEIF STIsValid(geom1) = 0 OR STIsValid(geom2) = 0 THEN
RAISE EXCEPTION 'The geography instance is not valid';
ELSE
RETURN sys.STDisjoint_helper($1, $2);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

-- STIntersects
-- Checks if two geometries spatially intersect
CREATE OR REPLACE FUNCTION sys.STIntersects(geom1 sys.GEOGRAPHY, geom2 sys.GEOGRAPHY)
RETURNS sys.BIT
AS $$
BEGIN
--Check if the SRIDs do not match
IF STSrid(geom1) != STSrid(geom2) THEN
RETURN NULL;
ELSE
RETURN sys.STIntersects_helper($1,$2);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
RETURNS sys.BIT
AS $$
BEGIN
--Check if the SRIDs do not match
IF STSrid(geom1) != STSrid(geom2) THEN
RETURN NULL;
ELSEIF STIsValid(geom1) = 0 OR STIsValid(geom2) = 0 THEN
RAISE EXCEPTION 'The geography instance is not valid';
ELSE
RETURN sys.STIntersects_helper($1,$2);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

-- STIsClosed
-- Checks if geometry is closed
CREATE OR REPLACE FUNCTION sys.STIsClosed(geom sys.GEOGRAPHY)
RETURNS sys.BIT
AS $$
DECLARE
geom_type text;
BEGIN
-- Get the geography type
geom_type := ST_GeometryType(geom);
-- Check if any figures of the geography instance are points
IF geom_type = 'ST_Point' THEN
RETURN 0;
END IF;
RETURN sys.STIsClosed_helper(geom);
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
RETURNS sys.BIT
AS $$
DECLARE
geom_type text;
BEGIN
-- Get the geography type
geom_type := ST_GeometryType(geom);
-- Check if any figures of the geography instance are points
IF geom_type = 'ST_Point' THEN
RETURN 0;
END IF;

RETURN sys.STIsClosed_helper(geom);
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

-- Minimum distance
CREATE OR REPLACE FUNCTION sys.STDistance(geog1 sys.GEOGRAPHY, geog2 sys.GEOGRAPHY)
Expand All @@ -392,6 +430,8 @@ CREATE OR REPLACE FUNCTION sys.STDistance(geog1 sys.GEOGRAPHY, geog2 sys.GEOGRAP
ELSEIF STIsEmpty(geog1) = 1 OR STIsEmpty(geog2) = 1 THEN
RETURN NULL;

ELSEIF STIsValid(geog1) = 0 OR STIsValid(geog2) = 0 THEN
RAISE EXCEPTION 'The geography instance is not valid';
ELSE
-- Call the underlying function after preprocessing
-- Here we are flipping the coordinates
Expand Down Expand Up @@ -556,3 +596,9 @@ CREATE OR REPLACE FUNCTION sys.geogfromtext_helper(text, integer)
RETURNS sys.GEOGRAPHY
AS 'babelfishpg_common', 'get_geography_from_text'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.STArea_helper(sys.GEOGRAPHY)
RETURNS float8
AS '$libdir/postgis-3','ST_Area'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

Loading
Loading