Blob Blame History Raw
--- geometry-builder.cpp.orig	2017-07-13 18:57:53.784027132 +0200
+++ geometry-builder.cpp	2017-07-13 19:02:22.904826848 +0200
@@ -74,9 +74,9 @@
     }
 }
 
-coord_ptr nodes2coords(GeometryFactory &gf, const nodelist_t &nodes)
+coord_ptr nodes2coords(const GeometryFactory::unique_ptr &gf, const nodelist_t &nodes)
 {
-    coord_ptr coords(gf.getCoordinateSequenceFactory()->create(size_t(0), size_t(2)));
+    coord_ptr coords(gf->getCoordinateSequenceFactory()->create(size_t(0), size_t(2)));
 
     for (const auto& nd: nodes) {
         coords->add(Coordinate(nd.lon, nd.lat), 0);
@@ -85,7 +85,7 @@
     return coords;
 }
 
-geom_ptr create_multi_line(GeometryFactory &gf, const multinodelist_t &xnodes)
+geom_ptr create_multi_line(const GeometryFactory::unique_ptr &gf, const multinodelist_t &xnodes)
 {
     // XXX leaks memory if an exception is thrown
     std::unique_ptr<std::vector<Geometry*> > lines(new std::vector<Geometry*>);
@@ -94,11 +94,11 @@
     for (const auto& nodes: xnodes) {
         auto coords = nodes2coords(gf, nodes);
         if (coords->getSize() > 1) {
-            lines->push_back(gf.createLineString(coords.release()));
+            lines->push_back(gf->createLineString(coords.release()));
         }
     }
 
-    return geom_ptr(gf.createMultiLineString(lines.release()));
+    return geom_ptr(gf->createMultiLineString(lines.release()));
 }
 
 bool is_polygon_line(CoordinateSequence * coords)
@@ -233,15 +233,15 @@
 
     try
     {
-        GeometryFactory gf;
+        GeometryFactory::unique_ptr gf = GeometryFactory::create();
         auto coords = nodes2coords(gf, nodes);
         if (polygon && is_polygon_line(coords.get())) {
-            auto geom = create_simple_poly(gf, std::move(coords));
+            auto geom = create_simple_poly(*gf, std::move(coords));
             wkb.set(geom.get(), true, projection);
         } else {
             if (coords->getSize() < 2)
                 throw std::runtime_error("Excluding degenerate line.");
-            geom_ptr geom(gf.createLineString(coords.release()));
+            geom_ptr geom(gf->createLineString(coords.release()));
             wkb.set(geom.get(), false);
         }
     }
@@ -269,18 +269,18 @@
 
     try
     {
-        GeometryFactory gf;
+        GeometryFactory::unique_ptr gf = GeometryFactory::create();
         auto coords = nodes2coords(gf, nodes);
 
         if (polygon && is_polygon_line(coords.get())) {
-            auto geom = create_simple_poly(gf, std::move(coords));
+            auto geom = create_simple_poly(*gf, std::move(coords));
             wkbs.emplace_back(geom.get(), true, projection);
         } else {
             if (coords->getSize() < 2)
                 throw std::runtime_error("Excluding degenerate line.");
 
             double distance = 0;
-            std::unique_ptr<CoordinateSequence> segment(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2));
+            std::unique_ptr<CoordinateSequence> segment(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2));
             segment->add(coords->getAt(0));
             for(size_t i=1; i<coords->getSize(); i++) {
                 const Coordinate this_pt = coords->getAt(i);
@@ -300,11 +300,11 @@
                         const Coordinate interpolated(frac * (this_pt.x - prev_pt.x) + prev_pt.x,
                                                       frac * (this_pt.y - prev_pt.y) + prev_pt.y);
                         segment->add(interpolated);
-                        geom_ptr geom(gf.createLineString(segment.release()));
+                        geom_ptr geom(gf->createLineString(segment.release()));
 
                         wkbs.emplace_back(geom.get(), false);
 
-                        segment.reset(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2));
+                        segment.reset(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2));
                         segment->add(interpolated);
                   }
                   // reset the distance based on the final splitting point for
@@ -322,7 +322,7 @@
 
                 // on the last iteration, close out the line.
                 if (i == coords->getSize()-1) {
-                    geom_ptr geom(gf.createLineString(segment.release()));
+                    geom_ptr geom(gf->createLineString(segment.release()));
 
                     wkbs.emplace_back(geom.get(), false);
                 }
@@ -346,8 +346,8 @@
 }
 
 int geometry_builder::parse_wkb(const char* wkb, multinodelist_t &nodes, bool *polygon) {
-    GeometryFactory gf;
-    geos::io::WKBReader reader(gf);
+    GeometryFactory::unique_ptr gf = GeometryFactory::create();
+    geos::io::WKBReader reader(*gf);
 
     *polygon = false;
     std::stringstream stream(wkb, std::ios_base::in);
@@ -401,7 +401,7 @@
 
     try
     {
-        GeometryFactory gf;
+        GeometryFactory::unique_ptr gf = GeometryFactory::create();
         geom_ptr mline = create_multi_line(gf, xnodes);
 
         //geom_ptr noded (segment->Union(mline.get()));
@@ -418,11 +418,11 @@
             // stuff into unique pointer for auto-destruct
             std::unique_ptr<LineString> pline(line);
             if (pline->getNumPoints() > 3 && pline->isClosed()) {
-                std::unique_ptr<Polygon> poly(gf.createPolygon(gf.createLinearRing(pline->getCoordinates()),0));
+                std::unique_ptr<Polygon> poly(gf->createPolygon(gf->createLinearRing(pline->getCoordinates()),0));
                 double area = get_area(poly.get(), projection);
                 if (area > 0.0) {
                     polys.emplace_back(std::move(poly),
-                                       gf.createLinearRing(pline->getCoordinates()),
+                                       gf->createLinearRing(pline->getCoordinates()),
                                        area);
                 }
             }
@@ -488,7 +488,7 @@
                    }
                 }
 
-                Polygon* poly(gf.createPolygon(polys[i].ring.release(), interior.release()));
+                Polygon* poly(gf->createPolygon(polys[i].ring.release(), interior.release()));
                 poly->normalize();
                 polygons->push_back(poly);
             }
@@ -496,7 +496,7 @@
             // Make a multipolygon if required
             if ((toplevelpolygons > 1) && enable_multi)
             {
-                geom_ptr multipoly(gf.createMultiPolygon(polygons.release()));
+                geom_ptr multipoly(gf->createMultiPolygon(polygons.release()));
 
                 if (!multipoly->isEmpty()) {
                     if (!multipoly->isValid() && !excludepoly) {
@@ -547,7 +547,7 @@
 
     try
     {
-        GeometryFactory gf;
+        GeometryFactory::unique_ptr gf = GeometryFactory::create();
         geom_ptr mline = create_multi_line(gf, xnodes);
 
         wkb.set(mline.get(), false);
@@ -571,7 +571,7 @@
 
     try
     {
-        GeometryFactory gf;
+        GeometryFactory::unique_ptr gf = GeometryFactory::create();
         geom_ptr mline = create_multi_line(gf, xnodes);
         //geom_ptr noded (segment->Union(mline.get()));
         LineMerger merger;
@@ -587,27 +587,27 @@
             // stuff into unique pointer to ensure auto-destruct
             std::unique_ptr<LineString> pline(line);
             if (make_polygon && pline->getNumPoints() > 3 && pline->isClosed()) {
-                std::unique_ptr<Polygon> poly(gf.createPolygon(gf.createLinearRing(pline->getCoordinates()),0));
+                std::unique_ptr<Polygon> poly(gf->createPolygon(gf->createLinearRing(pline->getCoordinates()),0));
                 double area = get_area(poly.get(), projection);
                 if (area > 0.0) {
                     polys.emplace_back(std::move(poly),
-                                       gf.createLinearRing(pline->getCoordinates()),
+                                       gf->createLinearRing(pline->getCoordinates()),
                                        area);
                 }
             } else {
                 double distance = 0;
                 std::unique_ptr<CoordinateSequence> segment;
-                segment = std::unique_ptr<CoordinateSequence>(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2));
+                segment = std::unique_ptr<CoordinateSequence>(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2));
                 segment->add(pline->getCoordinateN(0));
                 for(int j=1; j<(int)pline->getNumPoints(); ++j) {
                     segment->add(pline->getCoordinateN(j));
                     distance += pline->getCoordinateN(j).distance(pline->getCoordinateN(j-1));
                     if ((distance >= split_at) || (j == (int)pline->getNumPoints()-1)) {
-                        geom_ptr geom = geom_ptr(gf.createLineString(segment.release()));
+                        geom_ptr geom = geom_ptr(gf->createLineString(segment.release()));
 
                         wkbs.emplace_back(geom.get(), false);
 
-                        segment.reset(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2));
+                        segment.reset(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2));
                         distance=0;
                         segment->add(pline->getCoordinateN(j));
                     }
@@ -692,7 +692,7 @@
                    }
                 }
 
-                Polygon* poly(gf.createPolygon(polys[i].ring.release(), interior.release()));
+                Polygon* poly(gf->createPolygon(polys[i].ring.release(), interior.release()));
                 poly->normalize();
                 polygons->push_back(poly);
             }
@@ -700,7 +700,7 @@
             // Make a multipolygon if required
             if ((toplevelpolygons > 1) && enable_multi)
             {
-                geom_ptr multipoly(gf.createMultiPolygon(polygons.release()));
+                geom_ptr multipoly(gf->createMultiPolygon(polygons.release()));
                 if (!multipoly->isValid() && !excludepoly) {
                     multipoly = geom_ptr(multipoly->buffer(0));
                 }