//--------------------------------------------------------- double CRGA_Basic::Get_Similarity(int x, int y, int Segment) { CSG_Table_Record *pSeed; if( is_InGrid(x, y) && (pSeed = m_pSeeds->Get_Record(Segment)) != NULL ) { int i; double a, b, Result; switch( m_Method ) { //------------------------------------------------- case 0: // feature space and position for(i=0, a=0.0; i<m_nFeatures; i++) { a += SG_Get_Square(Get_Feature(x, y, i) - pSeed->asDouble(SEEDFIELD_Z + i)); } b = SG_Get_Square(x - pSeed->asDouble(SEEDFIELD_X)) + SG_Get_Square(y - pSeed->asDouble(SEEDFIELD_Y)); Result = a / m_Var_1 + b / m_Var_2; break; //------------------------------------------------- case 1: // feature space for(i=0, a=0.0; i<m_nFeatures; i++) { a += SG_Get_Square(Get_Feature(x, y, i) - pSeed->asDouble(SEEDFIELD_Z + i)); } Result = a / m_Var_1; break; } return( 1.0 / (1.0 + Result) ); // from 'distance' to 'similarity' !!! // return( exp(-0.5 * Result) ); } return( -1.0 ); }
//--------------------------------------------------------- bool CRGA_Basic::On_Execute(void) { bool bRefresh; int x, y, i, Segment; CSG_Grid *pSeeds; //----------------------------------------------------- m_pSegments = Parameters("SEGMENTS" )->asGrid(); m_pFeatures = Parameters("FEATURES" )->asGridList(); m_nFeatures = m_pFeatures->Get_Count(); pSeeds = Parameters("SEEDS" )->asGrid(); m_pSeeds = Parameters("TABLE" )->asTable(); m_pSimilarity = Parameters("SIMILARITY")->asGrid(); m_dNeighbour = Parameters("NEIGHBOUR" )->asInt() == 0 ? 2 : 1; m_Var_1 = SG_Get_Square(Parameters("SIG_1")->asDouble()); m_Var_2 = SG_Get_Square(Parameters("SIG_2")->asDouble()); m_Threshold = Parameters("THRESHOLD" )->asDouble(); m_bNormalize = Parameters("NORMALIZE" )->asBool(); m_Method = Parameters("METHOD" )->asInt(); bRefresh = Parameters("REFRESH" )->asBool(); //----------------------------------------------------- m_pSegments ->Assign(-1); m_pSegments ->Set_NoData_Value(-1); m_pSimilarity ->Assign(-1); m_pSimilarity ->Set_NoData_Value(-1); //----------------------------------------------------- m_pSeeds->Destroy(); m_pSeeds->Add_Field(_TL("ID" ), SG_DATATYPE_Int); m_pSeeds->Add_Field(_TL("AREA"), SG_DATATYPE_Double); m_pSeeds->Add_Field(_TL("X" ), SG_DATATYPE_Double); m_pSeeds->Add_Field(_TL("Y" ), SG_DATATYPE_Double); for(i=0; i<m_pFeatures->Get_Count(); i++) { m_pSeeds->Add_Field(m_pFeatures->asGrid(i)->Get_Name(), SG_DATATYPE_Double); } m_Candidates.Create(Parameters("LEAFSIZE")->asInt()); //----------------------------------------------------- for(y=0; y<Get_NY() && Set_Progress(y); y++) { for(x=0; x<Get_NX(); x++) { if( !pSeeds->is_NoData(x, y) ) { CSG_Table_Record *pRec = m_pSeeds->Add_Record(); pRec->Set_Value(0, m_pSeeds->Get_Count() - 1); pRec->Set_Value(SEEDFIELD_X, x); pRec->Set_Value(SEEDFIELD_Y, y); for(i=0; i<m_pFeatures->Get_Count(); i++) { pRec->Set_Value(SEEDFIELD_Z + i, Get_Feature(x, y, i)); } m_pSimilarity->Set_Value(x, y, 1.0); Add_To_Segment(x, y, m_pSeeds->Get_Count() - 1); } } } //----------------------------------------------------- if( m_pSeeds->Get_Count() > 1 ) { sLong n = 0; while( n++ < Get_NCells() && Set_Progress_NCells(n) && Get_Next_Candidate(x, y, Segment) ) { Add_To_Segment(x, y, Segment); if( bRefresh && (n % Get_NX()) == 0 ) { DataObject_Update(m_pSegments, 0, m_pSeeds->Get_Count()); Process_Set_Text(CSG_String::Format(SG_T("%.2f"), 100.0 * m_Candidates.Get_Count() / Get_NCells())); } } m_Candidates.Destroy(); return( true ); } //----------------------------------------------------- m_Candidates.Destroy(); return( false ); }
//--------------------------------------------------------- bool CParam_Scale::On_Execute(void) { //----------------------------------------------------- bool bConstrain; int Index[6]; double zScale, Tol_Slope, Tol_Curve; CSG_Matrix Normal; //----------------------------------------------------- bConstrain = Parameters("CONSTRAIN")->asBool(); zScale = Parameters("ZSCALE" )->asDouble(); if( zScale <= 0.0 ) { zScale = 1.0; } Tol_Slope = Parameters("TOL_SLOPE")->asDouble(); Tol_Curve = Parameters("TOL_CURVE")->asDouble(); m_pDEM = Parameters("DEM" )->asGrid(); //----------------------------------------------------- CSG_Grid *pFeature = Parameters("FEATURES" )->asGrid(); CSG_Grid *pElevation = Parameters("ELEVATION")->asGrid(); CSG_Grid *pSlope = Parameters("SLOPE" )->asGrid(); CSG_Grid *pAspect = Parameters("ASPECT" )->asGrid(); CSG_Grid *pProfC = Parameters("PROFC" )->asGrid(); CSG_Grid *pPlanC = Parameters("PLANC" )->asGrid(); CSG_Grid *pLongC = Parameters("LONGC" )->asGrid(); CSG_Grid *pCrosC = Parameters("CROSC" )->asGrid(); CSG_Grid *pMiniC = Parameters("MINIC" )->asGrid(); CSG_Grid *pMaxiC = Parameters("MAXIC" )->asGrid(); //----------------------------------------------------- if( !Get_Weights() ) { return( false ); } if( !Get_Normal(Normal) ) { return( false ); } // To constrain the quadtratic through the central cell, ignore the calculations involving the // coefficient f. Since these are all in the last row and column of the matrix, simply redimension. if( !SG_Matrix_LU_Decomposition(bConstrain ? 5 : 6, Index, Normal.Get_Data()) ) { return( false ); } //----------------------------------------------------- for(int y=0; y<Get_NY() && Set_Progress(y); y++) { #pragma omp parallel for for(int x=0; x<Get_NX(); x++) { CSG_Vector Observed; double elevation, slope, aspect, profc, planc, longc, crosc, minic, maxic; if( Get_Observed(x, y, Observed, bConstrain) && SG_Matrix_LU_Solve(bConstrain ? 5 : 6, Index, Normal, Observed.Get_Data()) ) { Get_Parameters(zScale, Observed.Get_Data(), elevation, slope, aspect, profc, planc, longc, crosc, minic, maxic); GRID_SET_VALUE(pFeature , Get_Feature(slope, minic, maxic, crosc, Tol_Slope, Tol_Curve)); GRID_SET_VALUE(pElevation, elevation + m_pDEM->asDouble(x, y)); // Add central elevation back GRID_SET_VALUE(pSlope , slope); GRID_SET_VALUE(pAspect , aspect); GRID_SET_VALUE(pProfC , profc); GRID_SET_VALUE(pPlanC , planc); GRID_SET_VALUE(pLongC , longc); GRID_SET_VALUE(pCrosC , crosc); GRID_SET_VALUE(pMiniC , minic); GRID_SET_VALUE(pMaxiC , maxic); } else { GRID_SET_NODATA(pFeature); GRID_SET_NODATA(pElevation); GRID_SET_NODATA(pSlope); GRID_SET_NODATA(pAspect); GRID_SET_NODATA(pProfC); GRID_SET_NODATA(pPlanC); GRID_SET_NODATA(pLongC); GRID_SET_NODATA(pCrosC); GRID_SET_NODATA(pMiniC); GRID_SET_NODATA(pMaxiC); } } } //----------------------------------------------------- CSG_Parameter *pLUT = DataObject_Get_Parameter(pFeature, "LUT"); if( pLUT && pLUT->asTable() ) { pLUT->asTable()->Del_Records(); LUT_SET_CLASS(FLAT , _TL("Planar" ), SG_GET_RGB(180, 180, 180)); LUT_SET_CLASS(PIT , _TL("Pit" ), SG_GET_RGB( 0, 0, 0)); LUT_SET_CLASS(CHANNEL, _TL("Channel" ), SG_GET_RGB( 0, 0, 255)); LUT_SET_CLASS(PASS , _TL("Pass (saddle)"), SG_GET_RGB( 0, 255, 0)); LUT_SET_CLASS(RIDGE , _TL("Ridge" ), SG_GET_RGB(255, 255, 0)); LUT_SET_CLASS(PEAK , _TL("Peak" ), SG_GET_RGB(255, 0, 0)); DataObject_Set_Parameter(pFeature, pLUT); DataObject_Set_Parameter(pFeature, "COLORS_TYPE", 1); // Color Classification Type: Lookup Table } //----------------------------------------------------- DataObject_Set_Colors(pSlope , 11, SG_COLORS_YELLOW_RED); DataObject_Set_Colors(pAspect, 11, SG_COLORS_ASPECT_3); DataObject_Set_Colors(pProfC , 11, SG_COLORS_RED_GREY_BLUE, true); DataObject_Set_Colors(pPlanC , 11, SG_COLORS_RED_GREY_BLUE, false); DataObject_Set_Colors(pLongC , 11, SG_COLORS_RED_GREY_BLUE, true); DataObject_Set_Colors(pCrosC , 11, SG_COLORS_RED_GREY_BLUE, true); DataObject_Set_Colors(pMiniC , 11, SG_COLORS_RED_GREY_BLUE, true); DataObject_Set_Colors(pMaxiC , 11, SG_COLORS_RED_GREY_BLUE, true); //----------------------------------------------------- return( true ); }