XDL Manual

XDL MapView 활용 세번째

(piXoneer XDL Tutorial)

 

 

 

 

 

 

이 문서는 XDL Development Library

 설치 및 사용하기 위한 문서입니다.

 

2017. 01.

 

 

목차

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 2010을 실행한다.

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

1.1.3     [새 프로젝트] 대화상자에서 왼쪽의 템플릿 창에서 “Visual C#”을 선택하고, 대화상자 중간의 목록에서 “Windows Forms 응용 프로그램을 선택한다. 프로젝트의 이름을 입력하고 [새 프로젝트] 대화상자의 확인버튼을 클릭한다.

 

프로젝트 이름은 Visual Studio가 생성하는 이름으로 기본으로 하겠다. 이 문서에서는 대화상자 오른쪽 아래에 있는 솔루션용 디렉토리 만들기는 선택하지 않겠다.

확인버튼을 누르면 프로젝트가 기본적으로 생성되고, 화면에 Form을 디자인할 수 있는 화면이 뜬다. 만약 아래와 같이 Form 디자인화면이 생성되지 않으면, [솔루션 탐색기] 창에서 “Form1.cs”를 마우스 더블클릭을 하여 디자인화면을 연다.

1.1.4     [도구상자] [항목선택]을 선택한다.

[도구 상자] 창의 일반에서 마우스 오른쪽 버튼을 클릭하여 생성되는 팝업메뉴에서 항목 선택메뉴를 선택한다.

메뉴를 선택하면 아래와 같이 [도구 상자 항목 선택] 대화상자가 나타나며, 대화상자 아래쪽에 있는 찾아보기버튼을 클릭한다.

열기 대화상자에서 “C:\Pixoneer\XDL1.2\bin\NXMap.dll” 파일을 선택한 후 열기를 클릭하고, [도구 상자 항목 선택] 대화상자의 확인버튼을 클릭한다.

 

.Net Framework 구성요소 탭에 다양한 레이어와 NXMapView가 설정된다. “확인”버튼을 클릭한다.

 

 [도구상자] 에 다양한 MapLayer들과 NXMapView가 추가됨을 확인한다.

 

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

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

 

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

 

1.2    메뉴 생성하기

1.2.1      [도구상자]  MenuStrip을 선택하고 Form1의 상단부에 드래그하여 위치시킨다.

 

1.2.2      메뉴에 File – Open을 입력하여 생성한다.

 

1.3    NXMapView컨트롤 올리기

1.3.1     [도구상자]-[일반]에서 NXMapView를 드래그하여 Form1에 올려 놓는다. NXMapView컨트롤의 [부모컨테이너에서 도킹]버튼을 눌러 도킹시킨다

.

1.3.2     NXMapLayerCompLink를 드래그 하여 NXMapView 컨트롤 위에 올려 놓는다.

 

1.3.3     [F5]키를 눌러 프로그램을 실행한다. 아래와 같이 NXMapView컨트롤이 존재하는 프로그램이 실행된다.

1.3.4      프로그램을 종료한다.

 

1.4    영상 열기 기능

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

 

private void OpenToolStripMenuItem_Click(object sender, EventArgs e)
{
}

 

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

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

 

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

public Form1()
{
    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 대화상자와 선택된 파일에 대한 XRSLoadFile객체를 생성한다.

 

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

    if (openFileDialog.ShowDialog() != DialogResult.OK) 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개체에 존재하는 XDMCompManager들을 꺼낸다. 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);
        newComp.Name = xrsFileInput1.FileName; // 파일 이름을 Compoiste이름으로 설정

        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]키를 눌러 프로그램을 실행한다. 왼쪽 마우스 버튼을 클릭한채로 좌우로 이동시킨다.