--- 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));
}