FUNC: KEEPING FUNCTION: [box(geometry)]
FUNC: KEEPING FUNCTION: [geometry(box3d)]
FUNC: KEEPING FUNCTION: [expand(box3d, double precision)]
-
FUNC: KEEPING FUNCTION: [asbinary(geometry)]
FUNC: KEEPING FUNCTION: [asbinary(geometry, text)]
FUNC: KEEPING FUNCTION: [nrings(geometry)]
FUNC: KEEPING FUNCTION: [length_spheroid(geometry, spheroid)]
FUNC: KEEPING FUNCTION: [length3d_spheroid(geometry, spheroid)]
FUNC: KEEPING FUNCTION: [distance_spheroid(geometry, geometry, spheroid)]
+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)]
+
FUNC: KEEPING FUNCTION: [length3d(geometry)]
FUNC: KEEPING FUNCTION: [length(geometry)]
FUNC: KEEPING FUNCTION: [area2d(geometry)]
FUNC: KEEPING FUNCTION: [area(geometry)]
FUNC: KEEPING FUNCTION: [perimeter3d(geometry)]
FUNC: KEEPING FUNCTION: [perimeter(geometry)]
+
FUNC: KEEPING FUNCTION: [point_inside_circle(geometry, double precision, double precision, double precision)]
-FUNC: KEEPING FUNCTION: [startpoint(geometry)]
-FUNC: KEEPING FUNCTION: [endpoint(geometry)]
+
FUNC: KEEPING FUNCTION: [isclosed(geometry)]
FUNC: KEEPING FUNCTION: [centroid(geometry)]
FUNC: KEEPING FUNCTION: [isring(geometry)]
FUNC: KEEPING FUNCTION: [pointonsurface(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)]
FUNC: KEEPING FUNCTION: [collector(geometry, geometry)]
FUNC: KEEPING FUNCTION: [force_2d(geometry)]
FUNC: KEEPING FUNCTION: [force_3d(geometry)]
Datum LWGEOM_y_point(PG_FUNCTION_ARGS);
// ---- Z(geometry)
Datum LWGEOM_z_point(PG_FUNCTION_ARGS);
+// ---- StartPoint(geometry)
+Datum LWGEOM_startpoint_linestring(PG_FUNCTION_ARGS);
+// ---- EndPoint(geometry)
+Datum LWGEOM_endpoint_linestring(PG_FUNCTION_ARGS);
// internal
PG_RETURN_FLOAT8(p->z);
}
+
+// StartPoint(GEOMETRY) -- find the first linestring in GEOMETRY,
+// return the first point.
+// Return NULL if there is no LINESTRING(..) in GEOMETRY
+PG_FUNCTION_INFO_V1(LWGEOM_startpoint_linestring);
+Datum LWGEOM_startpoint_linestring(PG_FUNCTION_ARGS)
+{
+ LWGEOM *geom;
+ LWGEOM_INSPECTED *inspected;
+ LWLINE *line = NULL;
+ POINTARRAY *pts;
+ LWPOINT *point;
+ char *serializedpoint;
+ LWGEOM *result;
+ int i;
+
+ geom = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ inspected = lwgeom_inspect(SERIALIZED_FORM(geom));
+
+ for (i=0; i<inspected->ngeometries; i++)
+ {
+ line = lwgeom_getline_inspected(inspected, i);
+ if ( line ) break;
+ }
+ pfree_inspected(inspected);
+
+ if ( line == NULL ) PG_RETURN_NULL();
+
+ // Ok, now we have a line.
+
+ // Construct a point array
+ pts = pointArray_construct(getPoint(line->points, 0),
+ line->points->ndims, 1);
+
+ // Construct an LWPOINT
+ point = lwpoint_construct(line->points->ndims, lwgeom_getSRID(geom),
+ pts);
+
+ // Serialized the point
+ serializedpoint = lwpoint_serialize(point);
+
+ // And we construct the line (copy again)
+ result = LWGEOM_construct(serializedpoint, lwgeom_getSRID(geom),
+ lwgeom_hasBBOX(geom->type));
+
+ pfree(point);
+ pfree(serializedpoint);
+
+ PG_RETURN_POINTER(result);
+}
+
+// EndPoint(GEOMETRY) -- find the first linestring in GEOMETRY,
+// return the last point.
+// Return NULL if there is no LINESTRING(..) in GEOMETRY
+PG_FUNCTION_INFO_V1(LWGEOM_endpoint_linestring);
+Datum LWGEOM_endpoint_linestring(PG_FUNCTION_ARGS)
+{
+ LWGEOM *geom;
+ LWGEOM_INSPECTED *inspected;
+ LWLINE *line = NULL;
+ POINTARRAY *pts;
+ LWPOINT *point;
+ char *serializedpoint;
+ LWGEOM *result;
+ int i;
+
+ geom = (LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+ inspected = lwgeom_inspect(SERIALIZED_FORM(geom));
+
+ for (i=0; i<inspected->ngeometries; i++)
+ {
+ line = lwgeom_getline_inspected(inspected, i);
+ if ( line ) break;
+ }
+ pfree_inspected(inspected);
+
+ if ( line == NULL ) PG_RETURN_NULL();
+
+ // Ok, now we have a line.
+
+ // Construct a point array
+ pts = pointArray_construct(
+ getPoint(line->points, line->points->npoints-1),
+ line->points->ndims, 1);
+
+ // Construct an LWPOINT
+ point = lwpoint_construct(line->points->ndims, lwgeom_getSRID(geom),
+ pts);
+
+ // Serialized the point
+ serializedpoint = lwpoint_serialize(point);
+
+ // And we construct the line (copy again)
+ result = LWGEOM_construct(serializedpoint, lwgeom_getSRID(geom),
+ lwgeom_hasBBOX(geom->type));
+
+ pfree(point);
+ pfree(serializedpoint);
+
+ PG_RETURN_POINTER(result);
+}
--
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-- $Log$
+-- Revision 1.15 2004/08/24 16:33:41 strk
+-- Added StartPoint(), EndPoint()
+--
-- Revision 1.14 2004/08/24 16:20:10 strk
-- Added X(), Y() and Z() funx
--
AS '@MODULE_FILENAME@','LWGEOM_z_point'
LANGUAGE 'C' WITH (isstrict);
+CREATEFUNCTION StartPoint(geometry)
+ RETURNS geometry
+ AS '@MODULE_FILENAME@', 'LWGEOM_startpoint_linestring'
+ LANGUAGE 'C' WITH (isstrict);
+
+CREATEFUNCTION EndPoint(geometry)
+ RETURNS geometry
+ AS '@MODULE_FILENAME@', 'LWGEOM_endpoint_linestring'
+ LANGUAGE 'C' WITH (isstrict);
+
------------------------------------------------------------------------