[geos-devel] Problems creating polygons with holes

strk strk at keybit.net
Wed Jun 30 13:21:04 EDT 2004


On Wed, Jun 30, 2004 at 08:26:04AM -0700, Martin Davis wrote:
> Sounds like a clever solution.  My C++ is a little rusty - is there a
> way to differentiate between pass-by-ref and pass-by-pointer?   And are
> you saying that for vectors you would pass the vector itself as ref or
> ptr?

pass-by-ref on the caller side is the same of pass-by-value:

	Point p1();
	do_something_on_point(p1);  // pass-by-value or pass-by-ref

the way it is handled depends on the called function definition:

	do_something_on_point(Point& pref)  // pass-by-ref
	{
		pref.do_somthing_else();
	}

	do_something_on_point(Point pcopy)  // pass-by-value
	{
		pref.do_somthing_else();
	}

For vector args I would pass the vector itself as ref or pointer because
current format of geomtry vectors is currently:

 vector<Geometry *> *geometries;

So tranforming it to vector<Geometry> would be a pain...
Instead I would just check for vector by-ref or by-pointer, as in:

 vector<Geometry *> *geometries;
 Geometry *deep_copy = new GeometryCollection(geometries);
 Geometry *take_ownshp = new GeometryCollection(*geometries);

Does it sound ?

--strk;

> 
> Martin Davis, Senior Technical Architect
> Vivid Solutions Inc.      www.vividsolutions.com
> Suite #1A-2328 Government Street Victoria, B.C. V8T 5G5
> Phone: (250) 385 6040 - Local 308 Fax: (250) 385 6046
> 
> 
> > -----Original Message-----
> > From: strk [mailto:strk at keybit.net] 
> > Sent: June 29, 2004 6:03 PM
> > To: Martin Davis; geos-devel at geos.refractions.net
> > Subject: Re: [geos-devel] Problems creating polygons with holes
> > 
> > 
> > Another alternative would be having pass-by-reference 
> > deep copy and pass-by-pointer take ownership.
> > Geometries taking vector could base the check on the
> > vector itself (Collections, Polygon).
> > This would avoid using the additional argument, which in some 
> > cases could require big changes (casing const pointers to non-const).
> > 
> > What do you think about this ?
> > 
> > --strk;
> > 
> > On Wed, Jun 30, 2004 at 01:28:02AM +0200, strk wrote:
> > > On Mon, Jun 28, 2004 at 03:04:21PM -0700, Martin Davis wrote:
> > > > Not sure there's any neat solution to this problem....  I think 
> > > > you'll have to go with the extra arg.
> > > > 
> > > > The other option is to just provide the copying 
> > functionality in the 
> > > > GeometryFactory, not in the basic constructors.
> > > 
> > > We'd have to modify Geometry constructors anyway, so this would not 
> > > really reduce the effort.
> > > 
> > > > Personally I would rather keep the whole thing clean, and not 
> > > > provide copying. After all, who is the client for this?  And why 
> > > > can't they learn to copy when needed?
> > > 
> > > Unfortunately copying is not always clean ...
> > > For Geometries your have the ->clone() method, while
> > > the same is not that clear for other types of constructors... 
> > > LineString - for example - take a CoordinateList, which is copied 
> > > with:
> > > 
> > points=CoordinateListFactory::internalFactory->createCoordinat
> > eList(pts)
> > > (which is ugly and very unconfortable).
> > > Polygon - another example - take vector<Geometry *>*holes as second
> > > argument, which takes a loop to be copied.
> > > 
> > > My point is that current GEOS status has not a neat copying 
> > interface 
> > > for all everyday use classes, so hiding the complexity of 
> > it might be 
> > > worth. Another point - but that is opinable - is that as a standard 
> > > way of programming any object should be destroyed by the 
> > object that 
> > > created it, for mind serenity's sake, so a non-standard behaviour 
> > > should be explicitly advertised (an additional arg would do).
> > > 
> > > See also darren problems with memory management
> > > (sure he DO can learn...)
> > > 
> > > --strk;
> > > 
> > > > 
> > > > Martin Davis, Senior Technical Architect
> > > > Vivid Solutions Inc.      www.vividsolutions.com
> > > > Suite #1A-2328 Government Street Victoria, B.C. V8T 5G5
> > > > Phone: (250) 385 6040 - Local 308 Fax: (250) 385 6046
> > > > 
> > > > 
> > > > > -----Original Message-----
> > > > > From: strk [mailto:strk at keybit.net]
> > > > > Sent: June 28, 2004 2:56 PM
> > > > > To: Martin Davis
> > > > > Subject: Re: [geos-devel] Problems creating polygons with holes
> > > > > 
> > > > > 
> > > > > On Mon, Jun 28, 2004 at 02:21:12PM -0700, Martin Davis wrote:
> > > > > > Good point.
> > > > > > 
> > > > > > How are you going to indicate that copying is required in the
> > > > > > constructors?
> > > > > 
> > > > > I'm stuck on that part :)
> > > > > Basically I was thinking about duplicating each 
> > constructor so to 
> > > > > have a deep-copier and a ownership-taker. The two constructors 
> > > > > would be distinguished by a fake additional argument 
> > (an argument 
> > > > > needed just to distinguish them, whose value does not 
> > matter). I 
> > > > > don't like this setup, but I don't see any enlightment.
> > > > > 
> > > > > Just one more alternative is putting this logic in the
> > > > > geometryfactory which could create empty versions and then 
> > > > > 'install' actual content... this would waste some space and 
> > > > > cpu but not that much.
> > > > > 
> > > > > What do you think?
> > > > > 
> > > > > --strk;
> > > > > 
> > > > > > 
> > > > > > Martin Davis, Senior Technical Architect
> > > > > > Vivid Solutions Inc.      www.vividsolutions.com
> > > > > > Suite #1A-2328 Government Street Victoria, B.C. V8T 5G5
> > > > > > Phone: (250) 385 6040 - Local 308 Fax: (250) 385 6046
> > > > > > 
> > > > > > 
> > > > > > > -----Original Message-----
> > > > > > > From: strk [mailto:strk at keybit.net]
> > > > > > > Sent: June 28, 2004 2:20 PM
> > > > > > > To: Martin Davis
> > > > > > > Cc: geos-devel at geos.refractions.net
> > > > > > > Subject: Re: [geos-devel] Problems creating polygons with 
> > > > > > > holes
> > > > > > > 
> > > > > > > 
> > > > > > > On Mon, Jun 28, 2004 at 02:15:31PM -0700, Martin 
> > Davis wrote:
> > > > > > > > By pattern/support class is just fancy software 
> > engineering
> > > > > > > speak for
> > > > > > > > "make it standard and simple for the client".
> > > > > > > > 
> > > > > > > > What do you mean by "duplicating each 
> > constructor"?  Do you 
> > > > > > > > mean duplicating each method on the GeometryFactory?
> > > > > > > 
> > > > > > > Wooo.. actually I meant each Geometry constructor AND 
> > > > > > > GeometryFactory methods. GeometryFactory methods 
> > call Geometry 
> > > > > > > constructors after all so the double-approach must 
> > be present 
> > > > > > > in both places.
> > > > > > > 
> > > > > > > --strk;
> > > > > > > 
> > > > > > > > 
> > > > > > > > Martin Davis, Senior Technical Architect
> > > > > > > > Vivid Solutions Inc.      www.vividsolutions.com
> > > > > > > > Suite #1A-2328 Government Street Victoria, B.C. V8T 5G5
> > > > > > > > Phone: (250) 385 6040 - Local 308 Fax: (250) 385 6046
> > > > > > > > 
> > > > > > > > 
> > > > > > > > > -----Original Message-----
> > > > > > > > > From: strk [mailto:strk at keybit.net]
> > > > > > > > > Sent: June 28, 2004 1:59 PM
> > > > > > > > > To: Martin Davis
> > > > > > > > > Cc: GEOS Development List
> > > > > > > > > Subject: Re: [geos-devel] Problems creating polygons
> > > > > with holes
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > On Mon, Jun 28, 2004 at 01:50:09PM -0700, Martin Davis 
> > > > > > > > > wrote:
> > > > > > > > > > Strk:
> > > > > > > > > > 
> > > > > > > > > > IMO the current paradigm (that of constructors taking
> > > > > > > ownership of
> > > > > > > > > > their
> > > > > > > > > > components) is the correct one.  The reason 
> > is to avoid
> > > > > > > unecessary
> > > > > > > > > > copying of argument data (which could be large).  It 
> > > > > > > > > > should
> > > > > > > > > be left up
> > > > > > > > > > to the caller to decide when and where they 
> > need to copy 
> > > > > > > > > > arguments.
> > > > > > > > > > 
> > > > > > > > > > Yes, this is a potential source of errors for 
> > clients, 
> > > > > > > > > > if
> > > > > > > > > they don't
> > > > > > > > > > understand how to properly use the library.  But the
> > > > > > > > > > alternative forces clients to tolerate extra 
> > overhead even 
> > > > > > > > > > when
> > > > > > > they don't need
> > > > > > > > > > it, which is not friendly behaviour from a library.
> > > > > > > > > > 
> > > > > > > > > > If this is really onerous, two versions of each 
> > > > > > > > > > constructor
> > > > > > > > > could be
> > > > > > > > > > provided.  Or possibly even better, a pattern 
> > & support
> > > > > > > > > class to make
> > > > > > > > > > it easy to copy arguments.
> > > > > > > > > 
> > > > > > > > > Unfortunately geos-1.0 was released with mixed
> > > > > policy, which is
> > > > > > > > > what I'm trying to conform now.
> > > > > > > > > 
> > > > > > > > > I like the idea of letting callers specify 
> > whether or not 
> > > > > > > > > to
> > > > > > > > > take ownership and so far duplicationg each 
> > constructor seems 
> > > > > > > > > the cleaner way (adding a parameter takeOwnership 
> > > > > would make all
> > > > > > > > > const correctness useless and will require
> > > > > modifications in many
> > > > > > > > > places).
> > > > > > > > > 
> > > > > > > > > What do you mean by pattern & support class ?
> > > > > > > > > 
> > > > > > > > > --strk;
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > Martin Davis, Senior Technical Architect
> > > > > > > > > > Vivid Solutions Inc.      www.vividsolutions.com
> > > > > > > > > > Suite #1A-2328 Government Street Victoria, 
> > B.C. V8T 5G5
> > > > > > > > > > Phone: (250) 385 6040 - Local 308 Fax: (250) 385 6046
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > > -----Original Message-----
> > > > > > > > > > > From: strk [mailto:strk at keybit.net]
> > > > > > > > > > > Sent: June 28, 2004 12:59 PM
> > > > > > > > > > > To: Darren Carman
> > > > > > > > > > > Cc: GEOS Development List
> > > > > > > > > > > Subject: Re: [geos-devel] Problems creating polygons
> > > > > > > with holes
> > > > > > > > > > > 
> > > > > > > > > > > 
> > > > > > > > > > > I could not find the problem.
> > > > > > > > > > > Here is a reduced code exploiting the 
> > error. I'll keep 
> > > > > > > > > > > inspecting this...
> > > > > > > > > > > 
> > > > > > > > > > > BTW: I don't feel comportable in Polygon
> > > > > constructor taking
> > > > > > > > > > > ownership of passed arguments, what people think
> > > > > > > about modifying
> > > > > > > > > > > this as well ?
> > > > > > > > > > > 
> > > > > > > > > > > --strk;
> > > > > > > > > > > 
> > > > > > > > > > > //--------------------------8<-------------------
> > > > > > > > > > > 
> > > > > > > > > > > #include <geos/io.h>
> > > > > > > > > > > #include <geos/geom.h>
> > > > > > > > > > > #include <geos/util.h>
> > > > > > > > > > > 
> > > > > > > > > > > using namespace std;
> > > > > > > > > > > using namespace geos;
> > > > > > > > > > > 
> > > > > > > > > > > int main(int argc, char *argv[]) {
> > > > > > > > > > >         Coordinate c;
> > > > > > > > > > >         CoordinateList *cl1 =
> > > > > > > > > > > 
> > > > > > > 
> > CoordinateListFactory::internalFactory->createCoordinateList()
> > > > > > > ;
> > > > > > > > > > >         CoordinateList *cl2 =
> > > > > > > > > > > 
> > > > > > > 
> > CoordinateListFactory::internalFactory->createCoordinateList()
> > > > > > > ;
> > > > > > > > > > > 
> > > > > > > > > > >         c.x = 339252; c.y = 1019302; cl1->add(c);
> > > > > > > > > > >         c.x = 339252; c.y = 1029077; cl1->add(c);
> > > > > > > > > > >         c.x = 348752; c.y = 1029077; cl1->add(c);
> > > > > > > > > > >         c.x = 346102; c.y = 1019653; cl1->add(c);
> > > > > > > > > > >         c.x = 339252; c.y = 1019302; cl1->add(c);
> > > > > > > > > > > 
> > > > > > > > > > >         c.x = 340000; c.y = 1020000; cl2->add(c);
> > > > > > > > > > >         c.x = 340000; c.y = 1021000; cl2->add(c);
> > > > > > > > > > >         c.x = 341000; c.y = 1021000; cl2->add(c);
> > > > > > > > > > >         c.x = 341000; c.y = 1020000; cl2->add(c);
> > > > > > > > > > >         c.x = 340000; c.y = 1020000; cl2->add(c);
> > > > > > > > > > > 
> > > > > > > > > > >         try {
> > > > > > > > > > >                 GeometryFactory *gf=new
> > > > > GeometryFactory(new
> > > > > > > > > > > PrecisionModel(),0);
> > > > > > > > > > > 
> > > > > > > > > > >                 Geometry 
> > > > > > > > > > > 
> > *geom1=gf->createPolygon(gf->createLinearRing(cl1),NULL);
> > > > > > > > > > >                 cout<<"geom1: 
> > "<<geom1->toString()<<endl;
> > > > > > > > > > >                 Geometry 
> > > > > > > > > > > 
> > *geom2=gf->createPolygon(gf->createLinearRing(cl2),NULL);
> > > > > > > > > > >                 cout<<"geom2: 
> > "<<geom2->toString()<<endl;
> > > > > > > > > > >                 vector<Geometry*>*holes = new
> > > > > > > > > vector<Geometry*>(1);
> > > > > > > > > > >                 (*holes)[0] = geom2->clone();
> > > > > > > > > > >                 Geometry
> > > > > > > > > > > 
> > *geom3=gf->createPolygon(gf->createLinearRing(cl1),holes);
> > > > > > > > > > >                 cout<<"geom3: 
> > "<<geom3->toString()<<endl;
> > > > > > > > > > >                 delete cl1;
> > > > > > > > > > >                 delete cl2;
> > > > > > > > > > >         } catch (GEOSException *ge) {
> > > > > > > > > > >                 cout << "ERROR: " << 
> > > > > ge->toString() << endl;
> > > > > > > > > > >         } catch (...) {
> > > > > > > > > > >                 cout << "generic ERROR" << endl;
> > > > > > > > > > >         }
> > > > > > > > > > > }
> > > > > > > > > > > 
> > > > > > > > > > > //--------------------------8<-------------------
> > > > > > > > > > > 
> > > > > > > > > > > 
> > > > > > > > > > > On Mon, Jun 28, 2004 at 11:47:17AM +0100, Darren 
> > > > > > > > > > > Carman
> > > > > > > > > > > wrote:
> > > > > > > > > > > > #include <geos/io.h>
> > > > > > > > > > > > #include <geos/geom.h>
> > > > > > > > > > > > 
> > > > > > > > > > > > using namespace std;
> > > > > > > > > > > > using namespace geos;
> > > > > > > > > > > > 
> > > > > > > > > > > > typedef struct boundaryPt {
> > > > > > > > > > > >   double x;
> > > > > > > > > > > >   double y;
> > > > > > > > > > > > };
> > > > > > > > > > > > typedef vector<boundaryPt>    boundary;
> > > > > > > > > > > > typedef vector<boundary>      boundaryList;
> > > > > > > > > > > > typedef vector<boundaryList>  polygonList;
> > > > > > > > > > > > 
> > > > > > > > > > > > polygonList       ptPolygons;
> > > > > > > > > > > > 
> > > > > > > > > > > > int main(int argc, char *argv[]) {
> > > > > > > > > > > >   vector<Geometry *> polygons;
> > > > > > > > > > > >   vector<Geometry *> holes;
> > > > > > > > > > > >   int i,j,k;
> > > > > > > > > > > >   string resStr = "";
> > > > > > > > > > > > 
> > > > > > > > > > > >   boundaryPt poly1[5];
> > > > > > > > > > > >   boundaryPt hole1[5];
> > > > > > > > > > > >   boundary tmpBoundary;
> > > > > > > > > > > >   boundaryList tmpBoundaryList;
> > > > > > > > > > > >   polygonList ptPolygons;
> > > > > > > > > > > > 
> > > > > > > > > > > >   poly1[0].x = 339252;
> > > > > > > > > > > >   poly1[0].y = 1019302;
> > > > > > > > > > > >   poly1[1].x = 339252;
> > > > > > > > > > > >   poly1[1].y = 1029077;
> > > > > > > > > > > >   poly1[2].x = 348752;
> > > > > > > > > > > >   poly1[2].y = 1029077;
> > > > > > > > > > > >   poly1[3].x = 346102;
> > > > > > > > > > > >   poly1[3].y = 1019653;
> > > > > > > > > > > >   poly1[4].x = 339252;
> > > > > > > > > > > >   poly1[4].y = 1019302;
> > > > > > > > > > > > 
> > > > > > > > > > > >   hole1[0].x = 340000;
> > > > > > > > > > > >   hole1[0].y = 1020000;
> > > > > > > > > > > >   hole1[1].x = 340000;
> > > > > > > > > > > >   hole1[1].y = 1021000;
> > > > > > > > > > > >   hole1[2].x = 341000;
> > > > > > > > > > > >   hole1[2].y = 1021000;
> > > > > > > > > > > >   hole1[3].x = 341000;
> > > > > > > > > > > >   hole1[3].y = 1020000;
> > > > > > > > > > > >   hole1[4].x = 340000;
> > > > > > > > > > > >   hole1[4].y = 1020000;
> > > > > > > > > > > > 
> > > > > > > > > > > >   for (i=0; i<5; i++) {
> > > > > > > > > > > >     tmpBoundary.push_back(poly1[i]);
> > > > > > > > > > > >   }
> > > > > > > > > > > >   tmpBoundaryList.push_back(tmpBoundary);
> > > > > > > > > > > >   tmpBoundary.clear();
> > > > > > > > > > > > 
> > > > > > > > > > > >   for (i=0; i<5; i++) {
> > > > > > > > > > > >     tmpBoundary.push_back(hole1[i]);
> > > > > > > > > > > >   }
> > > > > > > > > > > >   tmpBoundaryList.push_back(tmpBoundary);
> > > > > > > > > > > >   tmpBoundary.clear();
> > > > > > > > > > > > 
> > > > > > > > > > > >   ptPolygons.push_back(tmpBoundaryList);
> > > > > > > > > > > >   for(int i=0; i<
> > > > > > > > > static_cast<int>(tmpBoundaryList.size()); i++) {
> > > > > > > > > > > >     tmpBoundaryList[i].clear();
> > > > > > > > > > > >   }
> > > > > > > > > > > >   tmpBoundaryList.clear();
> > > > > > > > > > > > 
> > > > > > > > > > > > 
> > > > > > > > > > > >   try{
> > > > > > > > > > > >     GeometryFactory *gf=new GeometryFactory(new
> > > > > > > > > > > > PrecisionModel(),0);
> > > > > > > > > > > > 
> > > > > > > > > > > >     // for each outer ring create a
> > > > > CoordinateList and add
> > > > > > > > > > > all the points to it
> > > > > > > > > > > >     for(i=0; i<
> > > > > static_cast<int>(ptPolygons.size()); i++) {
> > > > > > > > > > > >       CoordinateList
> > > > > > > > > > > 
> > > > > > > > > 
> > > > > > > 
> > > > > 
> > *cl1=CoordinateListFactory::internalFactory->createCoordinateList(
> > > > > );
> > > > > > > > > > > >       boundaryList bl = ptPolygons[i];
> > > > > > > > > > > >       boundary b = bl[0];
> > > > > > > > > > > >       cout << "Polygon " << i << endl;
> > > > > > > > > > > >       for(k=0; k< 
> > static_cast<int>(b.size()); k++) {
> > > > > > > > > > > >         cout << "Added point " << b[k].x << ',' <<
> > > > > > > > > b[k].y << endl;
> > > > > > > > > > > >         cl1->add(*(new 
> > Coordinate(b[k].x,b[k].y)));
> > > > > > > > > > > >       }
> > > > > > > > > > > > 
> > > > > > > > > > > >       // for each hole create a 
> > coordinate list like
> > > > > > > > > > > > above,
> > > > > > > > > > > create a polygon and add to a Geometry vector
> > > > > > > > > > > >       for(j=1; j< 
> > static_cast<int>(bl.size()); j++) {
> > > > > > > > > > > >         cout << "Hole " << j << endl;
> > > > > > > > > > > >         boundary b = bl[j];
> > > > > > > > > > > >         CoordinateList
> > > > > > > > > > > 
> > > > > > > > > 
> > > > > > > 
> > > > > 
> > *cl2=CoordinateListFactory::internalFactory->createCoordinateList(
> > > > > );
> > > > > > > > > > > >         for(k=0; k< 
> > static_cast<int>(b.size()); k++) {
> > > > > > > > > > > >           cout << "Added point " << 
> > b[k].x << ',' <<
> > > > > > > > > b[k].y << endl;
> > > > > > > > > > > >           cl2->add(*(new 
> > Coordinate(b[k].x,b[k].y)));
> > > > > > > > > > > >         }
> > > > > > > > > > > >         cout << "Creating polygon for hole " <<
> > > > > j << ": "
> > > > > > > > > > > << cl2->toString() << endl;
> > > > > > > > > > > >         Geometry
> > > > > > > > > > > 
> > *geom1=gf->createPolygon(gf->createLinearRing(cl2),NUL
> > > > > > > > > > > L);
> > > > > > > > > > > >         cout << "Geometry " << j << " : " <<
> > > > > > > > > > > geom1->toString() << endl;
> > > > > > > > > > > >         holes.push_back(geom1);
> > > > > > > > > > > >         delete cl2;
> > > > > > > > > > > >       }
> > > > > > > > > > > >       // create a polygon from the 1st 
> > > > > > > > > > > > CoordinateList
> > > > > > > > > and the holes
> > > > > > > > > > > >       cout << "Creating polygon " << i << ": " <<
> > > > > > > > > > > cl1->toString() << endl;
> > > > > > > > > > > >       Geometry
> > > > > > > > > > > 
> > > > > *geom2=gf->createPolygon(gf->createLinearRing(cl1),&holes);   
> > > > > > > > > > >                                           
> > > > > > > > > > > >       cout << "test " << endl;
> > > > > > > > > > > >       cout << "Geometry " << i << " : " <<
> > > > > > > > > > > geom2->toString() << endl;
> > > > > > > > > > > > 
> > > > > > > > > > > >       // save this polygon in another vector
> > > > > > > > > > > >       cout << "Adding polygon " << i << endl;
> > > > > > > > > > > >       polygons.push_back(geom2);
> > > > > > > > > > > >       delete cl1;
> > > > > > > > > > > >     }
> > > > > > > > > > > >     cout << "Creating multi-polygon" << endl;
> > > > > > > > > > > >     // when all done create a MultiPolygon object
> > > > > > > > > > > >     Geometry 
> > *geom3=gf->createMultiPolygon(&polygons);
> > > > > > > > > > > >     cout << "Creating string" << endl;
> > > > > > > > > > > >     resStr = geom3->toString();
> > > > > > > > > > > > 
> > > > > > > > > > > >     //clean up
> > > > > > > > > > > >     delete geom3;
> > > > > > > > > > > >     delete gf;
> > > > > > > > > > > >   }
> > > > > > > > > > > >   catch (GEOSException *ge) {
> > > > > > > > > > > >     cout << "ERROR: " << ge->toString() << endl;
> > > > > > > > > > > >   }
> > > > > > > > > > > >   cout << resStr << endl;
> > > > > > > > > > > > }
> > > > > > > > > > > > 
> > > > > > > > > > > > -----Original Message-----
> > > > > > > > > > > > From: strk [mailto:strk at keybit.net]
> > > > > > > > > > > > Sent: 28 June 2004 11:28
> > > > > > > > > > > > To: GEOS Development List
> > > > > > > > > > > > Subject: Re: [geos-devel] Problems creating
> > > > > polygons with
> > > > > > > > > > > > holes
> > > > > > > > > > > > 
> > > > > > > > > > > > 
> > > > > > > > > > > > Can you produce a neter code exploiting the bug
> > > > > ? I mean a
> > > > > > > > > > > > .cpp file I can compile and run and debug :)
> > > > > > > > > > > > 
> > > > > > > > > > > > -strk;
> > > > > > > > > > > > 
> > > > > > > > > > > > On Mon, Jun 28, 2004 at 11:05:22AM +0100, Darren
> > > > > > > Carman wrote:
> > > > > > > > > > > > > defs:
> > > > > > > > > > > > > typedef struct boundaryPt {
> > > > > > > > > > > > >   double x;
> > > > > > > > > > > > >   double y;
> > > > > > > > > > > > > };
> > > > > > > > > > > > > typedef vector<boundaryPt>    boundary;
> > > > > > > > > > > > > typedef vector<boundary>      boundaryList;
> > > > > > > > > > > > > typedef vector<boundaryList>  polygonList;
> > > > > > > > > > > > > 
> > > > > > > > > > > > > class members used:
> > > > > > > > > > > > >   polygonList       ptPolygons;
> > > > > > > > > > > > >   string tmpStr;
> > > > > > > > > > > > >   string errMsg;
> > > > > > > > > > > > > 
> > > > > > > > > > > > > class function:
> > > > > > > > > > > > > string c_polygon_gml::WKTString(void) {
> > > > > > > > > > > > >   TRACE_FUNC("c_polygon_gml::WKTString");
> > > > > > > > > > > > >   vector<Geometry *> polygons;
> > > > > > > > > > > > >   vector<Geometry *> holes;
> > > > > > > > > > > > >   int i,j,k;
> > > > > > > > > > > > >   string resStr = "";
> > > > > > > > > > > > > 
> > > > > > > > > > > > >   try{
> > > > > > > > > > > > >     GeometryFactory *gf=new GeometryFactory(new
> > > > > > > > > > > PrecisionModel(),0);
> > > > > > > > > > > > > 
> > > > > > > > > > > > >     // for each outer ring create a 
> > CoordinateList 
> > > > > > > > > > > > > and
> > > > > > > > > > > add all the points to it
> > > > > > > > > > > > >     for(i=0; i<
> > > > > > > static_cast<int>(ptPolygons.size()); i++) {
> > > > > > > > > > > > >       CoordinateList
> > > > > > > > > > > 
> > > > > > > > > 
> > > > > > > 
> > > > > 
> > *cl1=CoordinateListFactory::internalFactory->createCoordinateList(
> > > > > );
> > > > > > > > > > > > >       boundaryList bl = ptPolygons[i];
> > > > > > > > > > > > >       boundary b = bl[0];
> > > > > > > > > > > > >       TRACE_OUTPUT("Polygon " << i);
> > > > > > > > > > > > >       for(k=0; k< 
> > static_cast<int>(b.size()); k++) {
> > > > > > > > > > > > >         TRACE_OUTPUT("Added point " << 
> > b[k].x << 
> > > > > > > > > > > > > ','
> > > > > > > > > << b[k].y);
> > > > > > > > > > > > >         cl1->add(*(new 
> > Coordinate(b[k].x,b[k].y)));
> > > > > > > > > > > > >       }
> > > > > > > > > > > > > 
> > > > > > > > > > > > >       // for each hole create a coordinate list 
> > > > > > > > > > > > > like
> > > > > > > > > > > above, create a polygon and add to a Geometry vector
> > > > > > > > > > > > >       for(j=1; j< 
> > static_cast<int>(bl.size()); j++) {
> > > > > > > > > > > > >         TRACE_OUTPUT("Hole " << j);
> > > > > > > > > > > > >         boundary b = bl[j];
> > > > > > > > > > > > >         CoordinateList
> > > > > > > > > > > 
> > > > > > > > > 
> > > > > > > 
> > > > > 
> > *cl2=CoordinateListFactory::internalFactory->createCoordinateList(
> > > > > );
> > > > > > > > > > > > >         for(k=0; k< 
> > static_cast<int>(b.size()); k++) {
> > > > > > > > > > > > >           TRACE_OUTPUT("Added point " 
> > << b[k].x <<
> > > > > > > > > ',' << b[k].y);
> > > > > > > > > > > > >           cl2->add(*(new 
> > Coordinate(b[k].x,b[k].y)));
> > > > > > > > > > > > >         }
> > > > > > > > > > > > >         TRACE_OUTPUT("Creating polygon for
> > > > > hole " << j
> > > > > > > > > > > > > <<
> > > > > > > > > > > ": " << cl2->toString());
> > > > > > > > > > > > >         Geometry
> > > > > > > > > > > 
> > *geom1=gf->createPolygon(gf->createLinearRing(cl2),NUL
> > > > > > > > > > > L);
> > > > > > > > > > > > >         TRACE_OUTPUT("Geometry " << j 
> > << " : " <<
> > > > > > > > > > > geom1->toString());
> > > > > > > > > > > > >         holes.push_back(geom1);
> > > > > > > > > > > > >         delete cl2;
> > > > > > > > > > > > >       }
> > > > > > > > > > > > >       // create a polygon from the 1st 
> > > > > > > > > > > > > CoordinateList
> > > > > > > > > > > > > and
> > > > > > > > > > > the holes
> > > > > > > > > > > > >       TRACE_OUTPUT("Creating polygon " 
> > << i << ": 
> > > > > > > > > > > > > " <<
> > > > > > > > > > > cl1->toString());
> > > > > > > > > > > > >       Geometry
> > > > > > > > > > > 
> > > > > *geom2=gf->createPolygon(gf->createLinearRing(cl1),&holes);
> > > > > > > > > > > > >       TRACE_OUTPUT("test ");
> > > > > > > > > > > > >       TRACE_OUTPUT("Geometry " << i << " : " <<
> > > > > > > > > > > geom2->toString());
> > > > > > > > > > > > > 
> > > > > > > > > > > > >       // save this polygon in another vector
> > > > > > > > > > > > >       TRACE_OUTPUT("Adding polygon " << i);
> > > > > > > > > > > > >       polygons.push_back(geom2);
> > > > > > > > > > > > >       delete cl1;
> > > > > > > > > > > > >     }
> > > > > > > > > > > > >     TRACE_OUTPUT("Creating multi-polygon");
> > > > > > > > > > > > >     // when all done create a 
> > MultiPolygon object
> > > > > > > > > > > > >     Geometry 
> > *geom3=gf->createMultiPolygon(&polygons);
> > > > > > > > > > > > >     TRACE_OUTPUT("Creating string");
> > > > > > > > > > > > >     resStr = geom3->toString();
> > > > > > > > > > > > > 
> > > > > > > > > > > > >     //clean up
> > > > > > > > > > > > >     delete geom3;
> > > > > > > > > > > > >     delete gf;
> > > > > > > > > > > > >   }
> > > > > > > > > > > > >   catch (GEOSException *ge) {
> > > > > > > > > > > > >     errMsg = ge->toString();
> > > > > > > > > > > > >   }
> > > > > > > > > > > > >   return resStr;
> > > > > > > > > > > > > }
> > > > > > > > > > > > > 
> > > > > > > > > > > > > XML read in by class and stored in ptPolygons: 
> > > > > > > > > > > > > <?xml version="1.0" encoding="UTF-8"?> 
> > > > > > > > > > > > > <AreaDefinition> <GDSRequest> <query>
> > > > > > > > > > > > > <AreaQuery outputContent="public">
> > > > > > > > > > > > > <queryArea>
> > > > > > > > > > > > > <Polygon srsName="osgb:BNG">
> > > > > > > > > > > > > <outerBoundaryIs>
> > > > > > > > > > > > > <LinearRing>
> > > > > > > > > > > > > <coordinates>
> > > > > > > > > > > > > 339252,1019302
> > > > > > > > > > > > > 339252,1029077
> > > > > > > > > > > > > 348752,1029077
> > > > > > > > > > > > > 346102,1019653
> > > > > > > > > > > > > 339252,1019302
> > > > > > > > > > > > > </coordinates>
> > > > > > > > > > > > > </LinearRing>
> > > > > > > > > > > > > </outerBoundaryIs>
> > > > > > > > > > > > > <innerBoundaryIs>
> > > > > > > > > > > > > <LinearRing>
> > > > > > > > > > > > > <coordinates>
> > > > > > > > > > > > > 340000,1020000
> > > > > > > > > > > > > 340000,1021000
> > > > > > > > > > > > > 341000,1021000
> > > > > > > > > > > > > 341000,1020000
> > > > > > > > > > > > > 340000,1020000
> > > > > > > > > > > > > </coordinates>
> > > > > > > > > > > > > </LinearRing>
> > > > > > > > > > > > > </innerBoundaryIs>
> > > > > > > > > > > > > </Polygon>
> > > > > > > > > > > > > </queryArea>
> > > > > > > > > > > > > </AreaQuery>
> > > > > > > > > > > > > </query>
> > > > > > > > > > > > > </GDSRequest>
> > > > > > > > > > > > > </AreaDefinition>
> > > > > > > > > > > > > 
> > > > > > > > > > > > > Output:
> > > > > > > > > > > > > TR: TRACE 
> > ENTRY:c_polygon_gml::WKTString line 168 
> > > > > > > > > > > > > file
> > > > > > > > > > > c_polygon_gml.cpp
> > > > > > > > > > > > > TR:   Polygon 0
> > > > > > > > > > > > > TR:   Added point 339252,1.0193e+06
> > > > > > > > > > > > > TR:   Added point 339252,1.02908e+06
> > > > > > > > > > > > > TR:   Added point 348752,1.02908e+06
> > > > > > > > > > > > > TR:   Added point 346102,1.01965e+06
> > > > > > > > > > > > > TR:   Added point 339252,1.0193e+06
> > > > > > > > > > > > > TR:   Hole 1
> > > > > > > > > > > > > TR:   Added point 340000,1.02e+06
> > > > > > > > > > > > > TR:   Added point 340000,1.021e+06
> > > > > > > > > > > > > TR:   Added point 341000,1.021e+06
> > > > > > > > > > > > > TR:   Added point 341000,1.02e+06
> > > > > > > > > > > > > TR:   Added point 340000,1.02e+06
> > > > > > > > > > > > > TR:   Creating polygon for hole 1: 
> > > > > > > > > > > (340000,1.02e+06,1.7e-308) 
> > (340000,1.021e+06,1.7e-308)
> > > > > > > > > > > (341000,1.021e+06,1.7e-308) 
> > (341000,1.02e+06,1.7e-308)
> > > > > > > > > > > (340000,1.02e+06,1.7e-308)
> > > > > > > > > > > > > TR:   Geometry 1 : POLYGON 
> > ((340000.0000000000000000 
> > > > > > > > > > > 1020000.0000000000000000, 340000.0000000000000000 
> > > > > > > > > > > 1021000.0000000000000000, 341000.0000000000000000 
> > > > > > > > > > > 1021000.0000000000000000, 341000.0000000000000000 
> > > > > > > > > > > 1020000.0000000000000000, 340000.0000000000000000
> > > > > > > > > > > 1020000.0000000000000000))
> > > > > > > > > > > > > TR:   Creating polygon 0: 
> > > > > (339252,1.0193e+06,1.7e-308)
> > > > > > > > > > > (339252,1.02908e+06,1.7e-308)
> > > > > (348752,1.02908e+06,1.7e-308)
> > > > > > > > > > > (346102,1.01965e+06,1.7e-308) 
> > > > > > > > > > > (339252,1.0193e+06,1.7e-308)
> > > > > > > > > > > > > TR:   test
> > > > > > > > > > > > > Segmentation fault
> > > > > > > > > > > > > 
> > > > > > > > > > > > > Output when the hole is removed:
> > > > > > > > > > > > > TR: TRACE 
> > ENTRY:c_polygon_gml::WKTString line 168 
> > > > > > > > > > > > > file
> > > > > > > > > > > c_polygon_gml.cpp
> > > > > > > > > > > > > TR:   Polygon 0
> > > > > > > > > > > > > TR:   Added point 339252,1.0193e+06
> > > > > > > > > > > > > TR:   Added point 339252,1.02908e+06
> > > > > > > > > > > > > TR:   Added point 348752,1.02908e+06
> > > > > > > > > > > > > TR:   Added point 346102,1.01965e+06
> > > > > > > > > > > > > TR:   Added point 339252,1.0193e+06
> > > > > > > > > > > > > TR:   Creating polygon 0: 
> > > > > (339252,1.0193e+06,1.7e-308)
> > > > > > > > > > > (339252,1.02908e+06,1.7e-308)
> > > > > (348752,1.02908e+06,1.7e-308)
> > > > > > > > > > > (346102,1.01965e+06,1.7e-308) 
> > > > > > > > > > > (339252,1.0193e+06,1.7e-308)
> > > > > > > > > > > > > TR:   test
> > > > > > > > > > > > > TR:   Geometry 0 : POLYGON 
> > ((339252.0000000000000000 
> > > > > > > > > > > 1019302.0000000000000000, 339252.0000000000000000 
> > > > > > > > > > > 1029077.0000000000000000, 348752.0000000000000000 
> > > > > > > > > > > 1029077.0000000000000000, 346102.0000000000000000 
> > > > > > > > > > > 1019653.0000000000000000, 339252.0000000000000000
> > > > > > > > > > > 1019302.0000000000000000))
> > > > > > > > > > > > > TR:   Adding polygon 0
> > > > > > > > > > > > > TR:   Creating multi-polygon
> > > > > > > > > > > > > TR:   Creating string
> > > > > > > > > > > > > TR: TRACE EXIT:c_polygon_gml::WKTString
> > > > > > > > > > > > > ERROR:
> > > > > > > > > > > > > WTF format
> > > > > > > > > > > > > MULTIPOLYGON (((339252.0000000000000000
> > > > > > > > > > > > > 1019302.0000000000000000, 
> > 339252.0000000000000000 
> > > > > > > > > > > > > 1029077.0000000000000000, 
> > 348752.0000000000000000 
> > > > > > > > > > > > > 1029077.0000000000000000, 
> > 346102.0000000000000000 
> > > > > > > > > > > > > 1019653.0000000000000000, 
> > 339252.0000000000000000 
> > > > > > > > > > > > > 1019302.0000000000000000)))
> > > > > > > > > > > > > 
> > > > > > > > > > > > > 
> > > > > > > > > > > > > -----Original Message-----
> > > > > > > > > > > > > From: strk [mailto:strk at keybit.net]
> > > > > > > > > > > > > Sent: 28 June 2004 11:01
> > > > > > > > > > > > > To: GEOS Development List
> > > > > > > > > > > > > Subject: Re: [geos-devel] Problems creating 
> > > > > > > > > > > > > polygons
> > > > > > > > > with holes
> > > > > > > > > > > > > 
> > > > > > > > > > > > > 
> > > > > > > > > > > > > Can you send the test code ?
> > > > > > > > > > > > > There are currently no known bug ... --strk;
> > > > > > > > > > > > > 
> > > > > > > > > > > > > On Mon, Jun 28, 2004 at 10:15:45AM +0100,
> > > > > Darren Carman
> > > > > > > > > > > > > wrote:
> > > > > > > > > > > > > > Hi all,
> > > > > > > > > > > > > > 
> > > > > > > > > > > > > > I am creating polygons with holes and want
> > > > > to use geos
> > > > > > > > > > > to allow me
> > > > > > > > > > > > > > to output them in WKT.
> > > > > > > > > > > > > > 
> > > > > > > > > > > > > > A polygon without a hole works fine, but as
> > > > > soon as I
> > > > > > > > > > > add a hole I
> > > > > > > > > > > > > > get a segmentation fault after calling the
> > > > > > > > > > > createPolygon function
> > > > > > > > > > > > > > (GeometryFactory) and trying to run 
> > toString on
> > > > > > > > > that polygon.
> > > > > > > > > > > > > > 
> > > > > > > > > > > > > > I am using version 1.0.
> > > > > > > > > > > > > > 
> > > > > > > > > > > > > > I have tried getting the latest 
> > version from CVS 
> > > > > > > > > > > > > > but
> > > > > > > > > > > this causes a
> > > > > > > > > > > > > > segmentation fault to occur while adding the
> > > > > > > 5th polygon
> > > > > > > > > > > > > > coordinate to the CoordinateList 
> > (there are only 
> > > > > > > > > > > > > > 4
> > > > > > > > > > > coordinates in
> > > > > > > > > > > > > > the test polygon, the 5th being the first
> > > > > one repeated
> > > > > > > > > > > - I tried
> > > > > > > > > > > > > > making it 6 to see if it was a problem with 
> > > > > > > > > > > > > > closing
> > > > > > > > > > > > > > the polygon but I still got a segmentation 
> > > > > fault while
> > > > > > > adding the 5th).
> > > > > > > > > > > > > > 
> > > > > > > > > > > > > > Is there a fix for this, or has anyone come 
> > > > > > > > > > > > > > accross
> > > > > > > > > > > > > > it?
> > > > > > > > > > > > > > 
> > > > > > > > > > > > > > Thanks in advance,
> > > > > > > > > > > > > > Darren
> > > > > > > > > > > > > > 
> > > > > > > > > > > > > > 
> > > > > > > > > > > > > > "The information in this e-mail and any
> > > > > attachment is
> > > > > > > > > > > confidential
> > > > > > > > > > > > > > and may be privileged. If you have 
> > received this
> > > > > > > > > > > > > > e-mail
> > > > > > > > > > > in error,
> > > > > > > > > > > > > > please delete it immediately and destroy
> > > > > any copies on
> > > > > > > > > > > > > > your system. You should not retain, 
> > copy or use 
> > > > > > > > > > > > > > this
> > > > > > > > > e-mail for any
> > > > > > > > > > > > > > purpose, nor disclose all or any part of
> > > > > its content
> > > > > > > > > > > > > > to
> > > > > > > > > > > any other
> > > > > > > > > > > > > > person. Opinions expressed in this e-mail may 
> > > > > > > > > > > > > > not be
> > > > > > > > > > > endorsed by
> > > > > > > > > > > > > > the company and unless explicitly indicated, 
> > > > > > > > > > > > > > this
> > > > > > > > > > > e-mail shall not
> > > > > > > > > > > > > > form part of any binding agreement".
> > > > > > > > > > > > > > 
> > > > > > > > > > > > > > 
> > _______________________________________________
> > > > > > > > > > > > > > geos-devel mailing list
> > > > > > > > > > > > > > geos-devel at geos.refractions.net
> > > > > > > > > > > > > > 
> > > > > http://geos.refractions.net/mailman/listinfo/geos-devel
> > > > > > > > 
> > > > > > > > > > _______________________________________________
> > > > > > > > > > > > > geos-devel mailing list
> > > > > geos-devel at geos.refractions.net
> > > > > > > > > > > > > 
> > > > > http://geos.refractions.net/mailman/listinfo/geos-devel
> > > > > > > > 
> > > > > > > > > > _______________________________________________
> > > > > > > > > > > > > geos-devel mailing list
> > > > > geos-devel at geos.refractions.net
> > > > > > > > > > > > > 
> > > > > http://geos.refractions.net/mailman/listinfo/geos-devel
> > > > > > > > 
> > > > > > > > > _______________________________________________
> > > > > > > > > > > > geos-devel mailing list 
> > > > > > > > > > > > geos-devel at geos.refractions.net
> > > > > > > > > > > > 
> > http://geos.refractions.net/mailman/listinfo/geos-devel
> > > > > 
> > > > > > > > > _______________________________________________
> > > > > > > > > > > > geos-devel mailing list 
> > geos-devel at geos.refractions.net
> > > > > > > > > > > > 
> > http://geos.refractions.net/mailman/listinfo/geos-devel
> > > > > 
> > > > > > > > _______________________________________________
> > > > > > > > > > > geos-devel mailing list 
> > > > > > > > > > > geos-devel at geos.refractions.net 
> > > > > > > > > > > 
> > http://geos.refractions.net/mailman/listinfo/geos-deve
> > > > > 
> > > > > > > > l
> > > > > > > > > > > 
> > > > > > > > > > _______________________________________________
> > > > > > > > > > geos-devel mailing list 
> > geos-devel at geos.refractions.net 
> > > > > > > > > > 
> > http://geos.refractions.net/mailman/listinfo/geos-devel
> > > > > > > > > 
> > > > > > > 
> > > > > 
> > > _______________________________________________
> > > geos-devel mailing list
> > > geos-devel at geos.refractions.net 
> > > http://geos.refractions.net/mailman/listinfo/geos-devel
> > 



More information about the geos-devel mailing list