[geos-devel] Status (New Example)
David Blasby
dblasby at refractions.net
Fri Apr 4 17:06:22 EST 2003
Yury A. Bychkov wrote:
>I've added a new example that shows how to write a CoordinateList class that
>wraps some other storage method (in this case an array of point_3d) to the CVS.
>
>
>
I've started work on the PostGIS interface to GEOS. I'm trying to
decide between the normal
CoordinateList interface (BasicCoordinateList) and a custom CoordinateList:
The "normal list" would be something like: (cf.
CoordinateListsExample.cpp in examples/)
CoordinateList
*cl1=CoordinateListFactory::internalFactory->createCoordinateList();
cl1->add(*(new Coordinate(140,120)));
So, I'd convert my PostGIS point lists into a CoordinateList. This
would require
1. about 2* the memory since I'll have my PostGIS POINT3D and GEOS
Coordinates around.
2. the time required to make the coordinates
The CustomCoordinate (cf. CustomPointCoordinateList.cpp in examples/)
would allow me
to wrap my PostGIS POINT3D arrays into a CoordinateList.
On first account, this looks more memory efficient and time efficient,
but upon closer
examination, it looks worse. Lets look at the getAt(int) function:
Coordinate& CustomPointCoordinateList::getAt(int pos){
point_3d pt;
if (pos>=0 && pos<size) {
pt=pts[pos];
return *(new Coordinate(pt.x,pt.y,pt.z));
} else
throw "CustomPointCoordinateList exception: can't retrieve
element\n";
}
From a time perspective, any GEOS function (like relate() ) that looks
at each of the points in a
geometry will have to create a new Coordinate() for each PostGIS POINT3D.
Its even worse if you look at each of the points
in a geometry twice (or more) - you'll construct several Coordanates.
This makes the
getAt() function *very* costly. It also means that coordlist.get(3)
will return a different object every
invocation.
For memory usage, the GEOS function do something like build an index
(ie. all the Coordinates are stored somewhere),
we are not saving any memory, not to mention we could be leaking memory
with multiple calls to getAt().
So, it appears that the correct interface to use would be the
BasicCoordinateList, not a custom one.
Comments?
dave
ps. The PostGIS POINT3D is identical to the GEOS geom.h point_3d.
More information about the geos-devel
mailing list