# This is a list of objects still missing lwgeom support
-FUNC: KEEPING FUNCTION: [box3d_in(cstring)]
-FUNC: KEEPING FUNCTION: [box3d_out(box3d)]
-FUNC: KEEPING FUNCTION: [chip_in(cstring)]
-FUNC: KEEPING FUNCTION: [chip_out(chip)]
-FUNC: KEEPING FUNCTION: [srid(chip)]
-FUNC: KEEPING FUNCTION: [height(chip)]
-FUNC: KEEPING FUNCTION: [factor(chip)]
-FUNC: KEEPING FUNCTION: [width(chip)]
-FUNC: KEEPING FUNCTION: [datatype(chip)]
-FUNC: KEEPING FUNCTION: [compression(chip)]
-FUNC: KEEPING FUNCTION: [setsrid(chip, integer)]
-FUNC: KEEPING FUNCTION: [setfactor(chip, real)]
-FUNC: KEEPING FUNCTION: [geometry(chip)]
-FUNC: KEEPING FUNCTION: [box3d(geometry)]
-FUNC: KEEPING FUNCTION: [box(geometry)]
-FUNC: KEEPING FUNCTION: [geometry(box3d)]
-FUNC: KEEPING FUNCTION: [expand(box3d, double precision)]
+AGGREGATE: KEEPING AGGREGATE [collect(geometry)]
+AGGREGATE: KEEPING AGGREGATE [geomunion(geometry)]
+AGGREGATE: KEEPING AGGREGATE [memcollect(geometry)]
+AGGREGATE: KEEPING AGGREGATE [memgeomunion(geometry)]
+FNCAST: KEEPING FNCAST geometry(text) (see CAST)
+FUNC: KEEPING FUNCTION: [line_interpolate_point(geometry, double precision)]
+FUNC: KEEPING FUNCTION: [simplify(geometry, double precision)]
FUNC: KEEPING FUNCTION: [asbinary(geometry)]
FUNC: KEEPING FUNCTION: [asbinary(geometry, text)]
-FUNC: KEEPING FUNCTION: [nrings(geometry)]
-FUNC: KEEPING FUNCTION: [translate(geometry, double precision, double precision, double precision)]
+FUNC: KEEPING FUNCTION: [boundary(geometry)]
+FUNC: KEEPING FUNCTION: [box(geometry)]
+FUNC: KEEPING FUNCTION: [collect_garray(geometry[])]
+FUNC: KEEPING FUNCTION: [collector(geometry, geometry)]
FUNC: KEEPING FUNCTION: [envelope(geometry)]
-
-
-FUNC: KEEPING FUNCTION: [optimistic_overlap(geometry, geometry, double precision)]
-FUNC: KEEPING FUNCTION: [segmentize(geometry, double precision)]
-FUNC: KEEPING FUNCTION: [polyfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [polygonfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [polygonfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [mpolyfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [linefromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [mlinefromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [multilinestringfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [multilinestringfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [pointfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [mpointfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [multipointfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [multipointfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [geomcollfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [polyfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [mpolyfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [multipolygonfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [multipolygonfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [linefromtext(geometry)]
-FUNC: KEEPING FUNCTION: [linestringfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [linestringfromtext(geometry, integer)]
-FUNC: KEEPING FUNCTION: [mlinefromtext(geometry)]
-FUNC: KEEPING FUNCTION: [pointfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [mpointfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [geomcollfromtext(geometry)]
-FUNC: KEEPING FUNCTION: [isempty(geometry)]
-FUNC: KEEPING FUNCTION: [issimple(geometry)]
FUNC: KEEPING FUNCTION: [equals(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [xmin(box3d)]
-FUNC: KEEPING FUNCTION: [ymin(box3d)]
-FUNC: KEEPING FUNCTION: [zmin(box3d)]
-FUNC: KEEPING FUNCTION: [xmax(box3d)]
-FUNC: KEEPING FUNCTION: [ymax(box3d)]
-FUNC: KEEPING FUNCTION: [zmax(box3d)]
-FUNC: KEEPING FUNCTION: [box3dtobox(box3d)]
-FUNC: KEEPING FUNCTION: [combine_bbox(box3d, geometry)]
-TYPE: KEEPING TYPE [box3d]
-TYPE: KEEPING TYPE [chip]
-FNCAST: KEEPING FNCAST geometry(chip) (see CAST)
-FNCAST: KEEPING FNCAST geometry(box3d) (see CAST)
-FNCAST: KEEPING FNCAST geometry(text) (see CAST)
-FNCAST: KEEPING FNCAST box3dtobox(box3d) (see CAST)
+FUNC: KEEPING FUNCTION: [expand(geometry, double precision)]
+FUNC: KEEPING FUNCTION: [geom_accum(geometry[], geometry)]
+FUNC: KEEPING FUNCTION: [geometry_size(geometry, internal)]
+FUNC: KEEPING FUNCTION: [isempty(geometry)]
+FUNC: KEEPING FUNCTION: [optimistic_overlap(geometry, geometry, double precision)]
FUNC: KEEPING FUNCTION: [point_inside_circle(geometry, double precision, double precision, double precision)]
-FUNC: KEEPING FUNCTION: [centroid(geometry)]
+FUNC: KEEPING FUNCTION: [segmentize(geometry, double precision)]
+FUNC: KEEPING FUNCTION: [translate(geometry, double precision, double precision, double precision)]
+FUNC: KEEPING FUNCTION: [unite_garray(geometry[])]
+
+--- GEOS
+FUNC: KEEPING FUNCTION: [centroid(geometry)] (Also !GEOS implementation)
FUNC: KEEPING FUNCTION: [isring(geometry)]
FUNC: KEEPING FUNCTION: [pointonsurface(geometry)]
-FUNC: KEEPING FUNCTION: [collector(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [intersection(geometry, geometry)]
FUNC: KEEPING FUNCTION: [buffer(geometry, double precision)]
+FUNC: KEEPING FUNCTION: [contains(geometry, geometry)]
FUNC: KEEPING FUNCTION: [convexhull(geometry)]
+FUNC: KEEPING FUNCTION: [crosses(geometry, geometry)]
FUNC: KEEPING FUNCTION: [difference(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [boundary(geometry)]
+FUNC: KEEPING FUNCTION: [disjoint(geometry, geometry)]
+FUNC: KEEPING FUNCTION: [within(geometry, geometry)]
FUNC: KEEPING FUNCTION: [symdifference(geometry, geometry)]
FUNC: KEEPING FUNCTION: [symmetricdifference(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [geomunion(geometry, geometry)]
+FUNC: KEEPING FUNCTION: [touches(geometry, geometry)]
FUNC: KEEPING FUNCTION: [relate(geometry, geometry)]
FUNC: KEEPING FUNCTION: [relate(geometry, geometry, text)]
-FUNC: KEEPING FUNCTION: [disjoint(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [touches(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [intersects(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [crosses(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [within(geometry, geometry)]
-FUNC: KEEPING FUNCTION: [contains(geometry, geometry)]
FUNC: KEEPING FUNCTION: [overlaps(geometry, geometry)]
+FUNC: KEEPING FUNCTION: [issimple(geometry)]
FUNC: KEEPING FUNCTION: [isvalid(geometry)]
-FUNC: KEEPING FUNCTION: [simplify(geometry, double precision)]
-FUNC: KEEPING FUNCTION: [geom_accum(geometry[], geometry)]
-FUNC: KEEPING FUNCTION: [makeswflayer(character varying)]
-FUNC: KEEPING FUNCTION: [apply_grid(geometry, double precision, double precision, double precision, double precision)]
-FUNC: KEEPING FUNCTION: [nptsinbox(geometry, box3d)]
-FUNC: KEEPING FUNCTION: [collect_garray(geometry[])]
-FUNC: KEEPING FUNCTION: [unite_garray(geometry[])]
-FUNC: KEEPING FUNCTION: [line_interpolate_point(geometry, double precision)]
-FUNC: KEEPING FUNCTION: [normalizelocation(character varying)]
-FUNC: KEEPING FUNCTION: [localdef(text, character varying)]
-FUNC: KEEPING FUNCTION: [updateindicatorcache()]
-FUNC: KEEPING FUNCTION: [updateindicatorcache(numeric)]
-FUNC: KEEPING FUNCTION: [apply_grid(geometry, double precision, double precision, double precision, double precision)]
-FUNC: KEEPING FUNCTION: [nptsinbox(geometry, box3d)]
-FUNC: KEEPING FUNCTION: [makeswflayer(character varying)]
-FUNC: KEEPING FUNCTION: [unite_garray(geometry[])]
-FUNC: KEEPING FUNCTION: [geom_accum(geometry[], geometry)]
-FUNC: KEEPING FUNCTION: [expand(geometry, double precision)]
-FUNC: KEEPING FUNCTION: [multi(geometry)]
-FUNC: KEEPING FUNCTION: [collect_garray(geometry[])]
+FUNC: KEEPING FUNCTION: [geomunion(geometry, geometry)]
FUNC: KEEPING FUNCTION: [geosnoop(geometry)]
-FUNC: KEEPING FUNCTION: [line_interpolate_point(geometry, double precision)]
-FUNC: KEEPING FUNCTION: [geometry_size(geometry, internal)]
-AGGREGATE: KEEPING AGGREGATE [collect(geometry)]
-AGGREGATE: KEEPING AGGREGATE [collect(geometry)]
-AGGREGATE: KEEPING AGGREGATE [geomunion(geometry)]
-AGGREGATE: KEEPING AGGREGATE [geomunion(geometry)]
-AGGREGATE: KEEPING AGGREGATE [memgeomunion(geometry)]
-AGGREGATE: KEEPING AGGREGATE [memgeomunion(geometry)]
-AGGREGATE: KEEPING AGGREGATE [memcollect(geometry)]
+FUNC: KEEPING FUNCTION: [intersection(geometry, geometry)]
+FUNC: KEEPING FUNCTION: [intersects(geometry, geometry)]
+
+--- CHIP
+FUNC: KEEPING FUNCTION: [chip_in(cstring)]
+FUNC: KEEPING FUNCTION: [chip_out(chip)]
+TYPE: KEEPING TYPE [chip]
+FUNC: KEEPING FUNCTION: [width(chip)]
+FUNC: KEEPING FUNCTION: [height(chip)]
+FUNC: KEEPING FUNCTION: [srid(chip)]
+FUNC: KEEPING FUNCTION: [setsrid(chip, integer)]
+FUNC: KEEPING FUNCTION: [factor(chip)]
+FUNC: KEEPING FUNCTION: [setfactor(chip, real)]
+FUNC: KEEPING FUNCTION: [geometry(chip)]
+FUNC: KEEPING FUNCTION: [datatype(chip)]
+FUNC: KEEPING FUNCTION: [compression(chip)]
+FNCAST: KEEPING FNCAST geometry(chip) (see CAST)
+--- BOX3D
+FUNC: KEEPING FUNCTION: [box3d_in(cstring)]
+FUNC: KEEPING FUNCTION: [box3d_out(box3d)]
+TYPE: KEEPING TYPE [box3d]
+FUNC: KEEPING FUNCTION: [xmax(box3d)]
+FUNC: KEEPING FUNCTION: [xmin(box3d)]
+FUNC: KEEPING FUNCTION: [ymax(box3d)]
+FUNC: KEEPING FUNCTION: [ymin(box3d)]
+FUNC: KEEPING FUNCTION: [zmax(box3d)]
+FUNC: KEEPING FUNCTION: [zmin(box3d)]
+FNCAST: KEEPING FNCAST box3dtobox(box3d) (see CAST)
+FNCAST: KEEPING FNCAST geometry(box3d) (see CAST)
+FUNC: KEEPING FUNCTION: [box3d(geometry)]
+FUNC: KEEPING FUNCTION: [box3dtobox(box3d)]
+FUNC: KEEPING FUNCTION: [combine_bbox(box3d, geometry)]
+FUNC: KEEPING FUNCTION: [expand(box3d, double precision)]
+FUNC: KEEPING FUNCTION: [geometry(box3d)]
Datum LWGEOM_mem_size(PG_FUNCTION_ARGS);
Datum LWGEOM_summary(PG_FUNCTION_ARGS);
Datum LWGEOM_npoints(PG_FUNCTION_ARGS);
+Datum LWGEOM_nrings(PG_FUNCTION_ARGS);
Datum LWGEOM_area_polygon(PG_FUNCTION_ARGS);
Datum postgis_uses_stats(PG_FUNCTION_ARGS);
Datum postgis_scripts_released(PG_FUNCTION_ARGS);
Datum LWGEOM_force_2d(PG_FUNCTION_ARGS);
Datum LWGEOM_force_3d(PG_FUNCTION_ARGS);
Datum LWGEOM_force_collection(PG_FUNCTION_ARGS);
+Datum LWGEOM_force_multi(PG_FUNCTION_ARGS);
Datum LWGEOM_mindistance2d(PG_FUNCTION_ARGS);
Datum LWGEOM_maxdistance2d_linestring(PG_FUNCTION_ARGS);
// internal
char * lwgeom_summary_recursive(char *serialized, int offset);
int32 lwgeom_npoints_recursive(char *serialized);
+int32 lwgeom_nrings_recursive(char *serialized);
// general utilities (might be moved in lwgeom_api.c)
double lwgeom_polygon_area(LWPOLY *poly);
return npoints;
}
+/*
+ * Recursively count rings in a SERIALIZED lwgeom
+ */
+int32
+lwgeom_nrings_recursive(char *serialized)
+{
+ LWGEOM_INSPECTED *inspected;
+ int i;
+ int nrings=0;
+
+ inspected = lwgeom_inspect(serialized);
+
+ //now have to do a scan of each object
+ for (i=0; i<inspected->ngeometries; i++)
+ {
+ LWPOLY *poly=NULL;
+ char *subgeom=NULL;
+
+ subgeom = lwgeom_getsubgeometry_inspected(inspected, i);
+
+ if ( lwgeom_getType(subgeom[0]) == POLYGONTYPE )
+ {
+ poly = lwpoly_deserialize(subgeom);
+ nrings += poly->nrings;
+ continue;
+ }
+
+ if ( lwgeom_getType(subgeom[0]) == COLLECTIONTYPE )
+ {
+ nrings += lwgeom_nrings_recursive(subgeom);
+ continue;
+ }
+ }
+
+ pfree_inspected(inspected);
+
+ return nrings;
+}
+
//number of points in an object
PG_FUNCTION_INFO_V1(LWGEOM_npoints);
Datum LWGEOM_npoints(PG_FUNCTION_ARGS)
PG_RETURN_INT32(npoints);
}
+//number of rings in an object
+PG_FUNCTION_INFO_V1(LWGEOM_nrings);
+Datum LWGEOM_nrings(PG_FUNCTION_ARGS)
+{
+ LWGEOM *geom = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ int32 nrings = 0;
+
+ nrings = lwgeom_nrings_recursive(SERIALIZED_FORM(geom));
+
+ PG_RETURN_INT32(nrings);
+}
+
// Calculate the area of all the subobj in a polygon
// area(point) = 0
// area (line) = 0
PG_RETURN_POINTER(result);
}
+// transform input geometry to a multi* type
+PG_FUNCTION_INFO_V1(LWGEOM_force_multi);
+Datum LWGEOM_force_multi(PG_FUNCTION_ARGS)
+{
+ LWGEOM *geom = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ LWGEOM *result;
+ int oldtype, newtype;
+ int32 size = 0;
+ char *iptr, *optr;
+ int32 nsubgeoms = 1;
+
+ oldtype = lwgeom_getType(geom->type);
+
+ // already a multi
+ if ( oldtype >= 4 ) PG_RETURN_POINTER(geom);
+
+ // not a multi*, must add header and
+ // transfer eventual BBOX and SRID to first object
+
+ newtype = oldtype+3; // see defines
+
+ size = geom->size+5; // 4 for numgeoms, 1 for type
+
+ result = (LWGEOM *)palloc(size); // 4 for numgeoms, 1 for type
+ result->size = size;
+
+ result->type = TYPE_SETTYPE(geom->type, newtype);
+ iptr = geom->data;
+ optr = result->data;
+
+ // reset size to bare serialized input
+ size = geom->size - 4;
+
+ // transfer bbox
+ if ( lwgeom_hasBBOX(geom->type) )
+ {
+ memcpy(optr, iptr, sizeof(BOX2DFLOAT4));
+ optr += sizeof(BOX2DFLOAT4);
+ iptr += sizeof(BOX2DFLOAT4);
+ size -= sizeof(BOX2DFLOAT4);
+ }
+
+ // transfer SRID
+ if ( lwgeom_hasSRID(geom->type) )
+ {
+ memcpy(optr, iptr, 4);
+ optr += 4;
+ iptr += 4;
+ size -= 4;
+ }
+
+ // write number of geometries (1)
+ memcpy(optr, &nsubgeoms, 4);
+ optr+=4;
+
+ // write type of first geometry w/out BBOX and SRID
+ optr[0] = TYPE_SETHASSRID(geom->type, 0);
+ optr[0] = TYPE_SETHASBBOX(optr[0], 0);
+ optr++;
+
+ // write remaining stuff
+ memcpy(optr, iptr, size);
+
+ PG_RETURN_POINTER(result);
+}
+
// Minimum 2d distance between objects in geom1 and geom2.
PG_FUNCTION_INFO_V1(LWGEOM_mindistance2d);
Datum LWGEOM_mindistance2d(PG_FUNCTION_ARGS)
storage = main
);
-CREATEFUNCTION geometryfromtext(geometry)
- RETURNS geometry
- AS '@MODULE_FILENAME@','LWGEOM_from_text'
- LANGUAGE 'C' WITH (isstrict,iscachable);
-
-CREATEFUNCTION geometryfromtext(geometry, int4)
- RETURNS geometry
- AS '@MODULE_FILENAME@','LWGEOM_from_text'
- LANGUAGE 'C' WITH (isstrict,iscachable);
-
-CREATEFUNCTION geomfromtext(geometry)
-RETURNS geometry AS '
-SELECT geometryfromtext($1)
-' LANGUAGE 'SQL' WITH (isstrict,iscachable);
-
-CREATEFUNCTION geomfromtext(geometry, int4)
-RETURNS geometry AS '
-SELECT geometryfromtext($1, $2)
-' LANGUAGE 'SQL' WITH (isstrict,iscachable);
-
-----------------------------------------------------------------------
--
AS '@MODULE_FILENAME@', 'LWGEOM_npoints'
LANGUAGE 'C' WITH (isstrict);
+CREATEFUNCTION nrings(geometry)
+ RETURNS int4
+ AS '@MODULE_FILENAME@', 'LWGEOM_nrings'
+ LANGUAGE 'C' WITH (isstrict);
+
------------------------------------------------------------------------
-- OGC defined
------------------------------------------------------------------------
AS '@MODULE_FILENAME@','LWGEOM_from_text'
LANGUAGE 'C' WITH (isstrict,iscachable);
+CREATEFUNCTION GeometryFromText(geometry)
+ RETURNS geometry
+ AS '@MODULE_FILENAME@','LWGEOM_from_text'
+ LANGUAGE 'C' WITH (isstrict,iscachable);
+
+CREATEFUNCTION GeometryFromText(geometry, int4)
+ RETURNS geometry
+ AS '@MODULE_FILENAME@','LWGEOM_from_text'
+ LANGUAGE 'C' WITH (isstrict,iscachable);
+
+CREATEFUNCTION GeomFromText(geometry)
+RETURNS geometry AS '
+SELECT geometryfromtext($1)
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION GeomFromText(geometry, int4)
+RETURNS geometry AS '
+SELECT geometryfromtext($1, $2)
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION PointFromText(geometry)
+RETURNS geometry
+AS ' SELECT CASE WHEN geometrytype($1) = ''POINT'' THEN $1
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION PointFromText(geometry, int4)
+RETURNS geometry
+AS ' SELECT CASE WHEN geometrytype($1) = ''POINT'' THEN setSRID($1,$2)
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION LineFromText(geometry)
+RETURNS geometry
+AS ' SELECT CASE WHEN geometrytype($1) = ''LINESTRING'' THEN $1
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION LineFromText(geometry, int4)
+RETURNS geometry
+AS ' SELECT CASE WHEN geometrytype($1) = ''LINESTRING'' THEN setSRID($1,$2)
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION LineStringFromText(geometry)
+RETURNS geometry
+AS 'SELECT LineFromText($1)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION LineStringFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT LineFromText($1, $2)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION PolyFromText(geometry)
+RETURNS geometry
+AS ' SELECT CASE WHEN geometrytype($1) = ''POLYGON'' THEN $1
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION PolyFromText(geometry, int4)
+RETURNS geometry
+AS ' SELECT CASE WHEN geometrytype($1) = ''POLYGON'' THEN setSRID($1,$2)
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION PolygonFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT PolyFromText($1, $2)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION PolygonFromText(geometry)
+RETURNS geometry
+AS 'SELECT PolyFromText($1)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MLineFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''MULTILINESTRING'' THEN setSRID($1,$2)
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MLineFromText(geometry)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''MULTILINESTRING'' THEN $1
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MultiLineStringFromText(geometry)
+RETURNS geometry
+AS 'SELECT MLineFromText($1)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MultiLineStringFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT MLineFromText($1, $2)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MPointFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''MULTIPOINT'' THEN setSRID($1,$2)
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MPointFromText(geometry)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''MULTIPOINT'' THEN $1
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MultiPointFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT MPointFromText($1, $2)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MultiPointFromText(geometry)
+RETURNS geometry
+AS 'SELECT MPointFromText($1)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MPolyFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''MULTIPOLYGON'' THEN setSRID($1,$2)
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MPolyFromText(geometry)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''MULTIPOLYGON'' THEN $1
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MultiPolygonFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT MPolyFromText($1, $2)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION MultiPolygonFromText(geometry)
+RETURNS geometry
+AS 'SELECT MPolyFromText($1)'
+LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION GeomCollFromText(geometry, int4)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''GEOMETRYCOLLECTION'' THEN
+setSRID($1,$2)
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
+CREATEFUNCTION GeomCollFromText(geometry)
+RETURNS geometry
+AS 'SELECT CASE WHEN geometrytype($1) = ''GEOMETRYCOLLECTION'' THEN $1
+ELSE NULL END
+' LANGUAGE 'SQL' WITH (isstrict,iscachable);
+
------------------------------------------------------------------------
-- Misures
------------------------------------------------------------------------
AS '@MODULE_FILENAME@', 'LWGEOM_force_collection'
LANGUAGE 'C' WITH (isstrict);
+CREATEFUNCTION multi(geometry)
+ RETURNS geometry
+ AS '@MODULE_FILENAME@', 'LWGEOM_force_multi'
+ LANGUAGE 'C' WITH (isstrict);
+
------------------------------------------------------------------------
--