From 5ec7ce9dc66f318ee11918363ab006fbe76a612d Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Tue, 24 Aug 2004 16:33:41 +0000 Subject: [PATCH] Added StartPoint(), EndPoint() git-svn-id: http://svn.osgeo.org/postgis/trunk@742 b70326c6-7e19-0410-871a-916f4a2858ee --- lwgeom/MISSING_OBJECTS | 22 ++++----- lwgeom/lwgeom_ogc.c | 105 ++++++++++++++++++++++++++++++++++++++++ lwgeom/lwpostgis.sql.in | 13 +++++ 3 files changed, 129 insertions(+), 11 deletions(-) diff --git a/lwgeom/MISSING_OBJECTS b/lwgeom/MISSING_OBJECTS index eee88785a..5c89b2e54 100644 --- a/lwgeom/MISSING_OBJECTS +++ b/lwgeom/MISSING_OBJECTS @@ -19,7 +19,6 @@ FUNC: KEEPING FUNCTION: [box3d(geometry)] 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)] @@ -59,27 +58,28 @@ FUNC: KEEPING FUNCTION: [equals(geometry, 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)] diff --git a/lwgeom/lwgeom_ogc.c b/lwgeom/lwgeom_ogc.c index c7bff322d..f8f0747b0 100644 --- a/lwgeom/lwgeom_ogc.c +++ b/lwgeom/lwgeom_ogc.c @@ -49,6 +49,10 @@ Datum LWGEOM_x_point(PG_FUNCTION_ARGS); 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 @@ -566,3 +570,104 @@ Datum LWGEOM_z_point(PG_FUNCTION_ARGS) 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; ingeometries; 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; ingeometries; 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); +} diff --git a/lwgeom/lwpostgis.sql.in b/lwgeom/lwpostgis.sql.in index f42f1dbb8..fbe72937c 100644 --- a/lwgeom/lwpostgis.sql.in +++ b/lwgeom/lwpostgis.sql.in @@ -11,6 +11,9 @@ -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- $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 -- @@ -916,6 +919,16 @@ CREATEFUNCTION Z(geometry) 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); + ------------------------------------------------------------------------ -- 2.40.0