[fdo-internals] Request review of RFC 28-AddStart/EndExpressionFunctions

Orest Halustchak orest.halustchak at autodesk.com
Wed Nov 5 09:13:09 EST 2008


Hi,

I agree with Jason's suggestion to mimic OGC functions as much as possible.

The OGC Simple Feature spec (06-103r3, which is the most recent version) has different functions for different geometry types.

Methods that apply to all geometry types include these (among others):
                Dimension(): Int
                GeometryType(): String
                SRID(): Int
                Envelope(): Geometry
                IsEmpty(): Int
                IsSimple(): Int
                Is3D(): Int
                IsMeasured(): Int

Geometry collection types such as multi-geometry, multi-point, multi-polygon etc. include:
                NumGeometries(): Int
                GeometryN(N): Geometry

Point includes:
                X(): double
                Y(): double
                Z(): double
                M(): double

Z() and M() return null if the geometry does not include them. Jason, you mentioned returning null rather than throwing exceptions for cases that are not defined, and this is consistent with OGC.

Curve includes:
                Length(): double
                StartPoint(): Point
                EndPoint(): Point
                IsClosed(): Int  (true if start point equals end point)
                IsRing(): Int  (true if IsClosed and IsSimple)

LineString includes:
                NumPoints(): Int
                PointN(N): Point

MultiCurve is interesting:
                IsClosed(): Int  (true if each element curve is closed)
                Length(): double  (sum of lengths of the elements)

Surface and MultiSurface include:
                Area(): double
                Centroid(): Point  (mathematical centroid, not guaranteed to be on the surface)
                PointOnSurface(): Point  (a point guaranteed to be on the surface)

Polygon (sub-type of Surface) includes:
                ExteriorRing(): LineString
                NumInteriorRing(): Int
                InteriorRing(N): LineString

Interestingly, there are no MinX, MinY type functions. The Envelope of a geometry is meant to include them, but an Envelope is a geometry type so you have to process it to get specific minx, miny, etc. values. Envelope geometry typically is a polygon, but I think OGC allows it to be two points as well.

So, what should we include for FDO? It makes sense for the long term to support all of the above functions. Some of these such as Length and Area we already support. However, for this particular RFC, it would be a fair amount of work to add all of these. From Jason's last email, maybe we change this RFC to add the following. The rest can be done as they are needed using other RFCs to add them.

                StartPoint(Geometry): Point, returning null for multi-type geometries
                EndPoint(Geometry): Point, returning null for multi-type geometries
                NumPoints(Geometry): Int64, returning null for non-linestrings, e.g. if input is a curve with an arc, result would be null; point geometries could be supported
                PointN(Geometry, N): Point, returning null for non-linestrings and if N is out of range; point geometries could be supported
                X(Geometry): double, returning null if geometry is not a point
                Y(Geometry): double, returning null if geometry is not a point
                Z(Geometry): double, returning null if geometry is not a point or does not have Z
                M(Geometry): double, returning null if geometry is not a point or does not have M

Possibly NumPoints and PointN also could be done later.

It's odd to have an M value on a point, but because you can do something like M(PointN(geometry, 4)), it does make sense.


Thanks,
Orest.


From: fdo-internals-bounces at lists.osgeo.org [mailto:fdo-internals-bounces at lists.osgeo.org] On Behalf Of Jason Birch
Sent: Tuesday, November 04, 2008 7:21 PM
To: FDO Internals Mail List
Subject: RE: [fdo-internals] Request review of RFC 28-AddStart/EndExpressionFunctions

It seems like it would be a good idea to mimic these OGC spatial functions as much as possible.

Instead of a "last" argument, it may be better to create the helper functions (StartPoint, EndPoint).  The EndPoint function could be "equivalent" to PointN(geom,(NumPoints(geom)) but have an optimized implementation.

I wonder if FDO should consider further mimicking the OGC functions by also implementing something like their STX and STY to get the individual dimensions of explicit points, rather than shortcuts that have to make assumptions about which point the ordinates are pulled from.   For instance XCOORD(PointN(geom,1)) or XCOORD(StartPoint(geom)) instead of PointX(geom)

http://msdn.microsoft.com/en-us/library/bb933828.aspx

I _do_ like that these functions return NULL for non-point geometries rather than throwing exceptions.

Jason

From: fdo-internals-bounces at lists.osgeo.org [mailto:fdo-internals-bounces at lists.osgeo.org] On Behalf Of Robert Fortin
Sent: Tuesday, November 04, 2008 15:51
To: FDO Internals Mail List
Subject: RE: [fdo-internals] Request review of RFC 28-AddStart/EndExpressionFunctions

Dan,

Interesting that you found this info.  I believe the STPointN definition is similar to what I was proposing since it depends on the order of output.  I was suggesting the same thing just in different word just applying to FDO.
I think adding the NumPoint function is also interesting and could be useful.  I'm worried about the performance of the nested function compare to a simple "last" argument.  So I still think it would useful to have the "last" point as argument.  "1" for the first point is obvious.

RF

From: fdo-internals-bounces at lists.osgeo.org [mailto:fdo-internals-bounces at lists.osgeo.org] On Behalf Of Dan Stoica
Sent: Tuesday, November 04, 2008 6:14 PM
To: FDO Internals Mail List
Subject: RE: [fdo-internals] Request review of RFC 28 -AddStart/EndExpressionFunctions

I had a look into SqlServer2008 documentation for inspiration. It has a number of interesting functions:

STStartPoint()

STEndPoint() is the equivalent of STPointN<http://msdn.microsoft.com/en-us/library/bb933844.aspx>(x.STNumPoints()).
STNumPoints() This method counts the points in the description of a geography instance. Duplicate points are counted. If this instance is a geometry collection, this method returns of the total number of points in each of the elements in the collection.

STPointN() returns the point specified by expression by ordering all the points in the same order they would be output: first by geography instance, then by ring within the instance (if appropriate), and then by point within the ring. This order is deterministic.
If this method is called with a value less than 1, it throws an ArgumentOutOfRangeException.
If this method is called with a value greater than the number of points in the instance, it returns null.

I hope this clarifies  a little the desired behavior for polygons and multi part geometries (see in red).

As a minimal number of functions, I guess these ones will suffice:

NumPoints(geom)
PointX(geom, N) etc.

Note the expression engine supports embedded functions, therefore for getting the  Start/End points we can say:

PointX(geom, 1) etc.
PointX(geom, NumPoints(geom)) etc.


Dan.


From: fdo-internals-bounces at lists.osgeo.org [mailto:fdo-internals-bounces at lists.osgeo.org] On Behalf Of Robert Fortin
Sent: Tuesday, November 04, 2008 4:41 PM
To: FDO Internals Mail List
Subject: RE: [fdo-internals] Request review of RFC 28 -AddStart/EndExpressionFunctions

Guys,

Unless there is standard out there, we can come up with whatever definition we want as long as it is consistant and it makes sense.

The RFC proposes the following:

If the provided geometry is a point geometry, the result of the Start/End functions is the x, y, z values of the point.
If the provided geometry is a multi-point geometry, the result of the Start/End functions is the x, y, z values of the first point.

>> I think Start should be referencing the first point and End the last point in case of multi-point.

If the provided geometry is a line geometry, the result of the Start/End functions is the x, y, z values of the start and end points of the first line.
If the provided geometry is a multi-line geometry, the result of the Start/End functions is the x, y, z values of the start and end points of the first line.

>> Same here.  Start - first point of first line, End - last point of last line.

If the provided geometry is a polygon geometry, the result of the Start/End functions is the x, y, z values of the start and end points of the exterior ring of the polygon.
If the provided geometry is a multi-polygon geometry, the result of the Start/End functions is the x, y, z values of the start and end points of the exterior ring of the first polygon.

>> Same again.  Start - first point of first ring, End - last point of last ring.
But we all know that it is not valuable to use those on polygon or circle (which is just an arc) but I don't want the function to throw an error because a polygon geometry is passed as input.
Let's agree on what it should be and return it.

RF

From: fdo-internals-bounces at lists.osgeo.org [mailto:fdo-internals-bounces at lists.osgeo.org] On Behalf Of Traian Stanev
Sent: Tuesday, November 04, 2008 3:15 PM
To: FDO Internals Mail List
Subject: RE: [fdo-internals] Request review of RFC 28 -AddStart/EndExpressionFunctions


Moreover, what if the geometry is a circle? :)



From: fdo-internals-bounces at lists.osgeo.org [mailto:fdo-internals-bounces at lists.osgeo.org] On Behalf Of Dan Stoica
Sent: Tuesday, November 04, 2008 3:14 PM
To: FDO Internals Mail List
Subject: RE: [fdo-internals] Request review of RFC 28 -AddStart/EndExpressionFunctions

Robert, returning to the original issue:  what is the meaning of PointX(geometry, 'end') for a polygon?

Dan.


From: fdo-internals-bounces at lists.osgeo.org [mailto:fdo-internals-bounces at lists.osgeo.org] On Behalf Of Robert Fortin
Sent: Tuesday, November 04, 2008 2:46 PM
To: FDO Internals Mail List
Subject: RE: [fdo-internals] Request review of RFC 28 -AddStart/EndExpressionFunctions

I think there was plenty of good idea of how far we can go with these kind of functions.  But, trying to go back to the original issue we were trying to resolve by RFC-28 which is simply to get the coordinates values for the first and last point...

I think Romy has an interesting proposal that makes the function evolutive over time and avoid over populating the list of functions with new names each time we think of a new possibility. It also makes it clear that it is about the points on the geometry and not computed point as other functions like MidX or CentroidX would be  (but that a matter for another debate).

I was thinking of even rationalizing it further (by adding another enumeration parameter to indicate x,y and z - we forgot about "m" by the way!) but I think the name of the function PointX, PointY and PointZ are just clear enough.

Can we go for that as far as the RFC is concerned?

RF


From: fdo-internals-bounces at lists.osgeo.org [mailto:fdo-internals-bounces at lists.osgeo.org] On Behalf Of Romica Dascalescu
Sent: Tuesday, November 04, 2008 11:27 AM
To: FDO Internals Mail List
Subject: RE: [fdo-internals] Request review of RFC 28 -AddStart/EndExpressionFunctions

Hi,

A different approach is to create functions which takes a geometry and an enumeration, this way each provider can implement all cases or just a few of them, e.g.:

PointX(geom, enum)
PointY(geom, enum)
PointZ(geom, enum)

Where enum can be: 'start', 'end', 'min', 'max', 'centroid', ...
For now we may implement just a few of them (start, end) and in the future we could implement more cases.

Romy.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/fdo-internals/attachments/20081105/cb273b46/attachment-0001.html


More information about the fdo-internals mailing list