XDL Manual

XDL MapView 활용 여섯번째

(piXoneer XDL Tutorial)

 

 

 

 

 

 

NXMapView를 활용하여 영상을 기반으로 하여

벡터 객체를 생성하는 기능을 구현합니다.

 

 

2017. 01.

수정 2019. 02.

 

 

목차

XDL MapView 활용 다섯번째... 1

1    사용하기... 1

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

1.2    Driver복사하기... 1

1.3    Config파일 설정하기... 1

1.4    메뉴에 배경맵 Show/Hide기능 넣기... 1

 

 

 

 

1     사용하기

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

 

1.1    메뉴에 Open/Save 기능 넣기

1.1.1     디자인창에서 Toolbar[File]-[Open XvcVector][File]-[Save XvcVector]를 입력한다. 또한 [Save XvcVector]메뉴 하부에 [Pixoneer XVML][External Vector Format]기능을 추가한다.

 

 

1.2    메뉴에 벡터 기능 넣기

1.2.1     상위 메뉴로 Vector를 입력하고 다음과 같이 메뉴를 구성한다.

 

 

1.3    참조 dll 추가하기

1.3.1     [참조추가] 기능을 통해 “C:\Pixoneer\XDL1.2\bin”으로 폴더를 이동하여 NXDLvc.dll를 선택하여 추가한다.

 

 

1.4    코드 추가하기

1.4.1     생성된 벡터를 저장하고 다시 열기 위한 XVectorIO객체를 생성한다.

namespace XDL_MapView1
{
public partial class Form1 : Form
{
public XRasterIO m_RasterIO;        //영상의 입출력을 담당할 객체 선언
public XVectorIO m_VectorIO;	  //벡터 객체의 입출력을 담당할 객체 선언

public Form1()
{

 

1.4.2     선언부에 벡터 객체를 핸들링하기 위해 using Pixoneer.NXDL.NVC;을 추가하고 생성자에 XMapLayerVectorEditor객체에 편집이 가능하도록 Editable속성을 true플래그로 설정하고, m_VectorIO객체를 생성 및 초기화 시킨다.

using Pixoneer.NXDL;        // 기본 함수 관련 기능
using Pixoneer.NXDL.NCC;    // 좌표 시스템 관련 기능
using Pixoneer.NXDL.NIO;    // 파일 입출력 관련 기능
using Pixoneer.NXDL.NRS;    // Remote Sensing 관련 기능
using Pixoneer.NXDL.NGR;    // Graphic관련 기능
using Pixoneer.NXDL.NVC;    // Vector 객체와 관련된 기능
using Pixoneer.NXDL.NXMap;  // MapView 관련 기능


public Form1()
{
    InitializeComponent();

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

    nxMapLayerComposites1.LayerVisible = true;

    if (!nxMapView1.SetBackgroundMap("C:\\Pixoneer\\XDL1.2\\Config\\XMapBase.xml"))
    {
        MessageBox.Show("배경맵이 설정되지 않았습니다.");
    }

    // 벡터 객체를 생성하고 편집하기 위해 
    nxMapLayerVectorEditor1.Editable = true;

    // 벡터를 저장하기 위해 벡터 IO객체를 생성
    m_VectorIO = new XVectorIO();
    if (m_VectorIO.Initialize(out StrError) == false)
        MessageBox.Show(StrError);
}

1.4.3     [Vector]툴바 하부에 Point, Line, Ellipse, Rectangle, PolyLine, Polygon, Text, TextBox의 메뉴를 더블클릭하고 자동 함수를 생성하여 다음과 같이 코드를 생성한다.

private void pointToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxMapLayerVectorEditor1.CreateNewOBJ(Pixoneer.NXDL.NVC.eXvcObjType.Point, null);
}

private void lineToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxMapLayerVectorEditor1.CreateNewOBJ(Pixoneer.NXDL.NVC.eXvcObjType.Line, null);
}

private void ellipseToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxMapLayerVectorEditor1.CreateNewOBJ(Pixoneer.NXDL.NVC.eXvcObjType.Ellipse, null);
}

private void rectangleToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxMapLayerVectorEditor1.CreateNewOBJ(Pixoneer.NXDL.NVC.eXvcObjType.Rectangle, null);
}

private void polyLineToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxMapLayerVectorEditor1.CreateNewOBJ(Pixoneer.NXDL.NVC.eXvcObjType.Polyline, null);
}

private void polygonToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxMapLayerVectorEditor1.CreateNewOBJ(Pixoneer.NXDL.NVC.eXvcObjType.Polygon, null);
}

private void textToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxMapLayerVectorEditor1.CreateNewOBJ(Pixoneer.NXDL.NVC.eXvcObjType.Text, null);
}

private void textBoxToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxMapLayerVectorEditor1.CreateNewOBJ(Pixoneer.NXDL.NVC.eXvcObjType.Textbox, null);
}

 

1.4.4     측정도구를 위해 MeasurePoint, MeasureDistance, MeasureArea, MeasureAngle 툴바를 더블 클릭하여 자동 코드를 생성하고 다음과 같이 코드를 삽입한다.

private void measurePointToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxMapLayerVectorEditor1.CreateNewOBJ(Pixoneer.NXDL.NVC.eXvcObjType.MeasurePoint, null);
}

private void measureDistanceToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxMapLayerVectorEditor1.CreateNewOBJ(Pixoneer.NXDL.NVC.eXvcObjType.MeasureDist, null);
}

private void measureAreaToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxMapLayerVectorEditor1.CreateNewOBJ(Pixoneer.NXDL.NVC.eXvcObjType.MeasureArea, null);
}

private void measureAngleToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxMapLayerVectorEditor1.CreateNewOBJ(Pixoneer.NXDL.NVC.eXvcObjType.MeasureAngle, null);
}

 

1.4.5     특정 객체를 마우스로 선택한다. [Vector]-[Property]버튼을 더블 클릭하여 코드를 생성한다.

private void propertyToolStripMenuItem_Click(object sender, EventArgs e)
{
    XvcObj Obj = nxMapLayerVectorEditor1.GetSelectedObj();
    if (Obj == null) return;

    ChangeProperty(Obj);
}



public void ChangeProperty(XvcObj Obj)
{
    // 선택된 객체가 null인 경우는 실행하지 않는다.
    if (Obj == null) {   return;  }

    eXvcObjType type = Obj.Type;

    // Property 창을 생성하고 기존 Object의 속성값을 Property창에 설정한다. 
    PropertyXvcObj propertyDlg  = new PropertyXvcObj();
    propertyDlg.m_strObjType    = type.ToString();
    propertyDlg.m_nID           = Obj.ID;
    propertyDlg.m_strName       = Obj.Name;
    propertyDlg.m_crBack        = Obj.ColorBack;
    propertyDlg.m_crFore        = Obj.ColorFore;
    propertyDlg.m_crLine        = Obj.ColorLine;
    propertyDlg.m_dblThick      = Obj.GetThick();
    propertyDlg.m_StyleFill     = Obj.StyleFill;
    propertyDlg.m_StyleLine     = Obj.StyleLine;
    propertyDlg.m_crText        = Obj.ColorText;


    // Object Type에 따라 속성값을 Property창에 설정한다.
    if (type == eXvcObjType.Text)
    {
        propertyDlg.m_dblFontSize   = ((XvcText)Obj).FontSize;
        propertyDlg.m_strFontName   = ((XvcText)Obj).FontName;
        propertyDlg.m_bBold         = ((XvcText)Obj).Bold;
        propertyDlg.m_bUnderline    = ((XvcText)Obj).Underline;
        propertyDlg.m_bItalic       = ((XvcText)Obj).Italic;
        propertyDlg.m_bStrikeOut    = ((XvcText)Obj).StrikeOut;
    }
    else if (type == eXvcObjType.Line)
    {
        propertyDlg.m_LineStartShape = ((XvcLine)Obj).StartShapeType;
        propertyDlg.m_LineEndShape = ((XvcLine)Obj).EndShapeType;
    }


    // Object Type에 따라 속성값을 Property창에 설정한다.
    if (propertyDlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        Obj.ID = propertyDlg.m_nID;
        Obj.Name = propertyDlg.m_strName;
        Obj.ColorBack = propertyDlg.m_crBack;
        Obj.ColorFore = propertyDlg.m_crFore;
        Obj.ColorLine = propertyDlg.m_crLine;
        Obj.SetThick(propertyDlg.m_dblThick);
        Obj.StyleFill = propertyDlg.m_StyleFill;
        Obj.StyleLine = propertyDlg.m_StyleLine;
        Obj.ColorText = propertyDlg.m_crText;

        // Object가 텍스트인경우 Text객체에 Property창에서 정의한 값을 설정한다.
        if (type == eXvcObjType.Text)
        {
            XvcText text = (XvcText)Obj;
            text.FontSize = propertyDlg.m_dblFontSize;
            text.FontName = propertyDlg.m_strFontName;
            text.Bold = propertyDlg.m_bBold;
            text.Underline = propertyDlg.m_bUnderline;
            text.Italic = propertyDlg.m_bItalic;
            text.StrikeOut = propertyDlg.m_bStrikeOut;
        }
        // Object가 Line인경우 Line객체에 Property창에서 정의한 값을 설정한다.
        else if (type == eXvcObjType.Line)
        {
            ((XvcLine)Obj).StartShapeType = propertyDlg.m_LineStartShape;
            ((XvcLine)Obj).EndShapeType = propertyDlg.m_LineEndShape;
        }

        this.nxMapView1.RefreshScreen();
    }
}

 

1.4.6     [F5]키를 눌러 프로그램을 실행한다. [Vector]-[Line], [Polygon]등을 누른 후 도시화면상에 마우스를 클릭 및 드래깅하여 객체를 생성한다.

 

1.4.7     프로그램을 종료한다.

 

1.4.8     FormView를 생성하여 Property창을 디자인한다. Property 창에 대한 코드는 생략한다. 샘플코드를 다운로드 후 참조한다.

 

1.4.9     [F5]키를 눌러 프로그램을 실행시킨다. 툴바의 [Vector]-[Line]를 눌러 라인을 하나 그린다.

 

1.4.10  특정 객체를 마우스로 선택한다. [Vector]-[Property]버튼을 누른다.

 

 

1.4.11  속성값을 변경 후 OK를 클릭한다.