int main (int argc, const char * argv[]) { if (argc < 2 || argc > 3 || strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0) { std::cout << "=== prepair Help ===\n" << std::endl; std::cout << "Usage: triface 'POLYGON(...)'" << std::endl; std::cout << "OR" << std::endl; std::cout << "Usage: triface -f infile.txt (infile.txt must contain one WKT on the 1st line)" << std::endl; return 0; } // Read input unsigned int bufferSize = 10000000; char *inputWKT = (char *)malloc(bufferSize*sizeof(char *)); for (int argNum = 1; argNum < argc; ++argNum) { if (strcmp(argv[argNum], "-f") == 0) { if (argNum + 1 <= argc - 1 && argv[argNum+1][0] != '-') { std::ifstream infile(argv[argNum+1], std::ifstream::in); infile.getline(inputWKT, bufferSize); ++argNum; } else { std::cerr << "Error: Missing input file name." << std::endl; return 1; } } else strcpy(inputWKT, argv[argNum]); } // std::cout << "Processing: " << inputWKT << std::endl; OGRGeometry *geometry; OGRGeometryFactory::createFromWkt(&inputWKT, NULL, &geometry); if (geometry == NULL) { std::cout << "Error: WKT is not valid" << std::endl; return 1; } if (geometry->getGeometryType() != wkbPolygon25D) { std::cout << "Error: input geometry is not a 3D polygon" << std::endl; return 1; } //-- project to proper plane + get flattened geometry int proj = get_projection_plane(geometry); OGRGeometry *flatgeom = geometry->clone(); if (proj == 1) { OGRPolygon *polygon = (OGRPolygon *)flatgeom; for (int curp = 0; curp < polygon->getExteriorRing()->getNumPoints(); ++curp) polygon->getExteriorRing()->setPoint(curp, polygon->getExteriorRing()->getX(curp), polygon->getExteriorRing()->getZ(curp), 0); for (int currentRing = 0; currentRing < polygon->getNumInteriorRings(); ++currentRing) { for (int curp = 0; curp < polygon->getInteriorRing(currentRing)->getNumPoints(); ++curp) polygon->getInteriorRing(currentRing)->setPoint(curp, polygon->getInteriorRing(currentRing)->getX(curp), polygon->getInteriorRing(currentRing)->getZ(curp), 0); } } else if (proj == 0) { OGRPolygon *polygon = (OGRPolygon *)geometry; for (int curp = 0; curp < polygon->getExteriorRing()->getNumPoints(); ++curp) polygon->getExteriorRing()->setPoint(curp, polygon->getExteriorRing()->getY(curp), polygon->getExteriorRing()->getZ(curp), 0); for (int currentRing = 0; currentRing < polygon->getNumInteriorRings(); ++currentRing) { for (int curp = 0; curp < polygon->getInteriorRing(currentRing)->getNumPoints(); ++curp) polygon->getInteriorRing(currentRing)->setPoint(curp, polygon->getInteriorRing(currentRing)->getY(curp), polygon->getInteriorRing(currentRing)->getZ(curp), 0); } } flatgeom->flattenTo2D(); // std::cout << "geom: " << geometry->getCoordinateDimension() << std::endl; // std::cout << "flatgeom: " << flatgeom->getCoordinateDimension() << std::endl; //-- check if flattened geometry is valid if (flatgeom->IsValid() == FALSE) { std::cout << "Error: input polygon is not valid." << std::endl; return 1; } if (proj == 2) { Triangulationxy triangulation; triangulateandtag_xy(geometry, triangulation); for (Triangulationxy::Finite_faces_iterator currentFace = triangulation.finite_faces_begin(); currentFace != triangulation.finite_faces_end(); ++currentFace) { std::cout << "--triangle--" << std::endl; Point p = currentFace->vertex(0)->point(); std::cout << p.x() << ", " << p.y() << ", " << p.z() << std::endl; p = currentFace->vertex(1)->point(); std::cout << p.x() << ", " << p.y() << ", " << p.z() << std::endl; p = currentFace->vertex(2)->point(); std::cout << p.x() << ", " << p.y() << ", " << p.z() << std::endl; } } else if (proj == 1) { Triangulationxz triangulation; triangulateandtag_xz(geometry, triangulation); for (Triangulationxz::Finite_faces_iterator currentFace = triangulation.finite_faces_begin(); currentFace != triangulation.finite_faces_end(); ++currentFace) { std::cout << "--triangle--" << std::endl; Point p = currentFace->vertex(0)->point(); std::cout << p.x() << ", " << p.y() << ", " << p.z() << std::endl; p = currentFace->vertex(1)->point(); std::cout << p.x() << ", " << p.y() << ", " << p.z() << std::endl; p = currentFace->vertex(2)->point(); std::cout << p.x() << ", " << p.y() << ", " << p.z() << std::endl; } } else { //-- proj == 0 Triangulationyz triangulation; triangulateandtag_yz(geometry, triangulation); for (Triangulationyz::Finite_faces_iterator currentFace = triangulation.finite_faces_begin(); currentFace != triangulation.finite_faces_end(); ++currentFace) { std::cout << "--triangle--" << std::endl; Point p = currentFace->vertex(0)->point(); std::cout << p.x() << ", " << p.y() << ", " << p.z() << std::endl; p = currentFace->vertex(1)->point(); std::cout << p.x() << ", " << p.y() << ", " << p.z() << std::endl; p = currentFace->vertex(2)->point(); std::cout << p.x() << ", " << p.y() << ", " << p.z() << std::endl; } } return 0; }