Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
72 changes: 72 additions & 0 deletions contrib/babelfishpg_common/sql/geography.sql
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,27 @@ CREATE OR REPLACE FUNCTION sys.STDimension(geom sys.GEOGRAPHY)
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

-- REDUCE
CREATE OR REPLACE FUNCTION sys.Reduce(tolerance float8, geom sys.GEOGRAPHY)
RETURNS sys.GEOGRAPHY
AS $$
BEGIN
IF geom IS NULL THEN
RETURN NULL;
ELSEIF tolerance IS NULL THEN
RAISE EXCEPTION 'tolerance is not allowed to be null';
ELSEIF sys.STIsEmpty(geom) = 1 THEN
RETURN geom;
ELSEIF sys.STIsValid(geom) = 0 THEN
RAISE EXCEPTION 'The geography instance is not valid';
ELSEIF tolerance < 0 THEN
RAISE EXCEPTION 'Tolerance cannot be negative';
ELSE
RETURN sys.Reduce_helper(geom, tolerance);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;

-- STDisjoint
-- Checks if two geometries have no points in common
CREATE OR REPLACE FUNCTION sys.STDisjoint(geom1 sys.GEOGRAPHY, geom2 sys.GEOGRAPHY)
Expand Down Expand Up @@ -633,6 +654,57 @@ CREATE OR REPLACE FUNCTION sys.STDimension_helper(sys.GEOGRAPHY)
AS '$libdir/postgis-3','LWGEOM_dimension'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.Reduce_helper(geog sys.GEOGRAPHY, tolerance float8)
RETURNS sys.GEOGRAPHY
AS $$
DECLARE
centroid_lat float8;
meters_per_degree float8;
tolerance_degrees float8;
centroid_geog sys.GEOGRAPHY;
result_geog sys.GEOGRAPHY;
BEGIN
centroid_geog := sys.STCentroid_helper(geog);

IF centroid_geog IS NULL THEN
RETURN geog;
END IF;

centroid_lat := sys.lat(centroid_geog);

IF centroid_lat IS NULL THEN
centroid_lat := 0;
END IF;

meters_per_degree := 111320.0 * COS(RADIANS(centroid_lat));

IF meters_per_degree < 1 THEN
meters_per_degree := 111320.0;
END IF;

tolerance_degrees := tolerance / meters_per_degree;

result_geog := sys.geography_simplify_internal(geog, tolerance_degrees);

IF result_geog IS NULL THEN
RETURN geog;
END IF;

RETURN result_geog;
END;
$$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;


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

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

CREATE OR REPLACE FUNCTION sys.STIntersects_helper(geom1 sys.GEOGRAPHY, geom2 sys.GEOGRAPHY)
RETURNS sys.BIT
AS '$libdir/postgis-3','ST_Intersects'
Expand Down
26 changes: 26 additions & 0 deletions contrib/babelfishpg_common/sql/geometry.sql
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,27 @@ CREATE OR REPLACE FUNCTION sys.STDimension(geom sys.GEOMETRY)
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;

--REDUCE
CREATE OR REPLACE FUNCTION sys.Reduce(tolerance float8, geom sys.GEOMETRY)
RETURNS sys.GEOMETRY
AS $$
BEGIN
IF geom IS NULL THEN
RETURN NULL;
ELSEIF tolerance IS NULL THEN
RAISE EXCEPTION 'tolerance is not allowed to be null';
ELSEIF tolerance < 0 THEN
RAISE EXCEPTION 'tolerance must be greater than or equal to zero';
ELSEIF sys.STIsEmpty(geom) = 1 THEN
RETURN geom;
ELSEIF sys.STIsValid(geom) = 0 THEN
RAISE EXCEPTION 'The geometry instance is not valid';
ELSE
RETURN sys.STReduce_helper(geom, tolerance);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;

-- STDisjoint
-- Checks if two geometries have no points in common
CREATE OR REPLACE FUNCTION sys.STDisjoint(geom1 sys.GEOMETRY, geom2 sys.GEOMETRY)
Expand Down Expand Up @@ -623,6 +644,11 @@ CREATE OR REPLACE FUNCTION sys.STDimension_helper(sys.GEOMETRY)
AS '$libdir/postgis-3','LWGEOM_dimension'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.STReduce_helper(geom sys.GEOMETRY, tolerance float8)
RETURNS sys.GEOMETRY
AS '$libdir/postgis-3', 'LWGEOM_simplify2d'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.STIntersects_helper(geom1 sys.GEOMETRY, geom2 sys.GEOMETRY)
RETURNS sys.BIT
AS '$libdir/postgis-3','ST_Intersects'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,100 @@
-------------------------------------------------------
---- Include changes related to spatial types here ----
-------------------------------------------------------
CREATE OR REPLACE FUNCTION sys.Reduce(tolerance float8, geom sys.GEOMETRY)
RETURNS sys.GEOMETRY
AS $$
BEGIN
IF geom IS NULL THEN
RETURN NULL;
ELSEIF tolerance IS NULL THEN
RAISE EXCEPTION 'tolerance is not allowed to be null';
ELSEIF tolerance < 0 THEN
RAISE EXCEPTION 'tolerance must be greater than or equal to zero';
ELSEIF sys.STIsEmpty(geom) = 1 THEN
RETURN geom;
ELSEIF sys.STIsValid(geom) = 0 THEN
RAISE EXCEPTION 'The geometry instance is not valid';
ELSE
RETURN sys.STReduce_helper(geom, tolerance);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.STReduce_helper(geom sys.GEOMETRY, tolerance float8)
RETURNS sys.GEOMETRY
AS '$libdir/postgis-3', 'LWGEOM_simplify2d'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;


--GEOGRAPHY
CREATE OR REPLACE FUNCTION sys.Reduce(tolerance float8, geom sys.GEOGRAPHY)
RETURNS sys.GEOGRAPHY
AS $$
BEGIN
IF geom IS NULL THEN
RETURN NULL;
ELSEIF tolerance IS NULL THEN
RAISE EXCEPTION 'tolerance is not allowed to be null';
ELSEIF sys.STIsEmpty(geom) = 1 THEN
RETURN geom;
ELSEIF sys.STIsValid(geom) = 0 THEN
RAISE EXCEPTION 'The geography instance is not valid';
ELSEIF tolerance < 0 THEN
RAISE EXCEPTION 'Tolerance cannot be negative';
ELSE
RETURN sys.Reduce_helper(geom, tolerance);
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;

CREATE OR REPLACE FUNCTION sys.Reduce_helper(geog sys.GEOGRAPHY, tolerance float8)
RETURNS sys.GEOGRAPHY
AS $$
DECLARE
centroid_lat float8;
meters_per_degree float8;
tolerance_degrees float8;
centroid_geog sys.GEOGRAPHY;
result_geog sys.GEOGRAPHY;
BEGIN
centroid_geog := sys.STCentroid_helper(geog);

IF centroid_geog IS NULL THEN
RETURN geog;
END IF;

centroid_lat := sys.lat(centroid_geog);

IF centroid_lat IS NULL THEN
centroid_lat := 0;
END IF;

meters_per_degree := 111320.0 * COS(RADIANS(centroid_lat));

IF meters_per_degree < 1 THEN
meters_per_degree := 111320.0;
END IF;

tolerance_degrees := tolerance / meters_per_degree;

result_geog := sys.geography_simplify_internal(geog, tolerance_degrees);

IF result_geog IS NULL THEN
RETURN geog;
END IF;

RETURN result_geog;
END;
$$ LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE;


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

CREATE OR REPLACE FUNCTION sys.STCentroid_helper(sys.GEOGRAPHY)
RETURNS sys.GEOGRAPHY
AS '$libdir/postgis-3', 'geography_centroid'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
1 change: 1 addition & 0 deletions contrib/babelfishpg_tsql/antlr/TSqlParser.g4
Original file line number Diff line number Diff line change
Expand Up @@ -3950,6 +3950,7 @@ geospatial_func_no_arg
geospatial_func_arg
: STDISTANCE
| STEQUALS
| REDUCE
| STCONTAINS
| STDISJOINT
| STINTERSECTS
Expand Down
14 changes: 14 additions & 0 deletions test/JDBC/expected/Test-spatial-functions-2-vu-cleanup.out
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,18 @@ DROP TABLE TestGeospatialMethods_SPATIALPOINTGEOM_dttemp

DROP TABLE TestGeospatialMethods_SPATIALPOINTGEOG_dttemp

DROP VIEW TestGeospatialMethods_REDUCE_ValidFromGeomTemp


DROP VIEW TestGeospatialMethods_REDUCE_ValidFromGeogTemp


DROP TABLE TestGeospatialMethods_REDUCE_GEOM1temp

DROP TABLE TestGeospatialMethods_REDUCE_GEOG1temp

DROP TABLE TestGeospatialMethods_REDUCE_GEOMtemp

DROP TABLE TestGeospatialMethods_REDUCE_GEOGtemp

DROP DATABASE TestGeospatialMethods_DB
28 changes: 28 additions & 0 deletions test/JDBC/expected/Test-spatial-functions-2-vu-prepare.out
Original file line number Diff line number Diff line change
Expand Up @@ -90,3 +90,31 @@ CREATE VIEW TestGeospatialMethods_closed_TextFromGeogTemp AS SELECT location.ST
CREATE VIEW TestGeospatialMethods_empty_ValFromGeomTemp AS SELECT location.STIsEmpty() FROM TestGeospatialMethods_SPATIALPOINTGEOM_dttemp ORDER BY location.STX;

CREATE VIEW TestGeospatialMethods_empty_TextFromGeomTemp AS SELECT location.STIsEmpty() AS Dimension FROM TestGeospatialMethods_SPATIALPOINTGEOG_dttemp ORDER BY location.Lat;

CREATE TABLE TestGeospatialMethods_REDUCE_GEOM1temp ( ID INT PRIMARY KEY, LineColumn geometry, Tolerance FLOAT );

INSERT INTO TestGeospatialMethods_REDUCE_GEOM1temp (ID, LineColumn, Tolerance) VALUES (1, geometry::STGeomFromText('LINESTRING(0 0, 1 1, 2 0)', 0), 0.5), (2, geometry::STGeomFromText('LINESTRING(0 0, 0.5 0.5, 1 0)', 0), 0.3), (3, geometry::STGeomFromText('LINESTRING(0 0, 0.1 0.1, 0.2 0, 1 0)', 0), 0.05), (4, geometry::STGeomFromText('POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))', 0), 0.1);
~~ROW COUNT: 4~~


CREATE TABLE TestGeospatialMethods_REDUCE_GEOG1temp ( ID INT PRIMARY KEY, LineColumn geography, ToleranceMeters FLOAT );

INSERT INTO TestGeospatialMethods_REDUCE_GEOG1temp (ID, LineColumn, ToleranceMeters) VALUES (1, geography::STGeomFromText('LINESTRING(-122 47, -121 47.1, -120 47)', 4326), 1000), (2, geography::STGeomFromText('LINESTRING(-122 47, -121.5 47.05, -121 47)', 4326), 5000), (3, geography::STGeomFromText('POLYGON((-122 47, -122 48, -121 48, -121 47, -122 47))', 4326), 10000);
~~ROW COUNT: 3~~


CREATE TABLE TestGeospatialMethods_REDUCE_GEOMtemp ( ID INT PRIMARY KEY, LineColumn geometry, Tolerance FLOAT, Category VARCHAR(10) );

INSERT INTO TestGeospatialMethods_REDUCE_GEOMtemp (ID, LineColumn, Tolerance, Category) VALUES (1, geometry::STGeomFromText('LINESTRING(0 0, 1 1, 2 0, 3 1)', 0), 0.5, 'A'), (2, geometry::STGeomFromText('LINESTRING(0 0, 0.1 0.1, 0.2 0, 1 0)', 0), 0.05, 'B'), (3, geometry::STGeomFromText('POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))', 0), 0.1, 'A'), (4, geometry::STGeomFromText('LINESTRING(0 0, 2 2, 4 0)', 0), 0.5, 'A');
~~ROW COUNT: 4~~


CREATE VIEW TestGeospatialMethods_REDUCE_ValidFromGeomTemp AS SELECT ID, LineColumn.Reduce(Tolerance).STIsValid() AS IsValid FROM TestGeospatialMethods_REDUCE_GEOMtemp;

CREATE TABLE TestGeospatialMethods_REDUCE_GEOGtemp ( ID INT PRIMARY KEY, LineColumn geography, ToleranceMeters FLOAT, Category VARCHAR(10) );

INSERT INTO TestGeospatialMethods_REDUCE_GEOGtemp (ID, LineColumn, ToleranceMeters, Category) VALUES (1, geography::STGeomFromText('LINESTRING(-122 47, -121 47.1, -120 47)', 4326), 1000, 'C'), (2, geography::STGeomFromText('LINESTRING(-122 47, -121.5 47.05, -121 47)', 4326), 5000, 'C'), (3, geography::STGeomFromText('POLYGON((-122 47, -122 48, -121 48, -121 47, -122 47))', 4326), 10000, 'D');
~~ROW COUNT: 3~~


CREATE VIEW TestGeospatialMethods_REDUCE_ValidFromGeogTemp AS SELECT ID, LineColumn.Reduce(ToleranceMeters).STIsValid() AS IsValid FROM TestGeospatialMethods_REDUCE_GEOGtemp;
Loading
Loading