고도 경사 방향등으로 산정, 산록, 산복 면을 구합니다...소스에서 일부함수는 그냥 보세요...
이건 산림청의 지형분석후 임도 분석, 적지적수 분석과 산사태, 수계흐름 방향 표시 등등에 사용합니다.
참조 파일은 예를 든 내용이니 참조하십시요
{
//중심점, 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;
![]()
