| TerraLib 4.1

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files
- Examples

TePDIRaster2Vector_test.cpp

Shows how to use this class.

    #define TEAGN_ENABLE_STDOUT_LOG

    #include <TePDIExamplesBase.hpp>

    #include <TePDIParameters.hpp>
    #include <TeAgnostic.h>
    #include <TePDIUtils.hpp>
    #include <TePDIRaster2Vector.hpp>
    #include <TeInitRasterDecoders.h>

    #include <TeProgress.h>
    #include <TeStdIOProgress.h>

    #include <shapefil.h> // Needed by exportPS2SHP

    bool exportPS2SHP( const TePolygonSet& ps,
        const std::string& base_file_name  )
    {
        // creating files names
        std::string dbfFilename = base_file_name + ".dbf";
        std::string shpFilename = base_file_name + ".shp";

        // creating polygons attribute list ( max attribute size == 12 )
        TeAttributeList attList;

        TeAttribute at;
        at.rep_.type_ = TeSTRING;               //the id of the cell
        at.rep_.numChar_ = 10;
        at.rep_.name_ = "object_id_";
        at.rep_.isPrimaryKey_ = true;

        attList.push_back(at);

        /* DBF output file handle creation */

        DBFHandle hDBF = DBFCreate( dbfFilename.c_str() );
        TEAGN_TRUE_OR_RETURN( ( hDBF != 0 ), "DBF file creation error" );

        /* Writing attributes */

        TeAttributeList::iterator it=attList.begin();
        while ( it != attList.end() )
        {
          TeAttribute at = (*it);
          string atName = at.rep_.name_;

          // *OBS****atributos podem ter no maximo 12 caracteres
          // max attribute size == 12
          if (at.rep_.type_ == TeSTRING )
          {
            TEAGN_TRUE_OR_THROW(
              ( DBFAddField( hDBF, atName.c_str(), FTString, at.rep_.numChar_, 0 )
               != -1 ), "Error writing TeSTRING attribute" );
          }
          else if (at.rep_.type_ == TeINT)
          {
            TEAGN_TRUE_OR_THROW(
              ( DBFAddField( hDBF, atName.c_str(), FTInteger, 10, 0 ) != -1 ),
              "Error writing TeINT attribute" );
          }
          else if (at.rep_.type_ == TeREAL)
          {
            TEAGN_TRUE_OR_THROW(
              ( DBFAddField( hDBF, atName.c_str(), FTDouble, 10, 5 ) != -1 ),
              "Error writing TeREAL attribute" );

          }
          else if (at.rep_.type_ == TeDATETIME)
          {
            TEAGN_TRUE_OR_THROW(
              ( DBFAddField( hDBF, atName.c_str(), FTDate, 8, 0 ) != -1 ),
              "Error writing TeDATETIME attribute" );
          }

          ++it;
        }

        /* SHP output file handle creation */

        SHPHandle hSHP = SHPCreate( shpFilename.c_str(), SHPT_POLYGON );
        if( hSHP == 0 ) {
          TEAGN_LOGERR( "DBF file creation error" );
          DBFClose( hDBF );
          return false;
        }

        /* Writing polygons */

        int iRecord = 0;
        int totpoints = 0;
        double  *padfX, *padfY;
        SHPObject       *psObject;
        int posXY, npoints, nelem;
        int nVertices;
        int* panParts;

        TePolygonSet::iterator itps;
        TePolygon poly;

        for (itps = ps.begin() ; itps != ps.end() ; itps++ ) {
          poly=(*itps);
          totpoints = 0;
          nVertices = poly.size();
          for (unsigned int n=0; n<poly.size();n++) {
            totpoints += poly[n].size();
          }

          panParts = (int *) malloc(sizeof(int) * nVertices);
          padfX = (double *) malloc(sizeof(double) * totpoints);
          padfY = (double *) malloc(sizeof(double) * totpoints);
          posXY = 0;
          nelem = 0;

          for (unsigned int l=0; l<poly.size(); ++l) {
            if (l==0) {
              if (TeOrientation(poly[l]) == TeCOUNTERCLOCKWISE) {
                TeReverseLine(poly[l]);
              }
            } else {
              if (TeOrientation(poly[l]) == TeCLOCKWISE) {
                TeReverseLine(poly[l]);
              }
            }

            npoints = poly[l].size();
            panParts[nelem]=posXY;

            for (int m=0; m<npoints; m++ ) {
              padfX[posXY] = poly[l][m].x_;
              padfY[posXY] = poly[l][m].y_;
              posXY++;
            }

            nelem++;
          }

          psObject = SHPCreateObject( SHPT_POLYGON, -1, nelem, panParts, NULL,
            posXY, padfX, padfY, NULL, NULL );

          int shpRes = SHPWriteObject( hSHP, -1, psObject );
          TEAGN_TRUE_OR_THROW( ( shpRes != -1 ),
            "Unable to create a shape write object" )

          SHPDestroyObject( psObject );
          free( panParts );
          free( padfX );
          free( padfY );

          // writing attributes - same creation order
          for (unsigned int j=0; j<attList.size();j++) {
            if ( attList[j].rep_.type_ == TeSTRING ) {
              DBFWriteStringAttribute(hDBF, iRecord, j, poly.objectId().c_str() );
            } /*else if ( attList[j].rep_.type_ == TeINT) {
              DBFWriteIntegerAttribute(hDBF, iRecord, j,  VALOR INT );
            } else if ( attList[j].rep_.type_ == TeREAL) {
              DBFWriteDoubleAttribute(hDBF, iRecord, j,  VALOR DOUBLE);
            } else if ( attList[j].rep_.type_ == TeDATETIME) {
              TeTime time =  VALOR DATA;
              char dd[8];
              sprintf(dd,"%04d%02d%02d",time.year(),time.month(),time.day());
              DBFWriteDateAttribute(hDBF, iRecord, j, dd );
            }*/
          }

          iRecord++;
        }

        DBFClose( hDBF );
        SHPClose( hSHP );

        return true;
    }

    TePDITypes::TePDIRasterPtrType generateTestRaster()
    {
      TeRasterParams RAMRaster_params;
      RAMRaster_params.nBands( 1 );
      RAMRaster_params.setDataType( TeUNSIGNEDLONG );
      RAMRaster_params.setDummy( 0, -1 );
      RAMRaster_params.setNLinesNColumns( 100, 100 );

      TePDITypes::TePDIRasterPtrType RAMRaster;
      TEAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( RAMRaster,
        RAMRaster_params, false ), "RAM Raster Alloc error" );

      int line = 0;
      int col = 0;

      /* Area 1 */

      for( line = 10 ; line < 20; ++line ) {
        for( col = 10 ; col < 20 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 10.0, 0 ), "Raster fill error" );
        }
      }

      /* Area 1 dummy hole */

      for( line = 13 ; line < 18; ++line ) {
        for( col = 13 ; col < 18 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 0.0, 0 ), "Raster fill error" );
        }
      }

      /* Area 2 */

      for( line = 10 ; line < 20; ++line ) {
        for( col = 30 ; col < 40 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 20.0, 0 ), "Raster fill error" );
        }
      }

      /* Area 2 hole */

      for( line = 13 ; line < 18; ++line ) {
        for( col = 33 ; col < 38 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 10.0, 0 ), "Raster fill error" );
        }
      }

      /* Area 3 */

      for( line = 10 ; line < 20; ++line ) {
        for( col = 50 ; col < 60 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 30.0, 0 ), "Raster fill error" );
        }
      }

      /* Area 4 */

      for( line = 0 ; line < 9; ++line ) {
        for( col = 70 ; col < 100 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 40.0, 0 ), "Raster fill error" );
        }
      }

      for( line = 0 ; line < 40; ++line ) {
        for( col = 90 ; col < 100 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 40.0, 0 ), "Raster fill error" );
        }
      }

      for( line = 30 ; line < 40; ++line ) {
        for( col = 70 ; col < 100 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 40.0, 0 ), "Raster fill error" );
        }
      }

      for( line = 20 ; line < 30; ++line ) {
        for( col = 70 ; col < 80 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 40.0, 0 ), "Raster fill error" );
        }
      }

      /* Area 5 */

      for( line = 50 ; line < 90; ++line ) {
        for( col = 10 ; col < 90 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 50.0, 0 ), "Raster fill error" );
        }
      }

      /* Area 6 */

      for( line = 60 ; line < 70; ++line ) {
        for( col = 20 ; col < 30 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 10.0, 0 ), "Raster fill error" );
        }
      }

      /* Area 7 */

      for( line = 60 ; line < 70; ++line ) {
        for( col = 40 ; col < 50 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 20.0, 0 ), "Raster fill error" );
        }
      }

      /* Area 8 */

      for( line = 60 ; line < 70; ++line ) {
        for( col = 60 ; col < 70 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 30.0, 0 ), "Raster fill error" );
        }
      }

      /* Area 9 */

      for( line = 70 ; line < 80; ++line ) {
        for( col = 20 ; col < 70 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 0.0, 0 ), "Raster fill error" );
        }
      }

      /* Area 10 */

      for( line = 95 ; line < 100; ++line ) {
        for( col = 95 ; col < 100 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 60.0, 0 ), "Raster fill error" );
        }
      }

      /* Area 11 */

      for( line = 0 ; line < 5; ++line ) {
        for( col = 0 ; col < 5 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 60.0, 0 ), "Raster fill error" );
        }
      }

      /* Area 12 */

      for( line = 95 ; line < 100; ++line ) {
        for( col = 0 ; col < 5 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 60.0, 0 ), "Raster fill error" );
        }
      }

      /* Area 13 */

      for( line = 40 ; line < 43; ++line ) {
        for( col = 10 ; col < 13 ; ++col ) {
          TEAGN_TRUE_OR_THROW(
            RAMRaster->setElement( col, line, 60.0, 0 ), "Raster fill error" );
        }
      }

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 11, 39, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 13, 41, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 11, 43, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 9, 41, 60.0, 0 ), "Raster fill error" );

      /* Area 14 */

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 31, 39, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 31, 40, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 31, 41, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 31, 42, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 31, 43, 60.0, 0 ), "Raster fill error" );

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 29, 41, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 30, 41, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 31, 41, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 32, 41, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 33, 41, 60.0, 0 ), "Raster fill error" );

      /* Area 15 */

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 42, 39, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 46, 39, 60.0, 0 ), "Raster fill error" );

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 43, 40, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 45, 40, 60.0, 0 ), "Raster fill error" );

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 44, 41, 60.0, 0 ), "Raster fill error" );

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 43, 42, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 45, 42, 60.0, 0 ), "Raster fill error" );

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 42, 43, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 46, 43, 60.0, 0 ), "Raster fill error" );

      /* Area 16 */

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 55, 39, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 56, 40, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 57, 41, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 58, 42, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 59, 43, 60.0, 0 ), "Raster fill error" );

      /* Area 17 */

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 10, 30, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 11, 29, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 12, 28, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 13, 27, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 14, 26, 60.0, 0 ), "Raster fill error" );

      /* Area 18 */

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 10, 2, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 11, 2, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 9, 3, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 10, 3, 60.0, 0 ), "Raster fill error" );

      /* Area 19 */

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 15, 2, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 16, 2, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 16, 3, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 17, 3, 60.0, 0 ), "Raster fill error" );

      /* Area 20 */

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 20, 2, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 20, 3, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 21, 3, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 21, 4, 60.0, 0 ), "Raster fill error" );

      /* Area 20 */

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 25, 3, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 25, 4, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 26, 3, 60.0, 0 ), "Raster fill error" );
      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 26, 2, 60.0, 0 ), "Raster fill error" );

      /* Line 1 */

      for( line = 35 ; line < 55; ++line ) {
        TEAGN_TRUE_OR_THROW(
          RAMRaster->setElement( 85, line, 200.0, 0 ), "Raster fill error" );
      }

      /* Line 2 */

      for( col = 25 ; col < 45; ++col ) {
        TEAGN_TRUE_OR_THROW(
          RAMRaster->setElement( col, 65, 10.0, 0 ), "Raster fill error" );
      }

      /* Points */

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 55, 15, 250.0, 0 ), "Raster fill error" );

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 55, 5, 251.0, 0 ), "Raster fill error" );

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 15, 15, 251.0, 0 ), "Raster fill error" );

      TEAGN_TRUE_OR_THROW(
        RAMRaster->setElement( 35, 15, 0, 0 ), "Raster fill error" );

      return RAMRaster;
    }

    void Raster2Vector_test()
    {
      TePDITypes::TePDIRasterPtrType RAMRaster = generateTestRaster();

      TEAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( RAMRaster,
        TEPDIEXAMPLESBINPATH "Raster2Vector_test.tif" ), "GeoTIF generation error" );

      TePDITypes::TePDIPolSetMapPtrType output_polsets(
        new TePDITypes::TePDIPolSetMapType );

      TePDIParameters params2;
      params2.SetParameter( "rotulated_image", RAMRaster );
      params2.SetParameter( "channel", (unsigned int)0 );
      params2.SetParameter( "output_polsets", output_polsets );
      params2.SetParameter( "max_pols", (unsigned long int)200 );

      TePDIRaster2Vector raster2Vector;

      TEAGN_TRUE_OR_THROW( raster2Vector.Reset( params2 ),
        "Invalid Parameters for raster2Vector" );

      TEAGN_TRUE_OR_THROW( raster2Vector.Apply(),
        "Apply error" );

      TePDITypes::TePDIPolSetMapType::iterator it = output_polsets->begin();
      TePDITypes::TePDIPolSetMapType::iterator it_end = output_polsets->end();

      unsigned int pols_number = 0;

      while( it != it_end ) {
        TEAGN_TRUE_OR_THROW( exportPS2SHP( it->second, TEPDIEXAMPLESBINPATH "Raster2Vector_test_ps" +
          Te2String( (int)it->first ) ),  "Polygonset export error" )

        pols_number += it->second.size();

        ++it;
      }

      TEAGN_CHECK_EPS( output_polsets->size(), 9, 0.0,
        "Invalid generated polygon set size" );
      TEAGN_CHECK_EPS( pols_number, 41, 0.0,
        "Invalid generated polygon set size" );

    }

    int main()
    {
      TEAGN_LOGMSG( "Test started." );

      try{
        TeStdIOProgress pi;
        TeProgress::setProgressInterf( dynamic_cast< TeProgressBase* >( &pi ) );

        TeInitRasterDecoders();

        Raster2Vector_test();
      }
      catch( const TeException& e ){
        TEAGN_LOGERR( "Test Failed - " + e.message() );
        return EXIT_FAILURE;
      }

      TEAGN_LOGMSG( "Test OK." );
      return EXIT_SUCCESS;
    }

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines