//helper function for funning triangulation void runVoronoi(const char *sitesWkt, const char *expectedWkt , const double tolerance) { WKTReader reader; WKTWriter writer; geos::triangulate::VoronoiDiagramBuilder builder; std::auto_ptr<Geometry> sites ( reader.read(sitesWkt) ); std::auto_ptr<Geometry> expected ( reader.read(expectedWkt) ); std::auto_ptr<GeometryCollection> results; GeometryFactory geomFact; builder.setSites(*sites); //set Tolerance: builder.setTolerance(tolerance); results = builder.getDiagram(geomFact); results->normalize(); expected->normalize(); ensure_equals(results->getCoordinateDimension(), expected->getCoordinateDimension()); bool eq = results->equalsExact(expected.get(), 1e-7); if ( ! eq ) { writer.setTrim(true); cout << endl; cout << " Expected: " << writer.write(expected.get()) << endl; cout << " Obtained: " << writer.write(results.get()) << endl; } ensure(eq); }
//helper function for funning triangulation void runDelaunay(const char *sitesWkt, bool computeTriangles, const char *expectedWkt) { WKTReader reader; std::auto_ptr<Geometry> results; Geometry *sites = reader.read(sitesWkt); Geometry *expected = reader.read(expectedWkt); DelaunayTriangulationBuilder builder; GeometryFactory geomFact; builder.setSites(*sites); if(computeTriangles) results=builder.getTriangles(geomFact); else results=builder.getEdges(geomFact); results->normalize(); expected->normalize(); ensure(results->equalsExact(expected, 1e-7)); ensure(results->getCoordinateDimension() == expected->getCoordinateDimension()); cout << "this is some text" << endl; delete sites; delete expected; }
int main(int /*argc*/, char** /*argv*/) { try { ofstream out("WKTOut"); ifstream in("WKTIn"); string instr; string outstr; WKTReader *r = new WKTReader(new GeometryFactory(new PrecisionModel(),10)); WKTWriter *w = new WKTWriter(); Geometry *g; cout << "Start Testing:" << endl; while(!in.eof()) { getline(in,instr); if (instr!="") { g=r->read(instr); outstr=w->write(g); out << "----------" << endl; out << instr << endl; out << outstr << endl; out << "----------" << endl << endl; } } out.flush(); out.close(); cout << "End of Testing" << endl; } catch (const GEOSException& ge) { cout << ge.what() << endl; } return 0; }
std::string mlsToMlp(const std::string &input1){ std::string result; WKTReader wktr; WKTWriter wktw; Geometry *mls = wktr.read(input1); // First we have to properly node the linestrings. Union makes this easy. Polygon *envelope = dynamic_cast<Polygon*>(mls->getEnvelope()); Geometry *nodedLineStrings = envelope->getExteriorRing()->Union(mls); // The polygonizer creates polygons out of the linework geos::operation::polygonize::Polygonizer polygonizer; polygonizer.add(nodedLineStrings); std::vector<Polygon*> *polygons = polygonizer.getPolygons(); // Annoyingly, we have to transform one vector type to another std::vector<Geometry*> geometries; for(int inx = 0; inx < polygons->size(); inx++){ geometries.push_back((*polygons)[inx]); } Geometry *mlp = GeometryFactory::getDefaultInstance()->createMultiPolygon(geometries); result = wktw.write(mlp); return result; }
std::vector<std::string> polygonize(const std::string &input1, const std::string &input2) { std::vector<std::string> result; WKTReader wktr; WKTWriter wktw; Geometry *line1 = wktr.read(input1); Geometry *line2 = wktr.read(input2); // Unioning the linestrings inserts nodes for polygonization Geometry *nodedLineStrings = line1->Union(line2); // Add additional lineStrings to each end to close them off LineString *ls1 = dynamic_cast<LineString*>(line1); LineString *ls2 = dynamic_cast<LineString*>(line2); Point *sp1 = ls1->getStartPoint(); Point *sp2 = ls2->getStartPoint(); Point *ep1 = ls1->getEndPoint(); Point *ep2 = ls2->getEndPoint(); Geometry *smallests = smallestSegment(sp1, ep1, sp2, ep2); nodedLineStrings = nodedLineStrings->Union(smallests); // Use GEOS to polygonize the strings geos::operation::polygonize::Polygonizer polygonizer; polygonizer.add(nodedLineStrings); std::vector<Polygon*> *polygons = polygonizer.getPolygons(); for(int inx = 0; inx < polygons->size(); inx++){ result.push_back(wktw.write((*polygons)[inx])); } return result; }
//helper function for funning triangulation void runVoronoi(const char *sitesWkt, const char *expectedWkt , const double tolerance) { WKTReader reader; WKTWriter writer; geos::triangulate::VoronoiDiagramBuilder builder; std::auto_ptr<Geometry> sites ( reader.read(sitesWkt) ); std::auto_ptr<Geometry> expected ( reader.read(expectedWkt) ); std::auto_ptr<GeometryCollection> results; GeometryFactory geomFact; builder.setSites(*sites); //set Tolerance: builder.setTolerance(tolerance); results = builder.getDiagram(geomFact); results->normalize(); expected->normalize(); ensure(results->equalsExact(expected.get(), 1e-7)); ensure(results->getCoordinateDimension() == expected->getCoordinateDimension()); }
GeomPtr readGeometry(const std::string& wkt) { GeomPtr g; if(wkt[0] == '0' || wkt[0] == '1') { WKBReader r; std::istringstream is(wkt); g.reset(r.readHEX(is)); } else { WKTReader r; g.reset(r.read(wkt)); } return g; }