고도 경사 방향등으로 산정, 산록, 산복 면을 구합니다...소스에서 일부함수는 그냥 보세요...
이건 산림청의 지형분석후 임도 분석, 적지적수 분석과 산사태, 수계흐름 방향 표시 등등에 사용합니다.
참조 파일은 예를 든 내용이니 참조하십시요

{
        //중심점, DEM레이어, 셀크기, 최소최대(15~45도)
 // 미세지형(fineLandType) 분석법
 // 사용인자 : 중심점 표고(elevCenter), 평균표고(elevAvr), 경사도(slope)
 // 하나의 셀에대한 미소지형분석값을 구하기위해 주위셀필요(3X3)
 // 분석방법 :
 // 1. elevDiff = 평균표고 - 중심표고 구한다.
 // 2. 경사도에 의한 구분을 먼저한다.
 //  2_1. slope < 15 && elevDiff < 0 : 산정면0
 //  2_2. slope < 15 && elevDiff > 0 : 산각퇴적면1
 //  2_3. slope >= 15 || slope < 45 : 산복면
 //  2_4. slope >= 45 : 산각침식면 2
 // 3. 산복면일 경우 다음과 같이 다시한번 세분화 한다.
 //  3_1. b = 셀크기*tan(경사도)/15 를 구한다. (b : elevDiff와 비교할 값)
 //  3_2. elevDiff < b : 산복 박스형3
 //  3_3. elevDiff >= b && elevDiff < 0 : 산복 볼록형4
 //  3_4. elevDiff >= b && elevDiff >= 0 : 산복 오목형5
 // 산정면 : 0,   산각퇴적면 : 1,  산각침식면 : 2,    산복박스형 : 3,   산복볼록형 : 4,   산복오목형 : 5
        //산정면: 0
        //산복면: 2,3,4
        //산록면: 1,5}

소스
function CalcFineLand (MapXCenter, MapYCenter : Double;
                       pIDem_Layer : ILayer; pIDemAnalysis : IDemAnalysis; StrSlope:string; m_nGrid, MinRange, MaxRange : double; var OrgCalcFineLand : double):Double;

var
    fineLandType : integer;
    elevDiff, b, elevCenter, elevAvr, slope, fx1, fy1, fx2, fy2, halfCellsize : double;
    z1,z2,z3,z4 : double;
begin
    //result := -1;
    //if pIDemAnalysis  = nil  then exit;

    //경사 ???
    m_nGrid := m_nGrid * 2; halfCellsize := m_nGrid;// halfCellsize := (m_nGrid) /2;
    //Slope := pIDemAnalysis.GetSlope(MapXCenter, MapYCenter);
    //Slope := Max(GetAngleSlope( DPoint(Z1, 0), DPoint(Z4, sqrt(2*(m_nGrid*m_nGrid))) ), GetAngleSlope( DPoint(Z2, 0), DPoint(Z3, sqrt(2*(m_nGrid*m_nGrid))) ) );
    //Slope := (GetAngleSlope( DPoint(Z1, 0), DPoint(Z4, sqrt(2*(m_nGrid*m_nGrid))) ) + GetAngleSlope( DPoint(Z2, 0), DPoint(Z3, sqrt(2*(m_nGrid*m_nGrid))) ) )/2;
    Slope := GetCellAngleSlope(pIDem_Layer, MapXCenter, MapYCenter, m_nGrid, StrSlope);

    //1.경사도에 의한 구분을 먼저한다.
    // 산정면 : 0,   산각퇴적면 : 1,  산각침식면 : 2,    산복박스형 : 3,   산복볼록형 : 4,   산복오목형 : 5
    //fineLandType := -1;
    if(slope >= MaxRange) then begin
      fineLandType := 2
    end
    else begin
       //Calc elevAvr
       fx1 := MapXCenter-halfCellsize;
       fy1 := MapYCenter-halfCellsize;
       fx2 := MapXCenter+halfCellsize;
       fy2 := MapYCenter+halfCellsize;
       z1 := pIDemAnalysis.GetElevation(fx1,fy1);
       z2 := pIDemAnalysis.GetElevation(fx1,fy2);
       z3 := pIDemAnalysis.GetElevation(fx2,fy1);
       z4 := pIDemAnalysis.GetElevation(fx2,fy2);
       elevAvr := (z1 + z2 + z3 + z4)/4.0;
       elevCenter := pIDemAnalysis.GetElevation(MapXCenter, MapYCenter);
       //표고차 = 평균표고 - 중심표고 구한다.
       elevDiff := elevAvr - elevCenter;
       /////
       if(slope < MinRange) then begin //if(slope < 20) then begin //
         if( elevDiff < 0 ) then fineLandType := 0     // elevDiff < elevCenter
         else fineLandType := 1;
       end
       else begin
         //b := m_nGrid * tan(slope*PI/180.0) / MinRange;
         b := m_nGrid * tan(slope*PI/180.0) / 15.0;
         if( elevDiff < b ) then fineLandType := 3
         else begin
              if (elevDiff < 0.0) then fineLandType := 4
              else fineLandType := 5;
         end;
       end;
    end;

    //2.산정면: 0  산복면: 2,3,4  산록면: 1,5
    OrgCalcFineLand := fineLandType;
    case fineLandType of
         0 : result := 0;
         2,3,4 : result := 1;
         1, 5 : result := 2;
    else
         result := -1;
    end;
end;


profile