diff --git a/osm2pgsql.nix b/osm2pgsql/default.nix similarity index 87% rename from osm2pgsql.nix rename to osm2pgsql/default.nix index 38239f1..9c1eba5 100644 --- a/osm2pgsql.nix +++ b/osm2pgsql/default.nix @@ -11,6 +11,12 @@ stdenv.mkDerivation rec { sha256 = "1wf3xd33glf4kf34yx7ljwzmn24iar1rb0zqf8m2qclqs169f8dz"; }; + # https://github.com/openstreetmap/osm2pgsql/issues/634 + # https://bz-attachments.freebsd.org/attachment.cgi?id=177390 + patches = [ + use-geos36.patch + ]; + #nativeBuildInputs = [ ]; buildInputs = [ boost diff --git a/osm2pgsql/use-geos36.patch b/osm2pgsql/use-geos36.patch new file mode 100644 index 0000000..13132b4 --- /dev/null +++ b/osm2pgsql/use-geos36.patch @@ -0,0 +1,296 @@ +--- ./geometry-builder.cpp.ORIG 2015-02-22 16:08:14.000000000 +0100 ++++ ./geometry-builder.cpp 2016-11-25 17:19:29.804737000 +0100 +@@ -94,8 +94,8 @@ + + geometry_builder::maybe_wkt_t geometry_builder::get_wkt_simple(const osmNode *nodes, int count, int polygon) const + { +- GeometryFactory gf; +- std::auto_ptr coords(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); ++ GeometryFactory::unique_ptr gf = GeometryFactory::create(); ++ std::auto_ptr coords(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); + + try + { +@@ -109,8 +109,8 @@ + maybe_wkt_t wkt(new geometry_builder::wkt_t()); + geom_ptr geom; + if (polygon && (coords->getSize() >= 4) && (coords->getAt(coords->getSize() - 1).equals2D(coords->getAt(0)))) { +- std::auto_ptr shell(gf.createLinearRing(coords.release())); +- geom = geom_ptr(gf.createPolygon(shell.release(), new std::vector)); ++ std::auto_ptr shell(gf->createLinearRing(coords.release())); ++ geom = geom_ptr(gf->createPolygon(shell.release(), new std::vector)); + if (!geom->isValid()) { + if (excludepoly) { + throw std::runtime_error("Excluding broken polygon."); +@@ -123,7 +123,7 @@ + } else { + if (coords->getSize() < 2) + throw std::runtime_error("Excluding degenerate line."); +- geom = geom_ptr(gf.createLineString(coords.release())); ++ geom = geom_ptr(gf->createLineString(coords.release())); + wkt->area = 0; + } + +@@ -149,8 +149,8 @@ + + geometry_builder::maybe_wkts_t geometry_builder::get_wkt_split(const osmNode *nodes, int count, int polygon, double split_at) const + { +- GeometryFactory gf; +- std::auto_ptr coords(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); ++ GeometryFactory::unique_ptr gf = GeometryFactory::create(); ++ std::auto_ptr coords(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); + WKTWriter writer; + //TODO: use count to get some kind of hint of how much we should reserve? + maybe_wkts_t wkts(new std::vector); +@@ -166,8 +166,8 @@ + + geom_ptr geom; + if (polygon && (coords->getSize() >= 4) && (coords->getAt(coords->getSize() - 1).equals2D(coords->getAt(0)))) { +- std::auto_ptr shell(gf.createLinearRing(coords.release())); +- geom = geom_ptr(gf.createPolygon(shell.release(), new std::vector)); ++ std::auto_ptr shell(gf->createLinearRing(coords.release())); ++ geom = geom_ptr(gf->createPolygon(shell.release(), new std::vector)); + if (!geom->isValid()) { + if (excludepoly) { + throw std::runtime_error("Excluding broken polygon."); +@@ -189,7 +189,7 @@ + + double distance = 0; + std::auto_ptr segment; +- segment = std::auto_ptr(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); ++ segment = std::auto_ptr(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); + segment->add(coords->getAt(0)); + for(unsigned i=1; igetSize(); i++) { + const Coordinate this_pt = coords->getAt(i); +@@ -208,7 +208,7 @@ + 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 = geom_ptr(gf.createLineString(segment.release())); ++ geom_ptr geom = geom_ptr(gf->createLineString(segment.release())); + + //copy of an empty one should be cheapest + wkts->push_back(geometry_builder::wkt_t()); +@@ -216,7 +216,7 @@ + wkts->back().geom = writer.write(geom.get()); + wkts->back().area = 0; + +- 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 +@@ -234,7 +234,7 @@ + + // on the last iteration, close out the line. + if (i == coords->getSize()-1) { +- geom_ptr geom = geom_ptr(gf.createLineString(segment.release())); ++ geom_ptr geom = geom_ptr(gf->createLineString(segment.release())); + + //copy of an empty one should be cheapest + wkts->push_back(geometry_builder::wkt_t()); +@@ -242,7 +242,7 @@ + wkts->back().geom = writer.write(geom.get()); + wkts->back().area = 0; + +- segment.reset(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); ++ segment.reset(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); + } + } + } +@@ -264,8 +264,8 @@ + } + + int geometry_builder::parse_wkt(const char * wkt, struct osmNode *** xnodes, int ** xcount, int * polygon) { +- GeometryFactory gf; +- WKTReader reader(&gf); ++ GeometryFactory::unique_ptr gf = GeometryFactory::create(); ++ WKTReader reader(gf.get()); + std::string wkt_string(wkt); + Geometry * geometry; + const Geometry * subgeometry; +@@ -329,7 +329,7 @@ + geometry_builder::maybe_wkts_t geometry_builder::build_polygons(const osmNode * const * xnodes, const int *xcount, bool enable_multi, osmid_t osm_id) const + { + std::auto_ptr > lines(new std::vector); +- GeometryFactory gf; ++ GeometryFactory::unique_ptr gf = GeometryFactory::create(); + geom_ptr geom; + geos::geom::prep::PreparedGeometryFactory pgf; + +@@ -339,7 +339,7 @@ + try + { + for (int c=0; xnodes[c]; c++) { +- std::auto_ptr coords(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); ++ std::auto_ptr coords(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); + for (int i = 0; i < xcount[c]; i++) { + const osmNode *nodes = xnodes[c]; + Coordinate c; +@@ -348,13 +348,13 @@ + coords->add(c, 0); + } + if (coords->getSize() > 1) { +- geom = geom_ptr(gf.createLineString(coords.release())); ++ geom = geom_ptr(gf->createLineString(coords.release())); + lines->push_back(geom.release()); + } + } + + //geom_ptr segment(0); +- geom_ptr mline (gf.createMultiLineString(lines.release())); ++ geom_ptr mline (gf->createMultiLineString(lines.release())); + //geom_ptr noded (segment->Union(mline.get())); + LineMerger merger; + //merger.add(noded.get()); +@@ -371,8 +371,8 @@ + std::auto_ptr pline ((*merged ) [i]); + if (pline->getNumPoints() > 3 && pline->isClosed()) + { +- polys[totalpolys].polygon = gf.createPolygon(gf.createLinearRing(pline->getCoordinates()),0); +- polys[totalpolys].ring = gf.createLinearRing(pline->getCoordinates()); ++ polys[totalpolys].polygon = gf->createPolygon(gf->createLinearRing(pline->getCoordinates()),0); ++ polys[totalpolys].ring = gf->createLinearRing(pline->getCoordinates()); + polys[totalpolys].area = polys[totalpolys].polygon->getArea(); + polys[totalpolys].iscontained = 0; + polys[totalpolys].containedbyid = 0; +@@ -460,7 +460,7 @@ + } + } + +- Polygon* poly(gf.createPolygon(polys[i].ring, interior.release())); ++ Polygon* poly(gf->createPolygon(polys[i].ring, interior.release())); + poly->normalize(); + polygons->push_back(poly); + } +@@ -468,7 +468,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 == 0)) { + multipoly = geom_ptr(multipoly->buffer(0)); + } +@@ -526,7 +526,7 @@ + geometry_builder::maybe_wkt_t geometry_builder::build_multilines(const osmNode * const * xnodes, const int *xcount, osmid_t osm_id) const + { + std::auto_ptr > lines(new std::vector); +- GeometryFactory gf; ++ GeometryFactory::unique_ptr gf = GeometryFactory::create(); + geom_ptr geom; + + maybe_wkt_t wkt(new geometry_builder::wkt_t()); +@@ -534,7 +534,7 @@ + try + { + for (int c=0; xnodes[c]; c++) { +- std::auto_ptr coords(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); ++ std::auto_ptr coords(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); + for (int i = 0; i < xcount[c]; i++) { + const osmNode *nodes = xnodes[c]; + Coordinate c; +@@ -543,13 +543,13 @@ + coords->add(c, 0); + } + if (coords->getSize() > 1) { +- geom = geom_ptr(gf.createLineString(coords.release())); ++ geom = geom_ptr(gf->createLineString(coords.release())); + lines->push_back(geom.release()); + } + } + + //geom_ptr segment(0); +- geom_ptr mline (gf.createMultiLineString(lines.release())); ++ geom_ptr mline (gf->createMultiLineString(lines.release())); + //geom_ptr noded (segment->Union(mline.get())); + + WKTWriter writer; +@@ -571,7 +571,7 @@ + int enable_multi, double split_at, osmid_t osm_id) const + { + std::auto_ptr > lines(new std::vector); +- GeometryFactory gf; ++ GeometryFactory::unique_ptr gf = GeometryFactory::create(); + geom_ptr geom; + geos::geom::prep::PreparedGeometryFactory pgf; + maybe_wkts_t wkts(new std::vector); +@@ -580,7 +580,7 @@ + try + { + for (int c=0; xnodes[c]; c++) { +- std::auto_ptr coords(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); ++ std::auto_ptr coords(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); + for (int i = 0; i < xcount[c]; i++) { + const osmNode *nodes = xnodes[c]; + Coordinate c; +@@ -589,13 +589,13 @@ + coords->add(c, 0); + } + if (coords->getSize() > 1) { +- geom = geom_ptr(gf.createLineString(coords.release())); ++ geom = geom_ptr(gf->createLineString(coords.release())); + lines->push_back(geom.release()); + } + } + + //geom_ptr segment(0); +- geom_ptr mline (gf.createMultiLineString(lines.release())); ++ geom_ptr mline (gf->createMultiLineString(lines.release())); + //geom_ptr noded (segment->Union(mline.get())); + LineMerger merger; + //merger.add(noded.get()); +@@ -612,8 +612,8 @@ + std::auto_ptr pline ((*merged ) [i]); + if (make_polygon && pline->getNumPoints() > 3 && pline->isClosed()) + { +- polys[totalpolys].polygon = gf.createPolygon(gf.createLinearRing(pline->getCoordinates()),0); +- polys[totalpolys].ring = gf.createLinearRing(pline->getCoordinates()); ++ polys[totalpolys].polygon = gf->createPolygon(gf->createLinearRing(pline->getCoordinates()),0); ++ polys[totalpolys].ring = gf->createLinearRing(pline->getCoordinates()); + polys[totalpolys].area = polys[totalpolys].polygon->getArea(); + polys[totalpolys].iscontained = 0; + polys[totalpolys].containedbyid = 0; +@@ -629,13 +629,13 @@ + //std::cerr << "polygon(" << osm_id << ") is no good: points(" << pline->getNumPoints() << "), closed(" << pline->isClosed() << "). " << writer.write(pline.get()) << std::endl; + double distance = 0; + std::auto_ptr segment; +- segment = std::auto_ptr(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); ++ segment = std::auto_ptr(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); + segment->add(pline->getCoordinateN(0)); + for(unsigned i=1; igetNumPoints(); i++) { + segment->add(pline->getCoordinateN(i)); + distance += pline->getCoordinateN(i).distance(pline->getCoordinateN(i-1)); + if ((distance >= split_at) || (i == pline->getNumPoints()-1)) { +- geom_ptr geom = geom_ptr(gf.createLineString(segment.release())); ++ geom_ptr geom = geom_ptr(gf->createLineString(segment.release())); + + //copy of an empty one should be cheapest + wkts->push_back(geometry_builder::wkt_t()); +@@ -643,7 +643,7 @@ + wkts->back().geom = writer.write(geom.get()); + wkts->back().area = 0; + +- 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(i)); + } +@@ -730,7 +730,7 @@ + } + } + +- Polygon* poly(gf.createPolygon(polys[i].ring, interior.release())); ++ Polygon* poly(gf->createPolygon(polys[i].ring, interior.release())); + poly->normalize(); + polygons->push_back(poly); + } +@@ -738,7 +738,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 == 0)) { + multipoly = geom_ptr(multipoly->buffer(0)); + } diff --git a/release.nix b/release.nix index c141d50..d9b8ea5 100644 --- a/release.nix +++ b/release.nix @@ -30,7 +30,7 @@ with (import { inherit supportedSystems midpix.slibtool = import ./midipix.nix; r6d.geos = import ./geos.nix; - r6d.osm2pgsql = import ./osm2pgsql.nix; + r6d.osm2pgsql = import ./osm2pgsql/default.nix; } /* // { # Simply assign a derivation to an attribute to have it built. hello_world_1 = pkgs_x86_64_linux.hello;