Example #1
0
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;
}