[geos-devel] c api feedback

Charlie Savage cfis at savagexi.com
Wed Jul 12 14:59:59 EDT 2006


For what its worth, now that I've gone through the c api for the SWIG 
bindings, here is some feedback:

1.  The methods GEOSCoordSeq_getSize and GEOSCoordSeq_getDimensions 
return their results by updating a pointer to a size_t parameter.  Thus 
like this:

GEOSCoordSeq_getSize(const GEOSCoordSeq s, size_t *size);

In contrast, these methods just return the result:

GEOSGeom_getDimensions returns value, not as a parameter
GEOSGeom_getNumcoordinates
GEOSGeom_getNumInteriorRings
GEOSGeom_getNumGeometries

Seems like an unneeded inconsistency.

2.  The coordinate sequence api is extremely awkward to use.  Its 
verbose and results in fairly unreadable code.  Like this:

     cs = Geos::CoordinateSequence.new(4,3)
     cs.set_x(0, 7)
     cs.set_y(0, 8)
     cs.set_z(0, 9)
     cs.set_x(1, 3)
     cs.set_y(1, 3)
     cs.set_z(1, 3)
     cs.set_x(2, 11)
     cs.set_y(2, 15.2)
     cs.set_z(2, 2)
     cs.set_x(3, 7)
     cs.set_y(3, 8)
     cs.set_z(3, 9)

This all seems fairly unecessary since coordinate sequences only support 
x/y/z.  Would be a lot nicer to do this:

     cs.add(7,8,9)
     cs.add(3,3,3)
     cs.add(11,15.2,2)
     cs.add(7,8,9)

Isn't that much clearer?  I believe the api is setup the way it is to 
allow more dimensions in the future.  Is this a case of YAGNI 
(http://en.wikipedia.org/wiki/YAGNI)?

Could we please expose a simplified for coordinate sequences in the c 
api?  Such as an "add" method, and while we are at it, shouldn't there 
also be a remove method?


3.  A lot of methods, like GEOSDisjoint, return a char.  The char is 0 
for false, 1 for true and 2 for an exception.  I took that to mean '0', 
'1', '2'.  In fact its not, its like this:

(char)1

Thus if you look at the char is actually '%' (or some such thing).  You 
of course need to get the int result back by a typecast

result = (int)GEOSDisjoint

Maybe this could be better documented?


4.  Buffer operation now takes quadrant segments.  I had no idea what 
that should be...hunting through the code it turns out to default to 8. 
  Do people use the quadrant parameter much?  Seems like an unneeded bit 
of complexity.  At a minimum, can the default value be exposed as a 
constant?  That way the SWIG bindings can set a default value for the 
buffer operation so users can just do geom.buffer(10) and can specify 
the second parameter only if needed.


5.  Two operations that used to be exposed via SWIG are no longer:

within_distance
equal_exact


6.  Not very important, but the shape factory is not exposed via the c 
api.  Not sure if anyone uses it - its used in example.cpp.

7. The envelopes is not exposed.  I find that one quite useful when 
dealing with bounding boxes - easier than having to work with a polygon 
that represents a bounding box.

Anyway, hope these comments are helpful.


Thanks,

Charlie
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 3237 bytes
Desc: S/MIME Cryptographic Signature
Url : http://lists.osgeo.org/pipermail/geos-devel/attachments/20060712/e4baa432/smime.bin


More information about the geos-devel mailing list