RAISE DEBUG '% signature was deprecated in %. Please use %', oldname, version, newname;
END IF;
END;
-$$ LANGUAGE 'plpgsql' IMMUTABLE STRICT
+$$ LANGUAGE 'plpgsql' IMMUTABLE STRICT
COST 100;
-------------------------------------------------------------------
-- BOX2DF TYPE (INTERNAL ONLY)
-------------------------------------------------------------------
--
--- Box2Df type is used by the GiST index bindings.
+-- Box2Df type is used by the GiST index bindings.
-- In/out functions are stubs, as all access should be internal.
---
-- Availability: 2.0.0
-- GIDX TYPE (INTERNAL ONLY)
-------------------------------------------------------------------
--
--- GIDX type is used by the N-D and GEOGRAPHY GiST index bindings.
+-- GIDX type is used by the N-D and GEOGRAPHY GiST index bindings.
-- In/out functions are stubs, as all access should be internal.
---
-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_gist_distance_2d(internal,geometry,int4)
- RETURNS float8
+CREATE OR REPLACE FUNCTION geometry_gist_distance_2d(internal,geometry,int4)
+ RETURNS float8
AS 'MODULE_PATHNAME' ,'gserialized_gist_distance_2d'
LANGUAGE 'c';
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_gist_consistent_2d(internal,geometry,int4)
- RETURNS bool
+CREATE OR REPLACE FUNCTION geometry_gist_consistent_2d(internal,geometry,int4)
+ RETURNS bool
AS 'MODULE_PATHNAME' ,'gserialized_gist_consistent_2d'
LANGUAGE 'c';
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_gist_compress_2d(internal)
- RETURNS internal
+CREATE OR REPLACE FUNCTION geometry_gist_compress_2d(internal)
+ RETURNS internal
AS 'MODULE_PATHNAME','gserialized_gist_compress_2d'
LANGUAGE 'c';
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_gist_penalty_2d(internal,internal,internal)
- RETURNS internal
+CREATE OR REPLACE FUNCTION geometry_gist_penalty_2d(internal,internal,internal)
+ RETURNS internal
AS 'MODULE_PATHNAME' ,'gserialized_gist_penalty_2d'
LANGUAGE 'c';
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_gist_picksplit_2d(internal, internal)
- RETURNS internal
+CREATE OR REPLACE FUNCTION geometry_gist_picksplit_2d(internal, internal)
+ RETURNS internal
AS 'MODULE_PATHNAME' ,'gserialized_gist_picksplit_2d'
LANGUAGE 'c';
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_gist_union_2d(bytea, internal)
- RETURNS internal
+CREATE OR REPLACE FUNCTION geometry_gist_union_2d(bytea, internal)
+ RETURNS internal
AS 'MODULE_PATHNAME' ,'gserialized_gist_union_2d'
LANGUAGE 'c';
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_gist_same_2d(geom1 geometry, geom2 geometry, internal)
- RETURNS internal
+CREATE OR REPLACE FUNCTION geometry_gist_same_2d(geom1 geometry, geom2 geometry, internal)
+ RETURNS internal
AS 'MODULE_PATHNAME' ,'gserialized_gist_same_2d'
LANGUAGE 'c';
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_gist_decompress_2d(internal)
- RETURNS internal
+CREATE OR REPLACE FUNCTION geometry_gist_decompress_2d(internal)
+ RETURNS internal
AS 'MODULE_PATHNAME' ,'gserialized_gist_decompress_2d'
LANGUAGE 'c';
LANGUAGE 'c' STRICT _PARALLEL;
-- Availability: 2.1.0
--- Given a table and a column, returns the statistics information stored by
+-- Given a table and a column, returns the statistics information stored by
-- PostgreSQL, in a JSON text form. Mode determines whether the 2D statistics
-- or the ND statistics are returned.
CREATE OR REPLACE FUNCTION _postgis_stats(tbl regclass, att_name text, text default '2')
-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_overlaps(geom1 geometry, geom2 geometry)
- RETURNS boolean
+CREATE OR REPLACE FUNCTION geometry_overlaps(geom1 geometry, geom2 geometry)
+ RETURNS boolean
AS 'MODULE_PATHNAME' ,'gserialized_overlaps_2d'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
CREATE OPERATOR && (
LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overlaps,
COMMUTATOR = '&&',
- RESTRICT = gserialized_gist_sel_2d,
- JOIN = gserialized_gist_joinsel_2d
+ RESTRICT = gserialized_gist_sel_2d,
+ JOIN = gserialized_gist_joinsel_2d
);
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_same(geom1 geometry, geom2 geometry)
- RETURNS boolean
+CREATE OR REPLACE FUNCTION geometry_same(geom1 geometry, geom2 geometry)
+ RETURNS boolean
AS 'MODULE_PATHNAME' ,'gserialized_same_2d'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
RESTRICT = contsel, JOIN = contjoinsel
);
--- As of 2.2.0 this no longer returns the centroid/centroid distance, it
+-- As of 2.2.0 this no longer returns the centroid/centroid distance, it
-- returns the actual distance, to support the 'recheck' functionality
-- enabled in the KNN operator
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_distance_centroid(geom1 geometry, geom2 geometry)
- RETURNS float8
+CREATE OR REPLACE FUNCTION geometry_distance_centroid(geom1 geometry, geom2 geometry)
+ RETURNS float8
#if POSTGIS_PGSQL_VERSION >= 95
AS 'MODULE_PATHNAME' ,'distance'
#else
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_distance_box(geom1 geometry, geom2 geometry)
- RETURNS float8
+CREATE OR REPLACE FUNCTION geometry_distance_box(geom1 geometry, geom2 geometry)
+ RETURNS float8
AS 'MODULE_PATHNAME' ,'gserialized_distance_box_2d'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_gist_consistent_nd(internal,geometry,int4)
- RETURNS bool
+CREATE OR REPLACE FUNCTION geometry_gist_consistent_nd(internal,geometry,int4)
+ RETURNS bool
AS 'MODULE_PATHNAME' ,'gserialized_gist_consistent'
LANGUAGE 'c';
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_gist_compress_nd(internal)
- RETURNS internal
+CREATE OR REPLACE FUNCTION geometry_gist_compress_nd(internal)
+ RETURNS internal
AS 'MODULE_PATHNAME','gserialized_gist_compress'
LANGUAGE 'c';
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_gist_penalty_nd(internal,internal,internal)
- RETURNS internal
+CREATE OR REPLACE FUNCTION geometry_gist_penalty_nd(internal,internal,internal)
+ RETURNS internal
AS 'MODULE_PATHNAME' ,'gserialized_gist_penalty'
LANGUAGE 'c';
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_gist_picksplit_nd(internal, internal)
- RETURNS internal
+CREATE OR REPLACE FUNCTION geometry_gist_picksplit_nd(internal, internal)
+ RETURNS internal
AS 'MODULE_PATHNAME' ,'gserialized_gist_picksplit'
LANGUAGE 'c';
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_gist_union_nd(bytea, internal)
- RETURNS internal
+CREATE OR REPLACE FUNCTION geometry_gist_union_nd(bytea, internal)
+ RETURNS internal
AS 'MODULE_PATHNAME' ,'gserialized_gist_union'
LANGUAGE 'c';
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_gist_same_nd(geometry, geometry, internal)
- RETURNS internal
+CREATE OR REPLACE FUNCTION geometry_gist_same_nd(geometry, geometry, internal)
+ RETURNS internal
AS 'MODULE_PATHNAME' ,'gserialized_gist_same'
LANGUAGE 'c';
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_gist_decompress_nd(internal)
- RETURNS internal
+CREATE OR REPLACE FUNCTION geometry_gist_decompress_nd(internal)
+ RETURNS internal
AS 'MODULE_PATHNAME' ,'gserialized_gist_decompress'
LANGUAGE 'c';
-- ---------- ---------- ---------- ---------- ---------- ---------- ----------
-- Availability: 2.0.0
-CREATE OR REPLACE FUNCTION geometry_overlaps_nd(geometry, geometry)
- RETURNS boolean
+CREATE OR REPLACE FUNCTION geometry_overlaps_nd(geometry, geometry)
+ RETURNS boolean
AS 'MODULE_PATHNAME' ,'gserialized_overlaps'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
LEFTARG = geometry, RIGHTARG = geometry, PROCEDURE = geometry_overlaps_nd,
COMMUTATOR = '&&&',
RESTRICT = gserialized_gist_sel_nd,
- JOIN = gserialized_gist_joinsel_nd
+ JOIN = gserialized_gist_joinsel_nd
);
-- Availability: 2.2.0
LANGUAGE 'c' IMMUTABLE STRICT SECURITY DEFINER;
-- Availability: 1.2.2
--- Deprecation in 2.1.0
+-- Deprecation in 2.1.0
CREATE OR REPLACE FUNCTION ST_estimated_extent(text,text,text) RETURNS box2d AS
$$ SELECT _postgis_deprecate('ST_Estimated_Extent', 'ST_EstimatedExtent', '2.1.0');
- -- We use security invoker instead of security definer
+ -- We use security invoker instead of security definer
-- to prevent malicious injection of a different same named function
SELECT ST_EstimatedExtent($1, $2, $3);
$$
LANGUAGE 'c' IMMUTABLE STRICT SECURITY DEFINER;
-- Availability: 1.2.2
--- Deprecation in 2.1.0
+-- Deprecation in 2.1.0
CREATE OR REPLACE FUNCTION ST_estimated_extent(text,text) RETURNS box2d AS
$$ SELECT _postgis_deprecate('ST_Estimated_Extent', 'ST_EstimatedExtent', '2.1.0');
- -- We use security invoker instead of security definer
+ -- We use security invoker instead of security definer
-- to prevent malicious injection of a same named different function
-- that would be run under elevated permissions
SELECT ST_EstimatedExtent($1, $2);
AS 'MODULE_PATHNAME', 'LWGEOM_noop'
LANGUAGE 'c' VOLATILE STRICT
COST 10;
-
+
-- Deprecation in 1.5.0
CREATE OR REPLACE FUNCTION ST_zmflag(geometry)
RETURNS smallint
AS 'MODULE_PATHNAME','LWGEOM_asEWKT'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
COST 750; --this looks suspicious, requires recheck
-
+
-- Availability: 2.2.0
CREATE OR REPLACE FUNCTION ST_AsTWKB(geom geometry, prec int4 default NULL, prec_z int4 default NULL, prec_m int4 default NULL, with_sizes boolean default NULL, with_boxes boolean default NULL)
RETURNS bytea
RETURNS geometry
AS 'MODULE_PATHNAME', 'LWGEOM_line_from_mpoint'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-
+
-- Availability: 1.2.2
CREATE OR REPLACE FUNCTION ST_MakeLine(geom1 geometry, geom2 geometry)
RETURNS geometry
i integer;
j integer;
g geometry;
-
+
BEGIN
-
+
-- RAISE DEBUG '%,%', cur_path, ST_GeometryType(the_geom);
-- Special case collections : iterate and return the DumpPoints of the geometries
IF (ST_IsCollection(the_geom)) THEN
-
+
i = 1;
FOR tmp2 IN SELECT (ST_Dump(the_geom)).* LOOP
RETURN NEXT tmp;
END LOOP;
i = i + 1;
-
+
END LOOP;
RETURN;
END IF;
-
+
-- Special case (POLYGON) : return the points of the rings of a polygon
IF (ST_GeometryType(the_geom) = 'ST_Polygon') THEN
FOR tmp IN SELECT * FROM _ST_DumpPoints(ST_ExteriorRing(the_geom), cur_path || ARRAY[1]) LOOP
RETURN NEXT tmp;
END LOOP;
-
+
j := ST_NumInteriorRings(the_geom);
FOR i IN 1..j LOOP
FOR tmp IN SELECT * FROM _ST_DumpPoints(ST_InteriorRingN(the_geom, i), cur_path || ARRAY[i+1]) LOOP
RETURN NEXT tmp;
END LOOP;
END LOOP;
-
+
RETURN;
END IF;
FOR tmp IN SELECT * FROM _ST_DumpPoints(ST_ExteriorRing(the_geom), cur_path || ARRAY[1]) LOOP
RETURN NEXT tmp;
END LOOP;
-
+
RETURN;
END IF;
-
+
-- Special case (POINT) : return the point
IF (ST_GeometryType(the_geom) = 'ST_Point') THEN
tmp.geom := ST_PointN(the_geom, i);
RETURN NEXT tmp;
END LOOP;
-
+
END
$$ LANGUAGE plpgsql;
-----------------------------------------------------------------------
-- ST_DumpPoints()
-----------------------------------------------------------------------
--- This function mimicks that of ST_Dump for collections, but this function
+-- This function mimicks that of ST_Dump for collections, but this function
-- that returns a path and all the points that make up a particular geometry.
-- Availability: 1.5.0
CREATE OR REPLACE FUNCTION ST_DumpPoints(geometry)
-- geometry_columns table.
-- Availability: 1.4.0
-- Revised: 2.0.0 -- no longer deletes from geometry_columns
--- Has new use_typmod option that defaults to true.
+-- Has new use_typmod option that defaults to true.
-- If use typmod is set to false will use old constraint behavior.
-- Will only touch table missing typmod or geometry constraints
-----------------------------------------------------------------------
AND a.atttypid = t.oid
AND a.attrelid = c.oid
AND c.relnamespace = n.oid
- AND n.nspname NOT ILIKE 'pg_temp%' AND c.relname != 'raster_columns'
+ AND n.nspname NOT ILIKE 'pg_temp%' AND c.relname != 'raster_columns'
LOOP
inserted := inserted + populate_geometry_columns(gcs.oid, use_typmod);
LOOP
RAISE DEBUG 'Processing column %.%.%', gcs.nspname, gcs.relname, gcs.attname;
-
+
gc_is_valid := true;
-- Find the srid, coord_dimension, and type of current geometry
-- in geometry_columns -- which is now a view
-
- SELECT type, srid, coord_dimension INTO gc_old
- FROM geometry_columns
- WHERE f_table_schema = gcs.nspname AND f_table_name = gcs.relname AND f_geometry_column = gcs.attname;
-
+
+ SELECT type, srid, coord_dimension INTO gc_old
+ FROM geometry_columns
+ WHERE f_table_schema = gcs.nspname AND f_table_name = gcs.relname AND f_geometry_column = gcs.attname;
+
IF upper(gc_old.type) = 'GEOMETRY' THEN
-- This is an unconstrained geometry we need to do something
-- We need to figure out what to set the type by inspecting the data
EXECUTE 'SELECT st_srid(' || quote_ident(gcs.attname) || ') As srid, GeometryType(' || quote_ident(gcs.attname) || ') As type, ST_NDims(' || quote_ident(gcs.attname) || ') As dims ' ||
- ' FROM ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) ||
+ ' FROM ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) ||
' WHERE ' || quote_ident(gcs.attname) || ' IS NOT NULL LIMIT 1;'
INTO gc;
IF gc IS NULL THEN -- there is no data so we can not determine geometry type
RETURN 0;
END IF;
gsrid := gc.srid; gtype := gc.type; gndims := gc.dims;
-
+
IF use_typmod THEN
BEGIN
- EXECUTE 'ALTER TABLE ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || ' ALTER COLUMN ' || quote_ident(gcs.attname) ||
+ EXECUTE 'ALTER TABLE ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || ' ALTER COLUMN ' || quote_ident(gcs.attname) ||
' TYPE geometry(' || postgis_type_name(gtype, gndims, true) || ', ' || gsrid::text || ') ';
inserted := inserted + 1;
EXCEPTION
RAISE WARNING 'Could not convert ''%'' in ''%.%'' to use typmod with srid %, type %: %', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname), gsrid, postgis_type_name(gtype, gndims, true), SQLERRM;
gc_is_valid := false;
END;
-
+
ELSE
-- Try to apply srid check to column
constraint_successful = false;
IF (gsrid > 0 AND postgis_constraint_srid(gcs.nspname, gcs.relname,gcs.attname) IS NULL ) THEN
BEGIN
- EXECUTE 'ALTER TABLE ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) ||
- ' ADD CONSTRAINT ' || quote_ident('enforce_srid_' || gcs.attname) ||
+ EXECUTE 'ALTER TABLE ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) ||
+ ' ADD CONSTRAINT ' || quote_ident('enforce_srid_' || gcs.attname) ||
' CHECK (st_srid(' || quote_ident(gcs.attname) || ') = ' || gsrid || ')';
constraint_successful := true;
EXCEPTION
gc_is_valid := false;
END;
END IF;
-
+
-- Try to apply ndims check to column
IF (gndims IS NOT NULL AND postgis_constraint_dims(gcs.nspname, gcs.relname,gcs.attname) IS NULL ) THEN
BEGIN
gc_is_valid := false;
END;
END IF;
-
+
-- Try to apply geometrytype check to column
IF (gtype IS NOT NULL AND postgis_constraint_type(gcs.nspname, gcs.relname,gcs.attname) IS NULL ) THEN
BEGIN
IF constraint_successful THEN
inserted := inserted + 1;
END IF;
- END IF;
+ END IF;
END IF;
END LOOP;
') = ' || new_srid::text || ')' ;
RAISE DEBUG '%', sql;
EXECUTE sql;
-
+
sql := 'ALTER TABLE ' ||
quote_ident(real_schema) || '.' || quote_ident(table_name)
|| ' ADD CONSTRAINT '
') = ' || new_dim::text || ')' ;
RAISE DEBUG '%', sql;
EXECUTE sql;
-
+
IF ( NOT (new_type = 'GEOMETRY')) THEN
sql := 'ALTER TABLE ' ||
quote_ident(real_schema) || '.' || quote_ident(table_name) || ' ADD CONSTRAINT ' ||
END IF;
END IF;
- IF postgis_constraint_srid(real_schema, table_name, column_name) IS NOT NULL THEN
+ IF postgis_constraint_srid(real_schema, table_name, column_name) IS NOT NULL THEN
-- srid was enforced with constraints before, keep it that way.
-- Make up constraint name
cname = 'enforce_srid_' || column_name;
-
+
-- Drop enforce_srid constraint
EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) ||
'.' || quote_ident(table_name) ||
' DROP constraint ' || quote_ident(cname);
-
+
-- Update geometries SRID
EXECUTE 'UPDATE ' || quote_ident(real_schema) ||
'.' || quote_ident(table_name) ||
' SET ' || quote_ident(column_name) ||
' = ST_SetSRID(' || quote_ident(column_name) ||
', ' || new_srid::text || ')';
-
+
-- Reset enforce_srid constraint
EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) ||
'.' || quote_ident(table_name) ||
' ADD constraint ' || quote_ident(cname) ||
' CHECK (st_srid(' || quote_ident(column_name) ||
') = ' || new_srid::text || ')';
- ELSE
+ ELSE
-- We will use typmod to enforce if no srid constraints
- -- We are using postgis_type_name to lookup the new name
- -- (in case Paul changes his mind and flips geometry_columns to return old upper case name)
- EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) || '.' || quote_ident(table_name) ||
+ -- We are using postgis_type_name to lookup the new name
+ -- (in case Paul changes his mind and flips geometry_columns to return old upper case name)
+ EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) || '.' || quote_ident(table_name) ||
' ALTER COLUMN ' || quote_ident(column_name) || ' TYPE geometry(' || postgis_type_name(myrec.type, myrec.coord_dimension, true) || ', ' || new_srid::text || ') USING ST_SetSRID(' || quote_ident(column_name) || ',' || new_srid::text || ');' ;
END IF;
---------------------------------------------------------------
-- CASTS
---------------------------------------------------------------
-
+
CREATE OR REPLACE FUNCTION box2d(geometry)
RETURNS box2d
AS 'MODULE_PATHNAME','LWGEOM_to_BOX2D'
CREATE CAST (geometry AS box2d) WITH FUNCTION box2d(geometry) AS IMPLICIT;
CREATE CAST (geometry AS box3d) WITH FUNCTION box3d(geometry) AS IMPLICIT;
--- ticket: 2262 changed 2.1.0 to assignment to prevent PostGIS
+-- ticket: 2262 changed 2.1.0 to assignment to prevent PostGIS
-- from misusing PostgreSQL geometric functions
CREATE CAST (geometry AS box) WITH FUNCTION box(geometry) AS ASSIGNMENT;
AS 'MODULE_PATHNAME', 'LWGEOM_simplify2d'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
COST 50; -- COST guessed from ST_Simplify(geometry, float8)
-
+
-- Availability: 2.2.0
CREATE OR REPLACE FUNCTION ST_SimplifyVW(geometry, float8)
RETURNS geometry
AS 'MODULE_PATHNAME', 'LWGEOM_SetEffectiveArea'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
COST 50; -- COST guessed from ST_Simplify(geometry, float8)
-
+
-- Availability: 2.2.0
CREATE OR REPLACE FUNCTION ST_SetEffectiveArea(geometry, float8 default -1, integer default 1)
RETURNS geometry
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-- Availability: 1.2.2
--- Deprecation in 2.1.0
+-- Deprecation in 2.1.0
CREATE OR REPLACE FUNCTION ST_line_interpolate_point(geometry, float8)
RETURNS geometry AS
$$ SELECT _postgis_deprecate('ST_Line_Interpolate_Point', 'ST_LineInterpolatePoint', '2.1.0');
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-- Availability: 1.2.2
--- Deprecation in 2.1.0
+-- Deprecation in 2.1.0
CREATE OR REPLACE FUNCTION ST_line_substring(geometry, float8, float8)
RETURNS geometry AS
$$ SELECT _postgis_deprecate('ST_Line_Substring', 'ST_LineSubstring', '2.1.0');
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-- Availability: 1.2.2
--- Deprecation in 2.1.0
+-- Deprecation in 2.1.0
CREATE OR REPLACE FUNCTION ST_line_locate_point(geom1 geometry, geom2 geometry)
RETURNS float8 AS
$$ SELECT _postgis_deprecate('ST_Line_Locate_Point', 'ST_LineLocatePoint', '2.1.0');
LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
-- Availability: 1.5.0
-CREATE OR REPLACE FUNCTION ST_AddMeasure(geometry, float8, float8)
- RETURNS geometry
- AS 'MODULE_PATHNAME', 'ST_AddMeasure'
+CREATE OR REPLACE FUNCTION ST_AddMeasure(geometry, float8, float8)
+ RETURNS geometry
+ AS 'MODULE_PATHNAME', 'ST_AddMeasure'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
---------------------------------------------------------------
-- Availability: 2.2.0
CREATE OR REPLACE FUNCTION ST_ClosestPointOfApproach(geometry, geometry)
- RETURNS float8
- AS 'MODULE_PATHNAME', 'ST_ClosestPointOfApproach'
+ RETURNS float8
+ AS 'MODULE_PATHNAME', 'ST_ClosestPointOfApproach'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-- Availability: 2.2.0
CREATE OR REPLACE FUNCTION ST_DistanceCPA(geometry, geometry)
- RETURNS float8
+ RETURNS float8
AS 'MODULE_PATHNAME', 'ST_DistanceCPA'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-- Availability: 2.2.0
CREATE OR REPLACE FUNCTION ST_IsValidTrajectory(geometry)
- RETURNS bool
- AS 'MODULE_PATHNAME', 'ST_IsValidTrajectory'
+ RETURNS bool
+ AS 'MODULE_PATHNAME', 'ST_IsValidTrajectory'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-
+
---------------------------------------------------------------
-- GEOS
---------------------------------------------------------------
-- - Simple (lineal components)
-- - Valid (polygonal components)
-- - Obeying the RHR (if polygonal)
--- - Simplified of consecutive duplicated points
+-- - Simplified of consecutive duplicated points
-- Ensuring:
-- - No input vertexes are discarded (except consecutive repeated ones)
-- - Output geometry type matches input
--
-- Returns NULL on failure.
---
+--
-- Requires: GEOS-3.3.0
-- Availability: 2.0.0
CREATE OR REPLACE FUNCTION ST_CleanGeometry(geometry)
--
-- Note that multi-part geometries will be returned exploded,
-- no matter relation to blade.
---
+--
-- Availability: 2.0.0
--
CREATE OR REPLACE FUNCTION ST_Split(geom1 geometry, geom2 geometry)
--
-- The paths themselves are given in the direction of the
-- first geometry.
---
+--
-- Availability: 2.0.0
-- Requires GEOS >= 3.3.0
--
--
-- If a tolerance is given it will be used to snap the input points
-- each-other.
---
+--
--
-- Availability: 2.1.0
-- Requires GEOS >= 3.4.0
-- By default, the diagram will be extended to an envelope larger than the
-- input points.
--
--- If a second geometry is supplied, the diagram will be extended to fill the
+-- If a second geometry is supplied, the diagram will be extended to fill the
-- envelope of the second geometry, unless that is smaller than the default
-- envelope.
--
RETURNS boolean
AS 'SELECT $1 && $2 AND _ST_Intersects($1,$2)'
LANGUAGE 'sql' IMMUTABLE _PARALLEL;
-
+
-- PostGIS equivalent function: crosses(geom1 geometry, geom2 geometry)
CREATE OR REPLACE FUNCTION _ST_Crosses(geom1 geometry, geom2 geometry)
RETURNS boolean
AS 'MODULE_PATHNAME', 'centroid'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
COST 100;
-
+
-- Availability: 2.3.0
CREATE OR REPLACE FUNCTION ST_GeometricMedian(g geometry, tolerance float8 DEFAULT NULL, max_iter int DEFAULT 10000, fail_if_not_converged boolean DEFAULT false)
AS 'SELECT $1 ~= $2 AND _ST_Equals($1,$2)'
LANGUAGE 'sql' IMMUTABLE _PARALLEL;
--- Deprecation in 1.2.3
--- TODO: drop in 2.0.0 !
-CREATE OR REPLACE FUNCTION Equals(geom1 geometry, geom2 geometry)
- RETURNS boolean
- AS 'MODULE_PATHNAME','ST_Equals'
+-- Deprecation in 1.2.3
+-- TODO: drop in 2.0.0 !
+CREATE OR REPLACE FUNCTION Equals(geom1 geometry, geom2 geometry)
+ RETURNS boolean
+ AS 'MODULE_PATHNAME','ST_Equals'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-----------------------------------------------------------------------
LANGUAGE 'c' IMMUTABLE _PARALLEL
COST 2500;
--- ST_AsGML(version, geom) / precision=15
+-- ST_AsGML(version, geom) / precision=15
-- Availability: 1.3.2
-- ST_AsGML(version, geom, precision)
-- Availability: 1.3.2
AS 'MODULE_PATHNAME','LWGEOM_asBinary'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
COST 10;
-
+
-- PostGIS equivalent of old function: AsBinary(geometry)
CREATE OR REPLACE FUNCTION ST_AsBinary(geometry)
RETURNS bytea
AS 'MODULE_PATHNAME','LWGEOM_asBinary'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
COST 10;
-
+
-- PostGIS equivalent function: AsText(geometry)
CREATE OR REPLACE FUNCTION ST_AsText(geometry)
RETURNS TEXT
RETURNS geometry
AS 'MODULE_PATHNAME','LWGEOM_from_text'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-
+
-- PostGIS equivalent function: ST_GeometryFromText(text)
-- SQL/MM alias for ST_GeomFromText
CREATE OR REPLACE FUNCTION ST_WKTToSQL(text)
RETURNS geometry
AS 'MODULE_PATHNAME','LWGEOM_from_text'
- LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
+ LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-- Availability: 1.2.2
CREATE OR REPLACE FUNCTION ST_PointFromText(text)
CREATE OR REPLACE FUNCTION _ST_MaxDistance(geom1 geometry, geom2 geometry)
RETURNS float8
AS 'MODULE_PATHNAME', 'LWGEOM_maxdistance2d_linestring'
- LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-
+ LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
+
-- Availability: 1.5.0
CREATE OR REPLACE FUNCTION ST_MaxDistance(geom1 geometry, geom2 geometry)
RETURNS float8
AS 'SELECT _ST_MaxDistance(ST_ConvexHull($1), ST_ConvexHull($2))'
- LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
+ LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
CREATE OR REPLACE FUNCTION ST_ClosestPoint(geom1 geometry, geom2 geometry)
RETURNS geometry
CREATE OR REPLACE FUNCTION ST_LongestLine(geom1 geometry, geom2 geometry)
RETURNS geometry
AS 'SELECT _ST_LongestLine(ST_ConvexHull($1), ST_ConvexHull($2))'
- LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
+ LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
CREATE OR REPLACE FUNCTION _ST_DFullyWithin(geom1 geometry, geom2 geometry,float8)
RETURNS boolean
AS 'MODULE_PATHNAME', 'LWGEOM_dfullywithin'
- LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
+ LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
CREATE OR REPLACE FUNCTION ST_DFullyWithin(geom1 geometry, geom2 geometry, float8)
RETURNS boolean
AS 'SELECT $1 && ST_Expand($2,$3) AND $2 && ST_Expand($1,$3) AND _ST_DFullyWithin(ST_ConvexHull($1), ST_ConvexHull($2), $3)'
- LANGUAGE 'sql' IMMUTABLE;
-
+ LANGUAGE 'sql' IMMUTABLE;
+
-- Availability: 2.2.0
CREATE OR REPLACE FUNCTION ST_SwapOrdinates(geom geometry, ords cstring)
RETURNS geometry
RETURNS geometry
AS 'MODULE_PATHNAME', 'ST_FlipCoordinates'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL
- COST 25;
+ COST 25;
--
-- SFSQL 1.1
-- New helper function so we can keep list of valid geometry types in one place --
-- Maps old names to pramsey beautiful names but can take old name or new name as input
-- By default returns new name but can be overridden to return old name for old constraint like support
-CREATE OR REPLACE FUNCTION postgis_type_name(geomname varchar, coord_dimension integer, use_new_name boolean DEFAULT true)
+CREATE OR REPLACE FUNCTION postgis_type_name(geomname varchar, coord_dimension integer, use_new_name boolean DEFAULT true)
RETURNS varchar
AS
$$
SELECT CASE WHEN $3 THEN new_name ELSE old_name END As geomname
- FROM
+ FROM
( VALUES
('GEOMETRY', 'Geometry', 2) ,
('GEOMETRY', 'GeometryZ', 3) ,
('GEOMETRYCOLLECTION', 'GeometryCollectionZ', 3) ,
('GEOMETRYCOLLECTIONM', 'GeometryCollectionM', 3) ,
('GEOMETRYCOLLECTION', 'GeometryCollectionZM', 4) ,
-
+
('POINT', 'Point',2) ,
('POINTM','PointM',3) ,
('POINT', 'PointZ',3) ,
('POINT', 'PointZM',4) ,
-
+
('MULTIPOINT','MultiPoint',2) ,
('MULTIPOINT','MultiPointZ',3) ,
('MULTIPOINTM','MultiPointM',3) ,
('MULTIPOINT','MultiPointZM',4) ,
-
+
('POLYGON', 'Polygon',2) ,
('POLYGON', 'PolygonZ',3) ,
('POLYGONM', 'PolygonM',3) ,
('POLYGON', 'PolygonZM',4) ,
-
+
('MULTIPOLYGON', 'MultiPolygon',2) ,
('MULTIPOLYGON', 'MultiPolygonZ',3) ,
('MULTIPOLYGONM', 'MultiPolygonM',3) ,
('MULTIPOLYGON', 'MultiPolygonZM',4) ,
-
+
('MULTILINESTRING', 'MultiLineString',2) ,
('MULTILINESTRING', 'MultiLineStringZ',3) ,
('MULTILINESTRINGM', 'MultiLineStringM',3) ,
('MULTILINESTRING', 'MultiLineStringZM',4) ,
-
+
('LINESTRING', 'LineString',2) ,
('LINESTRING', 'LineStringZ',3) ,
('LINESTRINGM', 'LineStringM',3) ,
('LINESTRING', 'LineStringZM',4) ,
-
+
('CIRCULARSTRING', 'CircularString',2) ,
('CIRCULARSTRING', 'CircularStringZ',3) ,
('CIRCULARSTRINGM', 'CircularStringM',3) ,
('CIRCULARSTRING', 'CircularStringZM',4) ,
-
+
('COMPOUNDCURVE', 'CompoundCurve',2) ,
('COMPOUNDCURVE', 'CompoundCurveZ',3) ,
('COMPOUNDCURVEM', 'CompoundCurveM',3) ,
('COMPOUNDCURVE', 'CompoundCurveZM',4) ,
-
+
('CURVEPOLYGON', 'CurvePolygon',2) ,
('CURVEPOLYGON', 'CurvePolygonZ',3) ,
('CURVEPOLYGONM', 'CurvePolygonM',3) ,
('CURVEPOLYGON', 'CurvePolygonZM',4) ,
-
+
('MULTICURVE', 'MultiCurve',2 ) ,
('MULTICURVE', 'MultiCurveZ',3 ) ,
('MULTICURVEM', 'MultiCurveM',3 ) ,
('MULTICURVE', 'MultiCurveZM',4 ) ,
-
+
('MULTISURFACE', 'MultiSurface', 2) ,
('MULTISURFACE', 'MultiSurfaceZ', 3) ,
('MULTISURFACEM', 'MultiSurfaceM', 3) ,
('MULTISURFACE', 'MultiSurfaceZM', 4) ,
-
+
('POLYHEDRALSURFACE', 'PolyhedralSurface',2) ,
('POLYHEDRALSURFACE', 'PolyhedralSurfaceZ',3) ,
('POLYHEDRALSURFACEM', 'PolyhedralSurfaceM',3) ,
('POLYHEDRALSURFACE', 'PolyhedralSurfaceZM',4) ,
-
+
('TRIANGLE', 'Triangle',2) ,
('TRIANGLE', 'TriangleZ',3) ,
('TRIANGLEM', 'TriangleM',3) ,
-- Deprecation in 2.2.0
CREATE OR REPLACE FUNCTION postgis_constraint_type(geomschema text, geomtable text, geomcolumn text) RETURNS varchar AS
$$
-SELECT replace(split_part(s.consrc, '''', 2), ')', '')::varchar
+SELECT replace(split_part(s.consrc, '''', 2), ')', '')::varchar
FROM pg_class c, pg_namespace n, pg_attribute a, pg_constraint s
WHERE n.nspname = $1
AND c.relname = $2
-- Availability: 2.0.0
-- Changed: 2.1.8 significant performance improvement for constraint based columns
-- Changed: 2.2.0 get rid of scheman, table, column cast to improve performance
-CREATE OR REPLACE VIEW geometry_columns AS
+CREATE OR REPLACE VIEW geometry_columns AS
SELECT current_database()::character varying(256) AS f_table_catalog,
n.nspname AS f_table_schema,
c.relname AS f_table_name,
s.conrelid,
s.conkey, replace(split_part(s.consrc, ''''::text, 2), ')'::text, ''::text) As type
FROM pg_constraint AS s
- WHERE s.consrc ~~* '%geometrytype(% = %'::text
-
+ WHERE s.consrc ~~* '%geometrytype(% = %'::text
+
) st ON st.connamespace = n.oid AND st.conrelid = c.oid AND (a.attnum = ANY (st.conkey))
LEFT JOIN ( SELECT s.connamespace,
s.conrelid,
s.conkey, replace(split_part(s.consrc, ' = '::text, 2), ')'::text, ''::text)::integer As ndims
FROM pg_constraint AS s
WHERE s.consrc ~~* '%ndims(% = %'::text
-
+
) sn ON sn.connamespace = n.oid AND sn.conrelid = c.oid AND (a.attnum = ANY (sn.conkey))
LEFT JOIN ( SELECT s.connamespace,
s.conrelid,
s.conkey, replace(replace(split_part(s.consrc, ' = '::text, 2), ')'::text, ''::text), '('::text, ''::text)::integer As srid
FROM pg_constraint AS s
WHERE s.consrc ~~* '%srid(% = %'::text
-
+
) sr ON sr.connamespace = n.oid AND sr.conrelid = c.oid AND (a.attnum = ANY (sr.conkey))
- WHERE (c.relkind = ANY (ARRAY['r'::"char", 'v'::"char", 'm'::"char", 'f'::"char"]))
- AND NOT c.relname = 'raster_columns'::name AND t.typname = 'geometry'::name
+ WHERE (c.relkind = ANY (ARRAY['r'::"char", 'v'::"char", 'm'::"char", 'f'::"char"]))
+ AND NOT c.relname = 'raster_columns'::name AND t.typname = 'geometry'::name
AND NOT pg_is_other_temp_schema(c.relnamespace) AND has_table_privilege(c.oid, 'SELECT'::text);
AS 'MODULE_PATHNAME', 'distance3d'
LANGUAGE 'c' IMMUTABLE STRICT
COST 100;
-
+
CREATE OR REPLACE FUNCTION ST_3DMaxDistance(geom1 geometry, geom2 geometry)
RETURNS float8
AS 'MODULE_PATHNAME', 'LWGEOM_maxdistance3d'
LANGUAGE 'c' IMMUTABLE STRICT
- COST 100;
+ COST 100;
CREATE OR REPLACE FUNCTION ST_3DClosestPoint(geom1 geometry, geom2 geometry)
RETURNS geometry
AS 'MODULE_PATHNAME', 'LWGEOM_longestline3d'
LANGUAGE 'c' IMMUTABLE STRICT
COST 100;
-
+
CREATE OR REPLACE FUNCTION _ST_3DDWithin(geom1 geometry, geom2 geometry,float8)
RETURNS boolean
AS 'MODULE_PATHNAME', 'LWGEOM_dwithin3d'
LANGUAGE 'c' IMMUTABLE STRICT
COST 100;
-
+
CREATE OR REPLACE FUNCTION ST_3DDWithin(geom1 geometry, geom2 geometry,float8)
RETURNS boolean
AS 'SELECT $1 && ST_Expand($2,$3) AND $2 && ST_Expand($1,$3) AND _ST_3DDWithin($1, $2, $3)'
LANGUAGE 'sql' IMMUTABLE
COST 100;
-
+
CREATE OR REPLACE FUNCTION _ST_3DDFullyWithin(geom1 geometry, geom2 geometry,float8)
RETURNS boolean
AS 'MODULE_PATHNAME', 'LWGEOM_dfullywithin3d'
LANGUAGE 'c' IMMUTABLE STRICT
COST 100;
-
+
CREATE OR REPLACE FUNCTION ST_3DDFullyWithin(geom1 geometry, geom2 geometry,float8)
RETURNS boolean
AS 'SELECT $1 && ST_Expand($2,$3) AND $2 && ST_Expand($1,$3) AND _ST_3DDFullyWithin($1, $2, $3)'
AS 'MODULE_PATHNAME','intersects3d'
LANGUAGE 'c' IMMUTABLE STRICT
COST 100;
-
+
CREATE OR REPLACE FUNCTION ST_3DIntersects(geom1 geometry, geom2 geometry)
RETURNS boolean
AS 'SELECT $1 && $2 AND _ST_3DIntersects($1, $2)'
LANGUAGE 'sql' IMMUTABLE
COST 100;
-
-
+
+
---------------------------------------------------------------
-- SQL-MM
---------------------------------------------------------------
RETURNS smallint
AS 'MODULE_PATHNAME', 'LWGEOM_ndims'
LANGUAGE 'c' IMMUTABLE STRICT
- COST 5;
+ COST 5;
--
-- SQL-MM
--
RETURNS geometry
AS 'MODULE_PATHNAME', 'LWGEOM_line_desegmentize'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-
+
-- Availability: 1.5.0
CREATE OR REPLACE FUNCTION _ST_OrderingEquals(GeometryA geometry, GeometryB geometry)
RETURNS boolean
-- Availability: 1.3.0
CREATE OR REPLACE FUNCTION ST_OrderingEquals(GeometryA geometry, GeometryB geometry)
RETURNS boolean
- AS $$
+ AS $$
SELECT $1 ~= $2 AND _ST_OrderingEquals($1, $2)
- $$
- LANGUAGE 'sql' IMMUTABLE;
-
+ $$
+ LANGUAGE 'sql' IMMUTABLE;
+
-------------------------------------------------------------------------------
-- SQL/MM - SQL Functions on type ST_Point
-------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION ST_Point(float8, float8)
RETURNS geometry
AS 'MODULE_PATHNAME', 'LWGEOM_makepoint'
- LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-
+ LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
+
-- PostGIS equivalent function: ST_MakePolygon(Geometry geometry)
CREATE OR REPLACE FUNCTION ST_Polygon(geometry, int)
RETURNS geometry
- AS $$
+ AS $$
SELECT ST_SetSRID(ST_MakePolygon($1), $2)
- $$
- LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
-
+ $$
+ LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
+
-- PostGIS equivalent function: GeomFromWKB(WKB bytea))
-- Note: Defaults to an SRID=-1, not 0 as per SQL/MM specs.
CREATE OR REPLACE FUNCTION ST_WKBToSQL(WKB bytea)
RETURNS geometry
AS 'MODULE_PATHNAME','LWGEOM_from_WKB'
- LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-
+ LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
+
---
-- Linear referencing functions
---
RETURNS geometry
AS 'MODULE_PATHNAME', 'ST_LocateBetween'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-
+
-- Availability: 2.0.0
CREATE OR REPLACE FUNCTION ST_LocateAlong(Geometry geometry, Measure float8, LeftRightOffset float8 default 0.0)
RETURNS geometry
CREATE OR REPLACE FUNCTION _st_concavehull(param_inputgeom geometry)
RETURNS geometry AS
$$
- DECLARE
+ DECLARE
vexhull GEOMETRY;
var_resultgeom geometry;
var_inputgeom geometry;
var_tempgeom geometry;
scale_factor integer := 1;
i integer;
-
+
BEGIN
-- First compute the ConvexHull of the geometry
cavering := ST_Collect(
ARRAY(
- SELECT
+ SELECT
ST_ClosestPoint(var_inputgeom, pt ) As the_geom
FROM (
SELECT ST_PointN(vexring, n ) As pt, n
- FROM
+ FROM
generate_series(1, ST_NPoints(vexring) ) As n
) As pt
-
+
)
)
- ;
-
+ ;
- var_resultgeom := ST_MakeLine(geom)
+
+ var_resultgeom := ST_MakeLine(geom)
FROM ST_Dump(cavering) As foo;
IF ST_IsSimple(var_resultgeom) THEN
--RAISE NOTICE 'is not Simple: %', var_resultgeom;
var_resultgeom := ST_ConvexHull(var_resultgeom);
END IF;
-
+
IF scale_factor > 1 THEN -- scale the result back
var_resultgeom := ST_Scale(var_resultgeom, 1/scale_factor, 1/scale_factor);
END IF;
RETURN var_resultgeom;
-
+
END;
$$
LANGUAGE plpgsql IMMUTABLE STRICT _PARALLEL;
-
+
CREATE OR REPLACE FUNCTION ST_ConcaveHull(param_geom geometry, param_pctconvex float, param_allow_holes boolean DEFAULT false) RETURNS geometry AS
$$
DECLARE
BEGIN
-- We start with convex hull as our base
var_resultgeom := var_convhull;
-
+
IF param_pctconvex = 1 THEN
return var_resultgeom;
ELSIF ST_GeometryType(var_param_geom) = 'ST_Polygon' THEN -- it is as concave as it is going to get
var_enline := ST_Boundary(ST_Envelope(var_param_geom));
var_buf := ST_Length(var_enline)/1000.0;
IF ST_GeometryType(var_param_geom) = 'ST_MultiPoint' AND ST_NumGeometries(var_param_geom) BETWEEN 4 and 200 THEN
- -- we make polygons out of points since they are easier to cave in.
+ -- we make polygons out of points since they are easier to cave in.
-- Note we limit to between 4 and 200 points because this process is slow and gets quadratically slow
var_buf := sqrt(ST_Area(var_convhull)*0.8/(ST_NumGeometries(var_param_geom)*ST_NumGeometries(var_param_geom)));
var_atempgeoms := ARRAY(SELECT geom FROM ST_DumpPoints(var_param_geom));
-- fuse near neighbors together
SELECT DISTINCT ON (i) i, ST_Distance(var_atempgeoms[i],var_atempgeoms[j]), ST_Buffer(ST_MakeLine(var_atempgeoms[i], var_atempgeoms[j]) , var_buf*5, 'quad_segs=3') As geom
FROM generate_series(1,array_upper(var_atempgeoms, 1)) As i
- INNER JOIN generate_series(1,array_upper(var_atempgeoms, 1)) As j
+ INNER JOIN generate_series(1,array_upper(var_atempgeoms, 1)) As j
ON (
NOT ST_Intersects(var_atempgeoms[i],var_atempgeoms[j])
AND ST_DWithin(var_atempgeoms[i],var_atempgeoms[j], var_buf*10)
-- catch the ones with no near neighbors
SELECT i, 0, ST_Buffer(var_atempgeoms[i] , var_buf*10, 'quad_segs=3') As geom
FROM generate_series(1,array_upper(var_atempgeoms, 1)) As i
- LEFT JOIN generate_series(ceiling(array_upper(var_atempgeoms,1)/2)::integer,array_upper(var_atempgeoms, 1)) As j
+ LEFT JOIN generate_series(ceiling(array_upper(var_atempgeoms,1)/2)::integer,array_upper(var_atempgeoms, 1)) As j
ON (
NOT ST_Intersects(var_atempgeoms[i],var_atempgeoms[j])
- AND ST_DWithin(var_atempgeoms[i],var_atempgeoms[j], var_buf*10)
+ AND ST_DWithin(var_atempgeoms[i],var_atempgeoms[j], var_buf*10)
)
WHERE j IS NULL
ORDER BY 1, 2
END IF;
return var_param_geom;
ELSIF ST_IsValid(var_tempgeom) THEN
- var_param_geom := ST_ForceSFS(ST_Intersection(var_tempgeom, var_convhull));
+ var_param_geom := ST_ForceSFS(ST_Intersection(var_tempgeom, var_convhull));
END IF;
END IF;
FOR i in 1 .. 4 LOOP
var_geoms[i] := ST_MakePolygon(ST_MakeLine(ARRAY[ST_PointN(var_enline,i), ST_PointN(var_enline,i+1), var_cent, ST_PointN(var_enline,i)]));
var_geoms[i] := ST_ForceSFS(ST_Intersection(var_param_geom, ST_Buffer(var_geoms[i],var_buf)));
- IF ST_IsValid(var_geoms[i]) THEN
-
+ IF ST_IsValid(var_geoms[i]) THEN
+
ELSE
var_geoms[i] := ST_BuildArea(ST_MakeLine(ARRAY[ST_PointN(var_enline,i), ST_PointN(var_enline,i+1), var_cent, ST_PointN(var_enline,i)]));
- END IF;
+ END IF;
END LOOP;
- var_tempgeom := ST_Union(ARRAY[ST_ConvexHull(var_geoms[1]), ST_ConvexHull(var_geoms[2]) , ST_ConvexHull(var_geoms[3]), ST_ConvexHull(var_geoms[4])]);
+ var_tempgeom := ST_Union(ARRAY[ST_ConvexHull(var_geoms[1]), ST_ConvexHull(var_geoms[2]) , ST_ConvexHull(var_geoms[3]), ST_ConvexHull(var_geoms[4])]);
--RAISE NOTICE 'Curr vex % ', ST_AsText(var_tempgeom);
IF ST_Area(var_tempgeom) <= var_newarea AND ST_IsValid(var_tempgeom) THEN --AND ST_GeometryType(var_tempgeom) ILIKE '%Polygon'
-
+
var_tempgeom := ST_Buffer(ST_ConcaveHull(var_geoms[1],least(param_pctconvex + param_pctconvex/var_div),true),var_buf, 'quad_segs=2');
FOR i IN 1 .. 4 LOOP
var_geoms[i] := ST_Buffer(ST_ConcaveHull(var_geoms[i],least(param_pctconvex + param_pctconvex/var_div),true), var_buf, 'quad_segs=2');
ELSE
RAISE NOTICE 'Not valid % %', i, ST_AsText(var_tempgeom);
var_tempgeom := ST_Union(var_tempgeom, ST_ConvexHull(var_geoms[i]));
- END IF;
+ END IF;
END LOOP;
--RAISE NOTICE 'Curr concave % ', ST_AsText(var_tempgeom);
var_resultgeom := ST_Buffer(var_tempgeom,var_buf, 'quad_segs=2');
END IF;
END IF;
- IF param_allow_holes = false THEN
+ IF param_allow_holes = false THEN
-- only keep exterior ring since we do not want holes
var_resultgeom := ST_MakePolygon(ST_ExteriorRing(var_resultgeom));
END IF;
RETURNS TEXT
AS 'MODULE_PATHNAME','LWGEOM_asX3D'
LANGUAGE 'c' IMMUTABLE;
-
+
-- ST_AsX3D(geom, precision, options)
CREATE OR REPLACE FUNCTION ST_AsX3D(geom geometry, maxdecimaldigits integer DEFAULT 15, options integer DEFAULT 0)
RETURNS TEXT