[geos-devel] Problems creating polygons with holes
strk
strk at keybit.net
Wed Jun 30 18:05:37 EDT 2004
On Wed, Jun 30, 2004 at 04:13:58PM +0100, Darren Carman wrote:
> The way we deal with them holes can contain polygons, which in turn can contain holes, etc. and we still treat holes as polygons -- hence my confusion.
>
> If you would like to use my code as another one of your examples in the distribution - for polygons with holes - then feel free (if you think it may help someone else).
Thanks, but I belive doc/example.cpp already contains a polygon with a hole.
--strk;
>
> Here is the working code:
>
> #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;
>
>
> void createPolys(polygonList &polys) {
> int i;
>
> 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();
>
> polys.push_back(tmpBoundaryList);
> for(int i=0; i< static_cast<int>(tmpBoundaryList.size()); i++) {
> tmpBoundaryList[i].clear();
> }
> tmpBoundaryList.clear();
> }
>
>
> int main(int argc, char *argv[]) {
> vector<Geometry *> *polygons;
> vector<LinearRing *> *holes;
> int i,j,k;
> string resStr = "";
> polygonList ptPolygons;
>
> createPolys(ptPolygons);
> try{
> GeometryFactory *gf=new GeometryFactory(new PrecisionModel(),0);
>
> // for each outer ring create a CoordinateList and add all the points to it
> polygons = new vector<Geometry *>();
> 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,0.0)));
> }
>
> // for each hole create a coordinate list like above, create a polygon and add to a Geometry vector
> holes = new vector<LinearRing *>();
> 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,0.0)));
> }
> cout << "Creating polygon for hole " << j << ": " << cl2->toString() << endl;
> //LinearRing *lin1=(LinearRing *)gf->createPolygon(gf->createLinearRing(cl2),NULL);
> LinearRing *lin1=gf->createLinearRing(cl2);
> cout << "Geometry " << j << " : " << lin1->toString() << endl;
> holes->push_back(lin1);
> delete cl2;
> }
> // create a polygon from the 1st CoordinateList and the holes
> cout << "Creating polygon " << i << ": " << cl1->toString() << endl;
> Geometry *geom1=(Geometry *)gf->createPolygon(gf->createLinearRing(cl1),(vector<Geometry *> *)holes);
> cout << "Geometry " << i << " : " << geom1->toString() << endl;
>
> // save this polygon in another vector
> cout << "Adding polygon " << i << endl;
> polygons->push_back(geom1);
> delete cl1;
> }
> cout << "Creating multi-polygon" << endl;
> // when all done create a MultiPolygon object
> Geometry *geom2=gf->createMultiPolygon((vector<Geometry *> *)polygons);
> cout << "Creating string" << endl;
> resStr = geom2->toString();
>
> //clean up
> delete geom2;
> delete gf;
> }
> catch (GEOSException *ge) {
> cout << "ERROR: " << ge->toString() << endl;
> }
> cout << resStr << endl;
> }
>
> Cheers,
> Darren
>
> -----Original Message-----
> From: chodgson at refractions.net [mailto:chodgson at refractions.net]
> Sent: 30 June 2004 15:55
> To: GEOS Development List
> Subject: RE: [geos-devel] Problems creating polygons with holes
>
>
> > I had assumed that the holes were treated as polygons as well :(
>
> If polygon holes were defined by polygons, then your holes could have holes (which in turn could have holes...)!
>
> :)
> Chris
>
> _______________________________________________
> geos-devel mailing list
> geos-devel at geos.refractions.net
> http://geos.refractions.net/mailman/listinfo/geos-devel
>
>
> "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
More information about the geos-devel
mailing list