WPF - XDL Tutorial

XDL MapView 활용 세번째

(piXoneer XDL Tutorial)

 

 

 

 

 

 NXMapView를 이용하여 Original Image와 필터링된 결과를

중첩시켜 Swap하는 기능을 구현합니다.

 

 

2019. 04.

 

 

목차

XDL MapView 활용 세번째... 1

1    사용하기... 1

1.1    NXMapView 이용한 예제 프로그램 만들기... 1

1.2    메뉴 생성하기... 1

1.3    NXMapView컨트롤 올리기... 1

1.4    영상 열기 기능... 1

 

 

 

 

1     사용하기

본 튜터리얼을 공부하기 전에 먼저 XDL MapView 활용 첫번째를 먼저 선행하시기 바랍니다.

 

1.1    NXMapView를 이용한 예제 프로그램 만들기

1.1.1     Visual Studio 2015을 실행한다.

1.1.2     메뉴 [파일]-[새로 만들기]-[프로젝트]를 선택한다.

 

 

1.1.3     [새 프로젝트] 대화상자에서 왼쪽의 템플릿 창에서 “Visual C#”을 선택하고, 대화상자 중간의 목록에서 “WPF 응용 프로그램을 선택한다.

사용자가 원하는 경로를 선택한 다음 프로젝트 이름을 “XDL_MapView3” 으로 입력하고 [새 프로젝트] 대화상자의 확인버튼을 클릭한다. 이 문서에서는 대화상자 오른쪽 아래에 있는 “솔루션용 디렉터리 만들기”는 선택하지 않겠다. “확인” 버튼을 누르면 프로젝트가 기본적으로 생성되고, 화면에 Window을 디자인할 수 있는 화면이 뜬다. 만약 아래와 같은 Window 창이 생성되지 않으면, [솔루션 탐색기] 창에서 MainWindow.xaml”를 마우스 더블클릭을 하여 창을 연다.

 

 

1.1.4     솔루션 탐색기의 프로젝트 하부의 [참조]의 오른쪽 마우스 클릭을 통해 [참조추가]를 선택한다

 

 

1.1.5     솔루션 탐색기의 프로젝트 하부의 [참조]의 오른쪽 마우스 클릭을 통해 [참조추가]를 선택한다.

1.1.6     [찾아보기]탭으로 이동한 후 “C:\Pixoneer\XDL1.2\bin\”경로로 이동한다. Ctrl키를   
누른 채 연속으로 “NXDL.dll, NXDLcc.dll, NXDLgr.dll, NXDLio.dll, NXDLrs.dll, “NXMap.dll”을 선택한 후 “확인”버튼을 선택한다.

 

1.1.7     솔루션 탐색기의 프로젝트 하부의 [참조]항에 NXDL, NXDLcc, NXDLgr, NXDLio, NXDLrs, NXMap가 추가되었음을 확인한다.

1.1.8     MapView컨트롤을 활용하기 위해 MainWindow.xaml 창에서 namespace를 다음과 같이 추가한다.

 

 

1.2    메뉴 생성하기

1.2.1      MainWindow.xaml창에서 기본으로 생성된 Grid 레이아웃에 Grid.RowDefinition을 이용하여 두 개의 Row을 생성한다. Menu를 첫 번째 Cell에 배치하고 MenuItem 항목을 추가하고 표를 참고하여 [File]-[Open]을 입력하여 생성한다. (메뉴 생성에 대한 자세한 설명은 XDL MapView1을 참고한다.)

 

 

Control Type

Header

Name

MenuItem

_File

 

MenuItem

_Open

openFileMenuItem

 

메뉴를 생성하면 다음과 같은 XAML 창이 얻음을 알 수 있다.

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="30"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <Menu Grid.Row="0">
        <MenuItem Header="_File" Margin="5,5,0,0">
        <MenuItem x:Name="openFileMenuItem" Header="_Open"/>
</MenuItem>
    </Menu>
</Grid>

1.3    NXMapView컨트롤 추가하기

1.3.1     두 번째 CellGrid를 배치하고 WindowsFormsHost 컨트롤을 배치한다. 이 컨트롤은 Window formsHosting 해주는 개체이며 Window Forms Control을 이용할 때 사용된다. (WindowFormIntegrationSystem.Window.Forms 을 어셈블리에 대한 참조 추가를 한다.)

1.3.2     Grid 레이아웃에 WindowFormsHost를 입력하고 앞서 추가한 namespacenxMap를 이용하여 NXMapView컨트롤을 불러온다. NXMapView의 이름은 nxMapView1으로 한다.

<Grid Grid.Row="1">
       <WindowsFormsHost  Margin="3,0,3,3">
           <nxMap:NXMapView x:Name="nxMapView1">
                  
</nxMap:NXMapView>
       </WindowsFormsHost>
</Grid>

.

1.3.3     NXMapLayerCompLink를 추가하여 NXMapView 컨트롤 위에 올려 놓는다.

NXMapLayerCompLink는 동시에 동일한 뷰에서 2개의 컴퍼지트를 비교하여 도시할 수 있도록 하는 컨트롤이다.

<Grid Grid.Row="1">
       <WindowsFormsHost  Margin="3,0,3,3">
           <nxMap:NXMapView x:Name="nxMapView1">
               <nxMap:NXMapView.Controls>
                  <nxMap:NXMapLayerCompLink x:Name="nxMapLayerCompLink1"/>
               </nxMap:NXMapView.Controls>
</nxMap:NXMapView>
       </WindowsFormsHost>
</Grid>

 

 

1.3.4     [F5]키를 눌러 프로그램을 실행한다.

 

 

1.4    영상 열기 기능

1.4.1     XAML창에서 [File]-[Open]을 더블 클릭하여 함수를 자동 생성한다.

 

 

private void openFileButton_Click(object sender, RoutedEventArgs e)
{

}

 

1.4.2     LinkView 구현시 필요한 XRSLoadFileXRasterIO객체를 선언한다.

public XRasterIO m_RasterIO;       //영상의 입출력을 담당할 객체 선언
XRSLoadFile xrsFileInput1 = null; // 영상 디스플레이용 파일 객체 선언
XRSLoadFile xrsFileInput2 = null; // 영상 처리용 파일 객체 생성

 

1.4.3     Window생성자에서 XRasterIO의 객체 생성 및 NXMapLayerCompLink에 대한 속성을 변경한다.

public MainWindow()
{
     InitializeComponent();

     String StrError;
     m_RasterIO = new XRasterIO();  // 객체 생성
     if (m_RasterIO.Initialize(out StrError) == false)  // 영상 입출력 객체 초기화
     {
         MessageBox.Show(StrError);
     }

     nxMapLayerCompLink1.LayerVisible = true;  // 영상레이어를 보이도록 속성을 변경
     nxMapLayerCompLink1.LayoutMode = 
NXMapLayerCompLink.eLayoutMode.Horizontal;
     nxMapLayerCompLink1.FrontAlpha = 1.0F;
}

 

1.4.4     [File]–[Open] 버튼을 눌렀을 때 생성될 Open 대화상자와 선택된 파일에 대한 XRSLoadFile객체를 생성한다.

private void openFileButton_Click(object sender, RoutedEventArgs e)
{
      // 1. 파일 Open을 수행한다.
      OpenFileDialog openFileDialog = new OpenFileDialog();
      openFileDialog.Filter = "XDM file(*.xdm)|*.XDM||";
      openFileDialog.RestoreDirectory = true;

      Nullable<bool> result = openFileDialog.ShowDialog();
      if (result != true) return;
      string strFilePath = openFileDialog.FileName;

      // 2. FileDriverManger를 통해 XRSLoadFile을 생성한다.
      string strError;
      xrsFileInput1 = m_RasterIO.LoadFile(strFilePath, out strError, false,
 eIOCreateXLDMode.All_NoMsg);
      xrsFileInput2 = m_RasterIO.LoadFile(strFilePath, out strError, false, 
eIOCreateXLDMode.All_NoMsg);
      if (xrsFileInput1 == null || xrsFileInput2 == null) return;

      // 3. 기존에 생성되어 있는 Composite가 있으면 Lock을 걸어 도시 수행을 잠시 멈춘다.
      nxMapLayerCompLink1.Lock();

      // 4. nxMapLayerCompLink1 개체에 존재하는 XDMCompManger들을 꺼낸다. 
// XDMCompManager가 실제로 Composite들의 관리를 수행한다.
      XDMCompManager xdmCompManager1 = 
nxMapLayerCompLink1.GetXDLCompManager1();
      XDMCompManager xdmCompManager2 = 
nxMapLayerCompLink1.GetXDLCompManager2();

      // 5. 기존에 Composite가 존재한다면 모두 삭제한다.
      for (int i = 0; i < xdmCompManager1.NumComp; i++)
      {
          XDMComposite comp = xdmCompManager1.GetXDMCompositeAt(i);
          comp.Dispose();
      }
      xdmCompManager1.RemoveXDMCompositeAll();

      for (int i = 0; i < xdmCompManager2.NumComp; i++ )
      {
           XDMComposite comp = xdmCompManager2.GetXDMCompositeAt(i);
           comp.Dispose();
      }
      xdmCompManager2.RemoveXDMCompositeAll();

      // 6. 다시 Original Image에 대한 Composite와 Processed Image에 대한
// Composite를 생성하여 뷰컨트롤에 도시한다.
      GenOriginalImageComposite();
      GenProcessedImageComposite();
      // 7. 전체 화면 보기를 설정한다.
      nxMapLayerCompLink1.ZoomFit();
      // 8. 화면 업데이트를 수행한다.
      nxMapLayerCompLink1.Invalidate();
      // 9. Lock을 다시 풀어 준다.
      nxMapLayerCompLink1.UnLock();
}

 

이어서 아래의 코드를 추가한다.

void GenOriginalImageComposite()
{
    // XDMComposite를 생성한다. .
    XDMComposite newComp = new XDMComposite();
    // 로딩된 파일로부터 밴드의 개수가 칼라로 그릴 것인지 흑백으로 그릴 것인지를 판단한다.
    // 만약 3개 미만인 경우는 Gray모드로 그리고, 3개 이상인 경우는 칼라로 그린다.
    int nNumBand = xrsFileInput1.NumBand;
    if (nNumBand < 3)   // 3개 미만의 밴드를 가지고 있는 경우
    {
        // Default로 0번째 밴드를 Gray모드로 그린다. 
        XDMBand band = xrsFileInput1.GetBandAt(0);
        // Gray Mode로 그리는 것을 설정
        newComp.Mode = eCompMode.Gray;
        // Composite의 0번에 Band설정, Gray모드에서는 0번 밴드만을 인식한다. 
        newComp.SetBand(ref band, 0);
        // 영상 Enhancement를 위해 Histogram의 범위 설정(정규분포 95% 영역)
        newComp.SetCutType(eCompCutType.Ct95, 0);
        // 영상 Enhancement를 위해 Histogram적용시 전체 영역에 대한 
// Histogram(Band)설정, Visible은 현재 영역
        newComp.SetStretchCoverage(eCompStretchCoverage.Band, 0);
        // 영상 Enhancement를 위해 Histogram의 Stretch형태 설정(Gaussian으로 설정)
        newComp.SetStretchType(eCompStretchType.Gaussian, 0);
    }
    else // 3개 이상의 밴드를 가지고 있는 경우 
    {
        XDMBand band1 = xrsFileInput1.GetBandAt(0);
        XDMBand band2 = xrsFileInput1.GetBandAt(1);
        XDMBand band3 = xrsFileInput1.GetBandAt(2);
// 파일 이름을 Composite이름으로 설정
        newComp.Name = xrsFileInput1.FileName; 

        newComp.Mode = eCompMode.RGB;  // RGB Mode로 그리는것을 설정
        newComp.SetBand(ref band3, 0); // Composite의 0번에 Band설정,
Blue Channel설정 
        newComp.SetBand(ref band2, 1); // Composite의 1번에 Band설정, 
Green Channel설정
        newComp.SetBand(ref band1, 2); // Composite의 2번에 Band설정, 
Red Channel설정
        for (int i = 0; i < 3; i++)
        {
            // 영상 Enhancement를 위해 Histogram의 범위 설정(정규분포 95% 영역)
            newComp.SetCutType(eCompCutType.Ct95, i);
            // 영상 Enhancement를 위해 Histogram적용시 전체 영역에 대한 
// Histogram(Band)설정, Visible은 현재 영역
            newComp.SetStretchCoverage(eCompStretchCoverage.Band, i);
            // 영상 Enhancement를 위해 Histogram의 Stretch형태 설정(Gaussian으로 설정)
            newComp.SetStretchType(eCompStretchType.Gaussian, i);
        }
     }
    // Composite를 저장하기 위하여 첫번째 XDMCompManager를 꺼낸다.
    XDMCompManager xdmCompManager = nxMapLayerCompLink1.GetXDLCompManager1();

    // 생성된 Composite를 XDMCompManger객체에 추가한다.        
    xdmCompManager.AddXDMComposite(ref newComp);
}

 

void GenProcessedImageComposite()
{
    if (xrsFileInput2 == null) return;

    XBandParamSpatialFilter param = new XBandParamSpatialFilter();
    param.SrcBand = xrsFileInput2.GetBandAt(0); // 영상처리를 위한 Source Band 설정
    param.FilterMethod = eSpatialFilterMethod.Average;  // 필터 설정
    param.KernelSize = 3;                    // Filter의 커널 사이즈 설정

    // XDMBandSpatialFiter 밴드를 생성하고 입력 변수를 설정
    XDMBandSpatialFilter bandSF = new XDMBandSpatialFilter();
    bandSF.SetInputParam(ref param);

    // XDMComposite를 생성한다. .
    XDMComposite newComp = new XDMComposite();

    // Spatial Filter 밴드를 Gray모드로 그린다. 
    XDMBand band = bandSF;

    // 밴드 이름을 그대로 Composite이름으로 설정
    newComp.Name = band.BandName;

    // Gray Mode로 그리는것을 설정
    newComp.Mode = eCompMode.Gray;

    // Composite의 0번에 Band설정, Gray모드에서는 0번 밴드만을 인식한다. 
    newComp.SetBand(ref band, 0);
    // 영상 Enhancement를 위해 Histogram의 범위 설정(정규분포 95% 영역)
    newComp.SetCutType(eCompCutType.Ct95, 0);
    // 영상 Enhancement를 위해 실시간 영상처리는 반드시 Visible로 설정
    newComp.SetStretchCoverage(eCompStretchCoverage.Visible, 0);
    // 영상 Enhancement를 위해 Histogram의 Stretch형태 설정(Gaussian으로 설정)
    newComp.SetStretchType(eCompStretchType.Gaussian, 0);

    // 생성된 Composite를 XDMCompManger객체에 추가한다. 
    XDMCompManager xdmCompManager = nxMapLayerCompLink1.GetXDLCompManager2();
    xdmCompManager.AddXDMComposite(ref newComp);
}

 

1.4.5     [F5]키를 눌러 프로그램을 실행한다. 왼쪽 마우스 버튼을 클릭한 채로 좌우로 이동시킨다.