WPF - XDL Tutorial

XDL MapView È°¿ë ¿©¼¸¹ø°

(piXoneer XDL Tutorial)

 

 

 

 

 

 

NXMapView¸¦ È°¿ëÇÏ¿© ¿µ»óÀ» ±â¹ÝÀ¸·Î ÇÏ¿©

º¤ÅÍ °´Ã¼¸¦ »ý¼ºÇÏ´Â ±â´ÉÀ» ±¸ÇöÇÕ´Ï´Ù.

 

 

2019. 04.

 

 

³»¿ë

XDL MapView È°¿ë ¿©¼¸¹ø°... 1

1    »ç¿ëÇϱâ... 1

1.1    ¸Þ´º¿¡ Open/Save ±â´É ³Ö±â... 1

1.2    ¸Þ´º¿¡ º¤ÅÍ ±â´É ³Ö±â... 1

1.3    ÂüÁ¶ dll Ãß°¡Çϱâ... 1

1.4    ÄÚµå Ãß°¡Çϱâ... 1

 

 

 

 

1     »ç¿ëÇϱâ

º» Æ©Å͸®¾óÀ» °øºÎÇϱâ Àü¿¡ ¸ÕÀú ¡°XDL MapView È°¿ë ´Ù¼¸¹ø°¡±¸¦ ¸ÕÀú ¼±ÇàÇϽñ⠹ٶø´Ï´Ù.

 

1.1    ¸Þ´º¿¡ Open/Save ±â´É ³Ö±â

1.1.1     Window â¿¡ MenuItemÀ» ÀÌ¿ëÇÏ¿© [File]-[Open XvcVector]¿Í [File]-[Save XvcVector] ¸Þ´º¸¦ Ãß°¡ÇÑ´Ù. ¶ÇÇÑ [Save XvcVector] ¸Þ´º ÇϺο¡ [Pixoneer XVML]°ú [External Vector Format] ¸Þ´º¸¦ Ãß°¡ÇÑ´Ù. (Ç¥ Âü°í)

 

 

 

Control Type

Header

Name

MenuItem

_Open XVcVector

openVectorFileMenuItem

 

Control Type

Header

Name

MenuItem

_Save XvcVector

 

MenuItem

_Pixoneer XVML

pixoneerXVMLFileMenuItem

MenuItem

_External Vector Format

externalVectorFormatFileMenuItem

 

1.2    ¸Þ´º¿¡ º¤ÅÍ ±â´É ³Ö±â

1.2.1     »óÀ§ ¸Þ´º·Î Vector¸¦ ÀÔ·ÂÇÏ°í ´ÙÀ½°ú °°ÀÌ ¸Þ´º¸¦ ±¸¼ºÇÑ´Ù. (Ç¥ Âü°í)

 

 

Control Type

Header

Name

MenuItem

_Vector

 

MenuItem

_Point

pointVectorMenuItem

MenuItem

_Line

lineVectorMenuItem

MenuItem

_Ellipse

ellipseVectorMenuItem

MenuItem

_Rectangle

rectangleVectorMenuItem

MenuItem

_PlolyLine

polyLineVectorMenuItem

MenuItem

_Polygon

polygonVectorMenuItem

MenuItem

_Text

textVectorMenItem

MenuItem

_Text Box

textBoxVectorMenuItem

MenuItem

_Measure

 

MenuItem

_MeasurePoint

measurePointVectorMenuItem

MenuItem

_MeasureDistance

measureDistanceVectorMenuItem

MenuItem

_MeasureArea

measureAreaVectorMenuItem

MenuItem

_MeasureAngle

measureAngleVectorMenuItem

MenuItem

_Property

propertyVectorMenuItem

 

1.3    ÂüÁ¶ dll Ãß°¡Çϱâ

1.3.1     [ÂüÁ¶Ãß°¡] ±â´ÉÀ» ÅëÇØ ¡°C:\Pixoneer\XDL1.2\bin¡±À¸·Î Æú´õ¸¦ À̵¿ÇÏ¿© NXDLvc.dll¸¦ ¼±ÅÃÇÏ¿© Ãß°¡ÇÑ´Ù.

 

 

1.4    ÄÚµå Ãß°¡Çϱâ

1.4.1     »ý¼ºµÈ º¤Å͸¦ ÀúÀåÇÏ°í ´Ù½Ã ¿­±â À§ÇÑ XVectorIO°´Ã¼¸¦ »ý¼ºÇÑ´Ù.

namespace XLD_MapView6_2
{
public partial class MainWindow : Window
    {
        public XRasterIO m_RasterIO;   // ¿µ»óÀÇ ÀÔÃâ·ÂÀ» ´ã´çÇÒ °´Ã¼ ¼±¾ð
        public XVectorIO m_VectorIO;   //º¤ÅÍ °´Ã¼ÀÇ ÀÔÃâ·ÂÀ» ´ã´çÇÒ °´Ã¼ ¼±¾ð
       

        public MainWindow()
        {
¡¦

 

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 MainWindow()
{
    InitializeComponent();
    String StrError;
    m_RasterIO = new XRasterIO();   // °´Ã¼ »ý¼º
    if (m_RasterIO.Initialize(out StrError) == false)  // ¿µ»ó ÀÔÃâ·Â °´Ã¼ ÃʱâÈ­
    {
           System.Windows.Forms.MessageBox.Show(StrError);
    }
    nxMapLayerComposite1.LayerVisible = true;   // ¿µ»ó·¹À̾ º¸À̵µ·Ï ¼Ó¼ºÀ» º¯°æ

    if (!nxMapView1.SetBackgroundMap("C:\\Pixoneer\\XDL1.2\\Config\\XMapBase.xml"))
     {
            System.Windows.MessageBox.Show("¹è°æ¸ÊÀÌ ¼³Á¤µÇÁö ¾Ê¾Ò½À´Ï´Ù.");
      }

    // º¤ÅÍ °´Ã¼¸¦ »ý¼ºÇÏ°í ÆíÁýÇϱâ À§ÇØ 
    nxMapLayerVectorEditor1.Editable = true;

    // º¤Å͸¦ ÀúÀåÇϱâ À§ÇØ º¤ÅÍ IO°´Ã¼¸¦ »ý¼º
    m_VectorIO = new XVectorIO();
    if (m_VectorIO.Initialize(out StrError) == false)
        MessageBox.Show(StrError);
}

1.4.3     [File] ÇϺο¡ [Open XvcVector]°ú [Save XvcVector]¿¡ ´ëÇÑ ¸Þ´º¸¦ ´õºí Ŭ¸¯ÇÏ°í ÀÚµ¿ ÇÔ¼ö¸¦ »ý¼ºÇÏ¿© ´ÙÀ½°ú °°ÀÌ Äڵ带 »ý¼ºÇÑ´Ù.

// Vector °´Ã¼ ·Îµù
private void openXvcVectorFileMenuItem_Click(object sender, RoutedEventArgs e)
{
     // ¿­±âÀ§ÇÑ ÆÄÀÏ ´ÙÀ̾ó·Î±× â »ý¼º
     OpenFileDialog openFileDialog = new OpenFileDialog();
     openFileDialog.Multiselect = false;
     openFileDialog.Filter = "XvcBase Files|*.xvml";
     openFileDialog.RestoreDirectory = true;

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

      // XvcBase°´Ã¼ »ý¼º(XvcObjectµéÀ» ´ã±â À§ÇÑ ÃÖ»óÀ§ °´Ã¼)
      String strError;
      XvcBase vcBase = new XvcBase();

      // XvcBase°´Ã¼ ·Îµù
      bool bres = vcBase.LoadFile(openFileDialog.FileName, out strError, null);

      if (bres)
       MessageBox.Show("Vector File Open Succeed", "Success",
 MessageBoxButton.OK, MessageBoxImage.Information);
      else
      {
          MessageBox.Show("Vector File Open Failed", "Fail",
MessageBoxButton.OK, MessageBoxImage.Error);
          return;
      }

      // ·ÎµùµÈ XvcBase°´Ã¼¸¦ XMapLayerVectorEditor°´Ã¼¿¡ ¼³Á¤ÇÏ¿© Àç ÆíÁýÀÌ 
// °¡´ÉÇϵµ·Ï ¼³Á¤
      nxMapLayerVectorEditor1.SetEditBase(vcBase);
}

 

// ³»ºÎ xml Æ÷¸ËÀÎ XVML ÆÄÀÏ·Î ÀúÀå
private void pixoneerXVMLFileMenuItem_Click(object sender, RoutedEventArgs e)
{
      // XvcBase °´Ã¼ »ý¼º(XvcObjectµéÀ» ´ã±â À§ÇÑ ÃÖ»óÀ§ °´Ã¼)
      Pixoneer.NXDL.NVC.XvcBase vcbase = nxMapLayerVectorEditor1.GetEditBase();
      if (vcbase == null) return;

      // ÀúÀå °æ·Î »ý¼ºÀ» À§ÇÑ Save ÆÄÀÏ ´ÙÀ̾ó·Î±× »ý¼º
      SaveFileDialog dialog = new SaveFileDialog();
      dialog.Title = "Save XvcBase File";
      dialog.DefaultExt = "xvml";
      dialog.Filter = "XvcBase Files|*.xvml";

      Nullable<bool> result = dialog.ShowDialog();
      if (result == true )
      {
      String strError;

      // XvcBase¿¡ ÀúÀåµÈ °´Ã¼¸¦ ÆÄÀÏ·Î ÀúÀå
       bool bres = vcbase.SaveFile(dialog.FileName, out strError, null);

       if (bres)
       MessageBox.Show("Vector File Save Succeed", "Success", MessageBoxButton.OK, 
MessageBoxImage.Information);
       else
       MessageBox.Show("Vector File Save Failed", "Fail", MessageBoxButton.OK, 
MessageBoxImage.Error);
       }         
}

 

// XDLÀÌ Áö¿øÇÏ´Â ¿ÜºÎ º¤ÅÍ °´Ã¼¸¦ ·Îµù
private void externalVectorFormatFileMenuItem_Click(object sender, RoutedEventArgs e)
{
      // XMapLayerVectorEditor°´Ã¼¿¡ ÀÖ´Â XvcBase°´Ã¼¸¦ ²¨³»±â.
      XvcBase vcbase = nxMapLayerVectorEditor1.GetEditBase();
      if (vcbase == null) return;

      // XDLÀÌ Áö¿øÇÏ´Â File filter ²¨³»±â
      String fileFilters = m_VectorIO.GetFiltersForSave();

      // ¿ÜºÎ ÆÄÀÏ·Î ÀúÀåÇϱâ À§ÇØ ÀúÀå ´ÙÀ̾ó·Î±× »ý¼º
      SaveFileDialog dialog = new SaveFileDialog();
      dialog.Filter = fileFilters;

      Nullable<bool> result = dialog.ShowDialog();
      if (result == true) 
      {
          String vectorFileName = dialog.FileName;
          String VectorFileKey = ExtractFilterKey(fileFilters,
dialog.FilterIndex - 1);

          String strError;

      // º¤Å͸¦ ¿ÜºÎ ÆÄÀÏ·Î ÀúÀå.
      bool bres = m_VectorIO.Export(ref vcbase, dialog.FileName, VectorFileKey,
 out strError, null);

      if (bres)
       MessageBox.Show("Vector File Save Succeed", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
      else
      MessageBox.Show("Vector File Save Failed", "Fail", MessageBoxButton.OK, MessageBoxImage.Error);
      }
}

private String ExtractFilterKey(String strFilter, int idx)
{
       int tempidx = 0;
       String strKey = "";

       do
       {
            int idxDelim = strFilter.IndexOf(";|");
            if (idxDelim != -1)
            {
                String strKeyTemp = strFilter.Substring(0, idxDelim).Trim();
                int idxPipe = strKeyTemp.IndexOf('|');
                if (idxPipe != -1)
                {
                    strKey = strKeyTemp.Substring(0, idxPipe).Trim();
                }
                else
                {
                    strKey = strKeyTemp;
                }

                strFilter = strFilter.Remove(0, idxDelim + 2);
                tempidx++;
             }

       }    while (tempidx <= idx);
            return strKey;
}

1.4.4     [Vector] ÇϺο¡ [Point], [Line], [Ellipse], [Rectangle], [PolyLine], [Polygon,] [Text], [Text Box]ÀÇ ¸Þ´º¸¦ ´õºíŬ¸¯ÇÏ°í ÀÚµ¿ ÇÔ¼ö¸¦ »ý¼ºÇÏ¿© ´ÙÀ½°ú °°ÀÌ Äڵ带 »ý¼ºÇÑ´Ù.

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

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

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

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

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

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

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

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

 

1.4.5     ÃøÁ¤µµ±¸¸¦ À§ÇØ [MeasurePoint], [MeasureDistance], [MeasureArea], [MeasureAngle] ¸¦ ´õºí Ŭ¸¯ÇÏ¿© ÀÚµ¿ Äڵ带 »ý¼ºÇÏ°í ´ÙÀ½°ú °°ÀÌ Äڵ带 »ðÀÔÇÑ´Ù.

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

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

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

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

 

1.4.6     ƯÁ¤ °´Ã¼¸¦ ¸¶¿ì½º·Î ¼±ÅÃÇÑ´Ù. [Vector]-[Property]¹öÆ°À» ´õºí Ŭ¸¯ÇÏ¿© Äڵ带 »ý¼ºÇÑ´Ù.

private void propertyVectorMenuItem_Click(object sender, RoutedEventArgs 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_crText = Obj.ColorText;
       propertyDlg.m_dblThick = Obj.GetThick();
       propertyDlg.m_StyleFill = Obj.StyleFill;
       propertyDlg.m_StyleLine = Obj.StyleLine;

       //propertyDlg.Show();
            
       // 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((bool)propertyDlg.ShowDialog())
       {
            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.7     [F5]Å°¸¦ ´­·¯ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù. [Vector]-[Line], [Polygon]µîÀ» ´©¸¥ ÈÄ µµ½ÃÈ­¸é»ó¿¡ ¸¶¿ì½º¸¦ Ŭ¸¯ ¹× µå·¡±ëÇÏ¿© °´Ã¼¸¦ »ý¼ºÇÑ´Ù.

 

 

1.4.8     ÇÁ·Î±×·¥À» Á¾·áÇÑ´Ù.

 

1.4.9     ÆäÀÌÁö(WPF)¸¦ ¼Ö·ç¼Ç¿¡ »õ·Ó°Ô Ãß°¡ÇÏ°í µðÀÚÀÎÇÑ´Ù.

»õ·Î¿î Window¸¦ Ãß°¡ÇÏ·Á¸é, Visual StudioÀÇ ¸Þ´º [ÇÁ·ÎÁ§Æ®]-[ÆäÀÌÁö Ãß°¡]¸¦ ¼±ÅÃÇϰųª, [¼Ö·ç¼Ç Ž»ö±â]¿¡¼­ ÇÁ·ÎÁ§Æ®¸¦ ¼±ÅÃÇÑ ÈÄ ¸¶¿ì½º ¿À¸¥ÂÊ ¹öÆ°À» Ŭ¸¯ÇÏ¿© »ý¼ºµÇ´Â ¸Þ´º¿¡¼­ [Ãß°¡]-[ÆäÀÌÁö]À» ¼±ÅÃÇÑ´Ù.

 

 

ÆÄÀÏÀ̸§Àº ¡°PropertyXvcObj.xaml¡± À¸·Î Á¤ÀÇÇÑ´Ù.

 

 

1.4.10  XAML âÀ» »ý¼ºÇÏ¿© Property âÀ» µðÀÚÀÎÇÑ´Ù. Property â¿¡ ´ëÇÑ ÄÚµå´Â »ý·«ÇÑ´Ù. »ùÇÃÄڵ带 ´Ù¿î·Îµå ÈÄ ÂüÁ¶ÇÑ´Ù.

 

 

1.4.11   [F5]Å°¸¦ ´­·¯ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ´Ù. [Vector]-[Line]¸¦ ´­·¯ ¶óÀÎÀ» Çϳª ±×¸°´Ù.

 

 

1.4.12   Æ¯Á¤ °´Ã¼¸¦ ¸¶¿ì½º·Î ¼±ÅÃÇÑ´Ù. [Vector]-[Property]¹öÆ°À» ´©¸¥´Ù.

 

 

 

1.4.13   ¼Ó¼º°ªÀ» º¯°æ ÈÄ OK¸¦ Ŭ¸¯ÇÑ´Ù.