]> granicus.if.org Git - postgis/commitdiff
Added StartPoint(), EndPoint()
authorSandro Santilli <strk@keybit.net>
Tue, 24 Aug 2004 16:33:41 +0000 (16:33 +0000)
committerSandro Santilli <strk@keybit.net>
Tue, 24 Aug 2004 16:33:41 +0000 (16:33 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@742 b70326c6-7e19-0410-871a-916f4a2858ee

lwgeom/MISSING_OBJECTS
lwgeom/lwgeom_ogc.c
lwgeom/lwpostgis.sql.in

index eee88785a98afba4628653a1c63b3b0cdc77395d..5c89b2e546a511a1e775d6f6eb01c78c4b5949f1 100644 (file)
@@ -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)]
index c7bff322d05d1b90e9a79aaa314b1f0afb9e4bcd..f8f0747b0e47839bd9f855b4329884c4790e5c01 100644 (file)
@@ -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; 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);
+}
index f42f1dbb8c612094134bbe53982944dffe132aa2..fbe72937c056c9adafa68a9d189950150f993016 100644 (file)
@@ -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);
+
 
 
 ------------------------------------------------------------------------