PG_RETURN_BOOL(TRUE);
PG_RETURN_BOOL(FALSE);
}
+
+
+#if ! USE_GEOS
+PG_FUNCTION_INFO_V1(centroid);
+Datum centroid(PG_FUNCTION_ARGS)
+{
+ LWGEOM *geom = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ int type = lwgeom_getType(geom->type);
+ int ndims = lwgeom_ndims(geom->type);
+ int SRID = lwgeom_getSRID(geom);
+ LWGEOM_EXPLODED *exp = lwgeom_explode(SERIALIZED_FORM(geom));
+ LWPOLY *poly;
+ LWPOINT *point;
+ LWGEOM *result;
+ POINTARRAY *ring;
+ POINT3D *p, cent;
+ int i,j,k;
+ uint32 num_points_tot = 0;
+ char *srl;
+ char wantbbox = 0;
+
+ if (type != POLYGONTYPE && type != MULTIPOLYGONTYPE)
+ PG_RETURN_NULL();
+
+ //find the centroid
+ for (i=0; i<exp->npolys; i++)
+ {
+ poly = lwpoly_deserialize(exp->polys[i]);
+ for (j=0; j<poly->nrings; j++)
+ {
+ ring = poly->rings[j];
+ for (k=0; k<ring->npoints-1; k++)
+ {
+ p = (POINT3D *)getPoint(ring, k);
+ tot_x += p.x;
+ tot_y += p.y;
+ if ( ring->ndims > 2 ) tot_z += p.z;
+ }
+ num_points_tot += ring->npoints-1;
+ }
+ pfree_polygon(poly);
+ }
+ pfree_exploded(exp);
+
+ // Setup point
+ cent.x = tot_x/num_points_tot;
+ cent.y = tot_y/num_points_tot;
+ cent.z = tot_z/num_points_tot;
+
+ // Construct POINTARRAY (paranoia?)
+ pa = pointArray_construct(¢, poly->ndims, 1);
+
+ // Construct LWPOINT
+ point = lwpoint_construct(ndims, SRID, pa);
+
+ // Serialize LWPOINT
+ srl = lwpoint_serialize(point);
+
+ pfree_point(point);
+ pfree_POINTARRAY(pa);
+
+ // Construct output LWGEOM
+ result = LWGEOM_construct(srl, poly->SRID, wantbbox);
+
+ PG_RETURN_POINTER(result);
+}
+#endif // ! USE_GEOS
PG_RETURN_NULL(); // never get here
}
-PG_FUNCTION_INFO_V1(centroid);
-Datum centroid(PG_FUNCTION_ARGS)
-{
- elog(ERROR, "postgis version of centroid calculation not ported yet");
- PG_RETURN_NULL(); // never get here
-}
-
#endif // ! USE_GEOS
geom = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
// if there's no Z return 0
- if ( lwgeom_ndims(geom->type) < 2 ) PG_RETURN_FLOAT8(0.0);
+ if ( lwgeom_ndims(geom->type) < 3 ) PG_RETURN_FLOAT8(0.0);
inspected = lwgeom_inspect(SERIALIZED_FORM(geom));
-- 7.3+ explicit casting definitions
#if USE_VERSION >= 73
CREATE CAST (geometry AS box2d) WITH FUNCTION box2d(geometry) AS IMPLICIT;
-CREATE CAST (geometry AS box3d) WITH FUNCTION box3d(geometry) AS IMPLICI ;
+CREATE CAST (geometry AS box3d) WITH FUNCTION box3d(geometry) AS IMPLICIT;
CREATE CAST (geometry AS box) WITH FUNCTION box(geometry) AS IMPLICIT;
CREATE CAST (box3d AS box2d) WITH FUNCTION box2d(box3d) AS IMPLICIT;
CREATE CAST (box2d AS box3d) WITH FUNCTION box3d(box2d) AS IMPLICIT;
AS '@MODULE_FILENAME@'
LANGUAGE 'C' WITH (isstrict);
-CREATEFUNCTION isvalid(geometry)
+CREATEFUNCTION IsValid(geometry)
RETURNS boolean
- AS '@MODULE_FILENAME@'
+ AS '@MODULE_FILENAME@', 'isvalid'
LANGUAGE 'C' WITH (isstrict);
-CREATEFUNCTION geosnoop(geometry)
+CREATEFUNCTION GEOSnoop(geometry)
RETURNS geometry
AS '@MODULE_FILENAME@', 'GEOSnoop'
LANGUAGE 'C' WITH (isstrict);
+-- This is also available w/out GEOS
+CREATEFUNCTION Centroid(geometry)
+ RETURNS geometry
+ AS '@MODULE_FILENAME@'
+ LANGUAGE 'C' WITH (isstrict);
+
+CREATEFUNCTION IsRing(geometry)
+ RETURNS boolean
+ AS '@MODULE_FILENAME@'
+ LANGUAGE 'C' WITH (isstrict);
+
+CREATEFUNCTION PointOnSurface(geometry)
+ RETURNS geometry
+ AS '@MODULE_FILENAME@'
+ LANGUAGE 'C' WITH (isstrict);
+
+CREATEFUNCTION IsSimple(geometry)
+ RETURNS boolean
+ AS '@MODULE_FILENAME@', 'issimple'
+ LANGUAGE 'C' WITH (isstrict,iscachable);
+
+CREATEFUNCTION Equals(geometry,geometry)
+ RETURNS boolean
+ AS '@MODULE_FILENAME@','geomequals'
+ LANGUAGE 'C' WITH (isstrict,iscachable);
+
---------------------------------------------------------------
-- END
---------------------------------------------------------------