WPF – XDL Tutorial

XDL MapView 활용 네번째

(piXoneer XDL Tutorial)

 

 

 

 

 

 

 NXMapView를 활용하여 여러장의 Tif파일을

 도시하는 기능을 구현합니다.

 

 

2019. 04.

 

 

목차

XDL MapView 활용 네번째... 1

1    사용하기... 1

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

1.2    Driver복사하기... 1

1.3    메뉴 생성하기... 1

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

1.5    영상 열기 기능... 1

 

 

 

 

1     사용하기

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

 

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

1.1.1     Visual Studio 2015을 실행한다.

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

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

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

 

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

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

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

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

1.2    Driver복사하기

Driver는 현재 데모 버전에서는 설치된 경로로부터 실행 경로 하부로 직접 복사하여 넣어야 한다. 차기 버전은 복사를 하지 않아도 실행될 수 있도록 구성된다.

 

1.2.1     XDL 라이브러리가 설치된 경로(C:\Pixoneer\XDL1.2\bin)로 이동한다.

 

1.2.2     IODrivers폴더를 통째로 복사하여 현재 프로젝트의 “…..\XDL_MapView4\bin\Debug”폴더 하부에 복사하여 넣는다.

1.2.3     F5키를 눌러 프로그램을 실행하면 다음과 같이 구성된다.

 

1.3    메뉴 생성하기

1.3.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.4    NXMapView컨트롤 추가하기

1.4.1     Grid 레이아웃 내부에서 두 번째 CellGrid를 배치한다. WindowsFormsHost 컨트롤을 도구상자로부터 끌어서 생성하거나 XAML 창에 입력하여 생성한다. 이는 Window formsHosting 해주는 개체이며 Window Forms Control을 사용할 때 이용된다. (WindowFormIntegrationSystem.Window.Forms을 어셈블리에 대한 참조 추가를 한다.)

1.4.2     앞서 추가한 namespacenxMap를 이용하여 NXMapView컨트롤을 불러온다. NXMapView의 이름은 nxMapView1으로 한다.

 

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

 

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

 

 

1.4.4      프로그램을 종료한다.

 

1.5    영상 열기 기능

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

 

 

private void openFileMenuItem_Click(object sender, RoutedEventArgs e)
{

}

 

1.5.2     View 구현시 필요한 XRasterIO객체를 선언한다.

public XRasterIO m_RasterIO;    //영상의 입출력을 담당할 객체 선언

 

1.5.3     Window생성자에서 XRasterIO의 객체 생성 및 NXMapLayerComposites에 대한 속성을 변경시킨다.

public MainWindow()
{
    InitializeComponent();
    String StrError;
    m_RasterIO = new XRasterIO();   // 객체 생성
    if (m_RasterIO.Initialize(out StrError) == false)  // 영상 입출력 객체 초기화
    {
         MessageBox.Show(StrError);
    }
    nxMapLayerComposite1.LayerVisible = true;   // 영상레이어를 보이도록 속성을 변경
}

 

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

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

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

    string strFilePath = openFileDialog.FileName;

    // FileDriverManger를 통해 XRSLoadFile를 생성한다.
    // Tiff를 직접 로딩하는 경우 영상 크기가 큰 경우 도시 속도를 위해서 
// LOD가 필요하기 때문에 필요한 경우 같은 폴더에 .xdl 파일을 생성한다.
    string strError;
    XRSLoadFile xrsFileInput1 = m_RasterIO.LoadFile(strFilePath, out strError,
 false, eIOCreateXLDMode.All_NoMsg);
    if (xrsFileInput1 == null) return;

    // 다시 Original Imange에 대한 Composite와 Processed Image에 대한 Composite를
// 생성하여 뷰 컨트롤에 도시한다.
    XDMComposite newComp = CreateComposite(xrsFileInput1, 0, 1, 2);

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

    // nxMapLayerCompostie1개체에 존재하는 XDMCompManager들을 꺼낸다.
    // XDMCompManager가 실제로 Composite들의 관리를 수행한다.
    XDMCompManager xdmCompManager = nxMapLayerComposite1.GetXDMCompManager();

    // 생성된 Compostie를 XDMCompManager에 추가한다.
    xdmCompManager.AddXDMComposite(ref newComp);

    // 전체 화면 보기를 설정한다.
    nxMapLayerComposite1.ZoomFit();

    // 화면 업데이트를 수행한다.
    nxMapLayerComposite1.Invalidate();

    // Lock을 다시 풀어 준다.
    nxMapLayerComposite1.UnLock();
}

 

XDMComposite CreateComposite(XRSLoadFile xrsFileInput, int nBandIdx0, int nBandIdx1, int nBandIdx2)
{
     // XDMComposite를 생성한다.
     XDMComposite newComp = new XDMComposite();

     // 로딩된 파일로부터 밴드의 개수가 칼라로 그릴 것인지 흑백으로 그릴 것인지 판단한다.
     // 만약 3개 미만인 경우에는 Gray모드로 그리고, 3개 이상인 경우는 칼라로 그린다.
     int nNumBand = xrsFileInput.NumBand;
     if (nNumBand < 3)   // 3개 미만의 밴드를 가지고 있는 경우
     {
          // Default로 0번째 밴드를 Gray 모드로 그린다.
          XDMBand band = xrsFileInput.GetBandAt(0);

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

          // Composite의 0번에 Band 설정, Gray 모드에서는 0번 밴드만을 인식한다.
          newComp.SetBand(ref band, nBandIdx0);
          // 영상 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 = xrsFileInput.GetBandAt(nBandIdx0);
          XDMBand band2 = xrsFileInput.GetBandAt(nBandIdx1);
          XDMBand band3 = xrsFileInput.GetBandAt(nBandIdx2);
// 파일 이름을 Composite이름으로 설정
          newComp.Name = xrsFileInput.FileName;

          newComp.Mode = eCompMode.RGB;  // RGB Mode로 그리는 것을 설정
          newComp.SetBand(ref band3, nBandIdx0);  // Composite의 0번에 Band설정,
 Blue Channel 설정
          newComp.SetBand(ref band2, nBandIdx1);  // Composite의 1번에 Band설정,                      
Green Channel 설정
          newComp.SetBand(ref band1, nBandIdx2);  // 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 객체에 추가한다.
         return newComp;
}

 

1.5.5     [F5]키를 눌러 프로그램을 실행하고 홈페이지에서 다운 받은 샘플영상을 실행시킨다. [File]-[Open]메뉴를 눌러 다운받은1.tif파일을 연다. 다시 [File]-[Open]메뉴를 눌러 2.tif파일을 연다.

모자이크 된 그림을 확인할 수 있다.