OGRGeometry* BuildMultiLine(OGRGeometry* geometry){ double simplify = 0.01; OGRPolygon* poly = dynamic_cast<OGRPolygon *>(geometry->Simplify(simplify)); while(poly == NULL){ simplify -= 0.001; poly = dynamic_cast<OGRPolygon *>(geometry->Simplify(simplify)); } Polygon skeleton = GeomToPoly(poly); if(skeleton.size() < 3) return NULL; if(skeleton.is_counterclockwise_oriented() == 0) { skeleton.reverse_orientation(); } std::cout << "\nSkeletonizing." << std::endl; SsPtr iss = CGAL::create_interior_straight_skeleton_2(skeleton); if(!iss.get()) IsValid(NULL, "No skeleton!"); std::cout << "Computed Skeleton." << std::endl; OGRLineString* line = NULL; // And finally append points to our shapefile double edge = 0; Ss::Halfedge_iterator vi = iss->halfedges_begin(); for(; vi != iss->halfedges_end(); ++vi){ OGRPoint point = OGRPoint(vi->vertex()->point().x(), vi->vertex()->point().y()); OGRPoint npoint = OGRPoint(vi->next()->vertex()->point().x(), vi->next()->vertex()->point().y()); OGRLineString segment = OGRLineString(); segment.addPoint(&point); segment.addPoint(&npoint); if(line == NULL) { line = new OGRLineString; } OGRLineString *tmp; ++edge; if(vi->vertex()->is_skeleton() && vi->next()->vertex()->is_skeleton() && segment.Within(geometry)) { tmp = reinterpret_cast<OGRLineString *>(line->Union(&segment)); if(tmp != NULL) { std::cout << "\r" << (int) (edge / (double)iss->size_of_halfedges() * 100.0) << "% "; std::cout.flush(); delete line; line = tmp; } } } OGRGeometryFactory::destroyGeometry(poly); return line; }
void OGRSOSIDataSource::buildOGRMultiPoint(int nNumCoo, long iSerial) { if (papoBuiltGeometries[iSerial] != NULL) { return; } OGRMultiPoint *poMP = new OGRMultiPoint(); long i; double dfEast = 0, dfNorth = 0; for (i=(nNumCoo>1)?2:1; i<=nNumCoo; i++) { LC_GetTK(i, &dfEast, &dfNorth); OGRPoint poP = OGRPoint(dfEast, dfNorth); poMP->addGeometry(&poP); /*poP will be cloned before returning*/ } papoBuiltGeometries[iSerial] = poMP; }