WPF - XDL Tutorial

XDL PlanetView È°¿ë µÎ¹ø°

(piXoneer XDL Tutorial)

 

 

 

 

 

 

NXPlanetView¸¦ È°¿ëÇÏ¿© 2D ¹× 3D ȯ°æ¿¡¼­ ´Ù¾çÇÑ ÃøÁ¤¹æ¹ýÀ» ±¸ÇöÇØ º¸°í,

 »ç¿ëÀÚ Á¤ÀÇ ¼³Á¤ÇÑ Á¤Á¡¿¡ ´ëÇÑ °Å¸® ¹× °¢µµ ÃøÁ¤µµ ±¸ÇöÇØ º¾´Ï´Ù.

 

2019. 04.

 

 

¸ñÂ÷

XDL PlanetView È°¿ë µÎ¹ø°... 1

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

1.1    XDL ¿£Áø... 3

2    NXPlanetView¸¦ ÀÌ¿ëÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ ¸¸µé±â... 3

2.1    ±âº» ÇÁ·Î±×·¥ ÀÛ¼º... 3

2.2    ÇÁ·Î±×·¥ µðÀÚÀÎ... 3

2.3    ±â´É ¹× À̺¥Æ® Ãß°¡... 6

 

 

 

 

1     »ç¿ëÇϱâ

 

1.1    XDL ¿£Áø

¼³Ä¡ ÇÁ·Î±×·¥À¸·Î ¹èÆ÷µÇ´Â XDL ¿£ÁøÀº Visual Studio 2010 x86 Release ¹öÀüÀ¸·Î, Visual Studio 2010 ÀÌ»óÀÇ ¹öÀü¿¡¼­ »ç¿ë °¡´ÉÇÏ´Ù.

¾Æ·¡ÀÇ ¼³¸íÀº Visual Studio 2015À» ±âÁØÀ¸·Î ÇÏ°Ú´Ù.

2     NXPlanetView¸¦ ÀÌ¿ëÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ ¸¸µé±â

l  º» ¿¹Á¦ ÇÁ·Î±×·¥Àº NXPlanetViewÀÇ ±âº» ÃøÁ¤ ¸ðµå¸¦ ¼³Á¤ÇÏ¿© ±æÀÌ, ¸éÀû µîÀ» ÃøÁ¤ÇØ º¸°í, ¼¼ Á¡À» ÀÌ¿ëÇÑ °Å¸® ¹× °¢µµ¸¦ »ç¿ëÀÚ Äڵ带 ÀÌ¿ëÇÏ¿© µµ½ÃÇÏ°í ÃøÁ¤ÇØ º¸µµ·Ï ÇÑ´Ù.

2.1    ±âº» ÇÁ·Î±×·¥ ÀÛ¼º

2.1.1     Visual Studio 2015À» ÀÌ¿ëÇÏ¿© ¿¹Á¦ ¡°XDL_PlanetView1¡±ÀÇ ¡°±âº» ÇÁ·Î±×·¥ ÀÛ¼º¡± ¹æ¹ýÀ» Âü°í·Î ±âº» ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇÑ´Ù.

 

2.2    ÇÁ·Î±×·¥ µðÀÚÀÎ

 

 

Number

Name

Control type

¨ç

menu

Menu

¨è

splitContainter1

GridSplitter

¨é

nxPlanetView2D

NXPlanetView

¨ê

nxPlanetView3D

NXPlanetView

¨ë

nxPlanetLayer2D

NXPlanetLayer

 

2.2.1     MainWindow.xaml â¿¡¼­ ±âº»À¸·Î »ý¼ºµÈ Grid ·¹À̾ƿô¿¡ Grid.RowDefinitionÀ» ÀÌ¿ëÇÏ¿© Grid¸¦ µÎ °³·Î ³ª´©¾î »ý¼ºÇÑ´Ù. ù ¹ø° Grid¿¡ Menu¸¦ ¹èÄ¡ÇÑ´Ù.

2D measurement´Â ¾Æ·¡¿Í °°Àº ÇϺΠ¸Þ´º¸¦ °®´Â´Ù. ¾Æ·¡ Ç¥¸¦ Âü°íÇÏ¿© ¸Þ´º¸¦ »ý¼ºÇϵµ·Ï ÇÑ´Ù.

 

 

Control Type

Header

Name

MenuItem

2D Measurement

 

MenuItem

°Å¸®(´Ü¼±) ÃøÁ¤

Measure2DLineMenuItem

MenuItem

°Å¸®(Æú¸®¶óÀÎ) ÃøÁ¤

Measure2DPolyLineMenuItem

MenuItem

¸éÀû ÃøÁ¤

Measure2DAreaMenuItem

MenuItem

°¢µµ ÃøÁ¤(ÁøºÏ¹æÇâ)

Measure2DAngleMenuItem

MenuItem

°¢µµ ÃøÁ¤(3Á¡ ÀÌ¿ë)

Measure2DAngle3PtMenuItem

MenuItem

¿øÇü ÃøÁ¤

Measure2DCircleMenuItem

3D measurement¿¡¼­ÀÇ ¸Þ´º ±¸¼ºÀº ¾Æ·¡¿Í °°´Ù. ¾Æ·¡ÀÇ Ç¥¸¦ Âü°í ÇÏ¿© ¸Þ´º¸¦ ±¸¼ºÇÑ´Ù.

 

Control Type

Header

Name

MenuItem

3D Measurement

 

MenuItem

°Å¸®(´Ü¼±) ÃøÁ¤

Measure3DLineMenuItem

MenuItem

°Å¸®(Æú¸®¶óÀÎ) ÃøÁ¤

Measure3DPolyLineMenuItem

MenuItem

¸éÀû ÃøÁ¤

Measure3DAreaMenuItem

MenuItem

°¢µµ ÃøÁ¤(ÁøºÏ¹æÇâ)

Measure3DAngleMenuItem

MenuItem

°¢µµ ÃøÁ¤(3Á¡ ÀÌ¿ë)

Measure3DAngle3PtMenuItem

MenuItem

¿øÇü ÃøÁ¤

Measure3DCircleMenuItem

 

¸¶Áö¸·À¸·Î »ç¿ëÀÚ Á¤ÀÇ ¸Þ´º¸¦ »ý¼ºÇÑ´Ù.

 

 

Control Type

Header

Name

MenuItem

»ç¿ëÀÚ Á¤ÀÇ

 

MenuItem

°Å¸® ¹× °¢µµ ÃøÁ¤

UserDefinedMeasureMenuItem

 

2.2.2     ´ÙÀ½À¸·Î µÎ ¹ø° Row Grid¿¡ Grid.ColumnDefinitionÀ» ÀÌ¿ëÇÏ¿© ¼¼ °³ÀÇ ColumnÀ» »ý¼ºÇÑ´Ù. ù ¹ø° Column¿¡´Â NXPlanetView¿Í NXPlanetLayer¸¦ ¹èÄ¡ÇÏ°í µÎ ¹ø° ColumnÀº GridSpiltterÀ» ³õ´Â´Ù. ¼¼ ¹ø° ColumnÀº NXPlanetView À» ¹èÄ¡ÇÑ´Ù

2.2.3     nxPlanetView3D ÄÁÆ®·ÑÀ» ¼±ÅÃÇÏ°í [¼Ó¼º] âÀÇ ¡°EarthMode¡±¸¦ ¡°Planet3D¡±·Î ¼³Á¤ÇÑ´Ù.

NXPlanetViewÀÇ EarthMode´Â ¡°Planet2D¡±ÀÌ´Ù. Earth¸ðµå¸¦ ¡°Planet3D¡±·Î ¼³Á¤Çϸé PlanetView´Â  3Â÷¿ø µµ½Ã ¸ðµå·Î º¯°æµÈ´Ù.

 

 

2.2.4     ¼Ö·ç¼ÇÀ» ºôµåÇÏ°í ½ÇÇàÇÑ´Ù.

 

 

2.3    ±â´É ¹× À̺¥Æ® Ãß°¡

2.3.1     Window âÀ» ¼±ÅÃÇÏ°í [¼Ó¼º] â - [À̺¥Æ® ] ¸Þ´º¸¦ ¼±ÅÃÇÑ µÚ ¡°Loaded¡± À̺¥Æ®¸¦ ´õºí Ŭ¸¯ÇÑ´Ù.

¡°Loaded¡± À̺¥Æ®¸¦ ´õºí Ŭ¸¯Çϸé, ¡°Window_Loaded¡± ÇÔ¼ö°¡ ÀÚµ¿ÀûÀ¸·Î Ãß°¡µÇ°í ¾Æ·¡¿Í °°ÀÌ Ãß°¡ÀûÀÎ ±â´ÉÀ» ±¸ÇöÇÒ ¼ö ÀÖµµ·Ï MainWindow.xaml.csÀÇ ÄÚµå·Î À̵¿ÇÏ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¾Æ·¡¿Í °°ÀÌ Äڵ带 Ãß°¡ÇÑ´Ù.

using Pixoneer.NXDL;
using Pixoneer.NXDL.NGR;
using Pixoneer.NXDL.NXPlanet;

namespace XDL_PlanetView2
{
    public partial class MainWindow : Window
    {
 public MainWindow()
        {
            InitializeComponent();
            nxPlanetView2D.BackColor = Color.Black;
            nxPlanetView3D.BackColor = Color.Black;
        }

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            XGeoPoint gpEye = XGeoPoint.FromDegree(127.4, 38.0, 1500000);
            // Planet2D ¸ðµåÀÇ camera À§Ä¡ ¼³Á¤
            nxPlanetView2D.SetCameraPosition(gpEye, XAngle.FromDegree(0.0));
            // Planet3D ¸ðµåÀÇ camera À§Ä¡ ¼³Á¤
            nxPlanetView3D.SetCameraPosition(gpEye, XAngle.FromDegree(0.0),
 XAngle.FromDegree(-90.0), XAngle.FromDegree(0.0));

            // PlanetViewÀÇ ÃøÁ¤ ´ÜÀ§ ¼³Á¤
            // °Å¸® ÃøÁ¤ ´ÜÀ§
            nxPlanetView3D.ToolboxDistUnit = 
NXPlanetView.eToolboxDistUnit.Mile;
            // ¸éÀû ÃøÁ¤ ´ÜÀ§
            nxPlanetView3D.ToolboxAreaUnit = 
NXPlanetView.eToolboxAreaUnit.SquareKiloMeter;
         
            nxPlanetView2D.RefreshScreen();
            nxPlanetView3D.RefreshScreen();
        }
    }
}

2.3.2     ¡°2D Measurement/3D Measurement/»ç¿ëÀÚ Á¤ÀÇ¡±ÀÇ ÇÏÀ§ ¸Þ´º¸¦ ¼±ÅÃÇÑ ÈÄ ´õºí Ŭ¸¯ÇÑ´Ù.

¸Þ´º¿¡¼­ ¸¶¿ì½º·Î ´õºí Ŭ¸¯ÇÏ¸é ¡°Click¡±¿¡ ´ëÇÑ À̺¥Æ® ÇÔ¼ö°¡ ÀÚµ¿ Ãß°¡µÈ´Ù.

 

2.3.3     °¢ ¸Þ´º¿¡ µû¸¥ nxPlanetView2D¿Í nxPlanetView3DÀÇ ToolboxMode¸¦ ¼³Á¤ÇÑ´Ù.

NXPlanetViewÀÇ ÃøÁ¤¸ðµå·Î´Â 2Á¡À» ÀÌ¿ëÇÑ °Å¸® ÃøÁ¤(NXPlanetView.eToolboxMode. DistanceMeasurer), ´ÙÁß Á¡À» ÀÌ¿ëÇÑ °Å¸® ÃøÁ¤(eToolboxMode.PathMeasurer), ´ÙÁß Á¡À» ÀÌ¿ëÇÑ ¸éÀû ÃøÁ¤(eToolboxMode.AreaMeasurer), µÎ Á¡ÀÇ °Å¸®¸¦ ¹ÝÁö¸§À¸·Î ÇÑ ¿øÇü ÃøÁ¤(eToolboxMode.CircleMeasurer), µÎ Á¡À¸·Î ÀÌ·ç¾îÁø º¤ÅÍ¿Í ÁøºÏ¹æÇâ°úÀÇ °¢µµ ÃøÁ¤(eToolboxMode.AngleMeasurer), ¼¼ Á¡À¸·Î ÀÌ·ç¾îÁø °¢µµ ÃøÁ¤(eToolboxMode.AngleMeasurer2) µîÀÌ ÀÖ´Ù.

ÃøÁ¤ °á°ú¸¦ Ç¥½ÃÇÏ´Â µ¥¿¡ ÃøÁ¤ ´ÜÀ§¸¦ ¼³Á¤ÇÏ·Á¸é, ¸éÀû¿¡ ´ëÇؼ­´Â NXPlanetViewÀÇ ToolboxAreaUnit ¼Ó¼ºÀ» NXPlanetView.eToolboxAreaUnit °ªÀ¸·Î ¼³Á¤ÇÏ¸é µÇ°í, °Å¸®¿¡ ´ëÇؼ­´Â NXPlanetViewÀÇ ToolboxDistUnit ¼Ó¼ºÀ» NXPlanetView.eToolboxDistUnit °ªÀ¸·Î ¼³Á¤ÇÑ´Ù. ÄÚµå´Â ¾Æ·¡¿Í °°´Ù.

private void Measure2DLineMenuItem_Click(object sender, RoutedEventArgs e)
{
   nxPlanetView2D.ToolboxMode = NXPlanetView.eToolboxMode.DistanceMeasurer;
}

private void Measure2DPolyLineMenuItem_Click(object sender, RoutedEventArgs e)
{
   nxPlanetView2D.ToolboxMode = NXPlanetView.eToolboxMode.PathMeasurer;
}

private void Measure2DAreaMenuItem_Click(object sender, RoutedEventArgs e)
{
   nxPlanetView2D.ToolboxMode = NXPlanetView.eToolboxMode.AreaMeasurer;
}

private void Measure2DAngleMenuItem_Click(object sender, RoutedEventArgs e)
{
   nxPlanetView2D.ToolboxMode = NXPlanetView.eToolboxMode.AngleMeasurer;
}

private void Measure2DAngle3PtMenuItem_Click(object sender, RoutedEventArgs e)
{
   nxPlanetView2D.ToolboxMode = NXPlanetView.eToolboxMode.AngleMeasurer2;
}

private void MMeasure2DCircleMenuItem_Click(object sender, RoutedEventArgs e)
{
   nxPlanetView2D.ToolboxMode = NXPlanetView.eToolboxMode.CircleMeasurer;
}

private void Measure3DLineMenuItem_Click(object sender, RoutedEventArgs e)
{
  nxPlanetView3D.ToolboxMode = NXPlanetView.eToolboxMode.DistanceMeasurer;
}

private void Measure3DPolyLineMenuItem_Click(object sender, RoutedEventArgs e)
{
   nxPlanetView3D.ToolboxMode = NXPlanetView.eToolboxMode.PathMeasurer;
}

private void Measure3DAreaMenuItem_Click(object sender, RoutedEventArgs e)
{
   nxPlanetView3D.ToolboxMode = NXPlanetView.eToolboxMode.AreaMeasurer;
}

private void Measure3DAngleMenuItem_Click(object sender, RoutedEventArgs e)
{
   nxPlanetView3D.ToolboxMode = NXPlanetView.eToolboxMode.AngleMeasurer;
}

private void Measure3DAngle3PtMenuItem_Click(object sender, RoutedEventArgs e)
{
    nxPlanetView3D.ToolboxMode = NXPlanetView.eToolboxMode.AngleMeasurer2;
}

private void Measure3DCircleMenuItem_Click(object sender, RoutedEventArgs e)
{
    nxPlanetView3D.ToolboxMode = NXPlanetView.eToolboxMode.CircleMeasurer;
}

2.3.4     »ç¿ëÀÚ Á¤ÀÇ ÃøÁ¤À» À§ÇÑ º¯¼ö¸¦ Ãß°¡ÇÏ°í UserDefinedMeasureMenuItem À̺¥Æ® ÇÔ¼ö¿¡¼­ ÃʱâÈ­ÇÑ´Ù.

»ç¿ëÀÚ Á¤ÀÇ ÃøÁ¤ ¿©ºÎ¸¦ ¼³Á¤ÇÏ´Â ¡°bool userMeasure¡±¿Í °¢µµ ÃøÁ¤À» À§ÇÑ ¼¼ º¯¼ö ¡°XGeoPoint posMeasure0, posMeasure1, posMeasure2¡±¸¦ »ý¼ºÇÏ°í ÃʱâÈ­ÇÑ´Ù.

public partial class MainWindow : Window
{
    bool userMeasure = false;
    int countPos = 0;
    XGeoPoint posAngle0, posAngle1, posAngle2;    
// index 0 : start, index 1 : center, index 2 : end

    public MainWindow()
    {
        InitializeComponent();
        nxPlanetView2D.BackColor = System.Drawing.Color.Black;
        nxPlanetView3D.BackColor = System.Drawing.Color.Black;
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        XGeoPoint gpEye = XGeoPoint.FromDegree(127.4, 38.0, 1500000);
        // Planet2D ¸ðµåÀÇ camera À§Ä¡ ¼³Á¤
        nxPlanetView2D.SetCameraPosition(gpEye, XAngle.FromDegree(0.0));
        // Planet3D ¸ðµåÀÇ camera À§Ä¡ ¼³Á¤
        nxPlanetView3D.SetCameraPosition(gpEye, XAngle.FromDegree(0.0),
 XAngle.FromDegree(-90.0), XAngle.FromDegree(0.0));

        // PlanetViewÀÇ ÃøÁ¤ ´ÜÀ§ ¼³Á¤
        // °Å¸® ÃøÁ¤ ´ÜÀ§
        nxPlanetView3D.ToolboxDistUnit = NXPlanetView.eToolboxDistUnit.Mile;
        // ¸éÀû ÃøÁ¤ ´ÜÀ§
        nxPlanetView3D.ToolboxAreaUnit = 
NXPlanetView.eToolboxAreaUnit.SquareKiloMeter;
         
        nxPlanetView2D.RefreshScreen();
        nxPlanetView3D.RefreshScreen();

        // »ç¿ëÀÚ Á¤ÀÇ ÃøÁ¤À» À§ÇÑ º¯¼ö ÃʱâÈ­
        userMeasure = false;
        countPos = 0;
    }

private void UserDefinedMeasureMenuItem_Click(object sender, RoutedEventArgs e)
{
        userMeasure = !userMeasure;
        countPos = 0;
}

2.3.5     °¢µµ ¹× °Å¸®¸¦ ÃøÁ¤ÇÏ´Â ÇÔ¼ö¸¦ ÀÌ¿ëÇϱâ À§Çؼ­ ¡°NXDLcc.dll¡±À» ÂüÁ¶¿¡ Ãß°¡ÇÑ´Ù.

WGS84ü¸¦ ¹Ý¿µÇÑ °Å¸®¸¦ ÃøÁ¤ÇÏ´Â ÇÔ¼ö´Â Xcc.CalcGeodeticDistanceÀ̸ç, °¢µµ¸¦ ÃøÁ¤ÇÏ´Â ÇÔ¼ö´Â Xcc.CalcGeodeticAngleÀÌ´Ù. À̸¦ À§ÇØ NXDLcc.dllÀ» ÂüÁ¶¿¡ Ãß°¡ÇÏ°í, ¡°using Pixoneer.NXDL.NCC;¡± ±¸¹® ¶ÇÇÑ Ãß°¡ÇÑ´Ù.

2.3.6     nxPlanetLayer2DÀ» ¼±ÅÃÇÏ¿© ¡°OnWndProc¡± À̺¥Æ®¿Í ¡°OnRender¡± À̺¥Æ® ÇÔ¼ö¸¦ Ãß°¡ÇÏ¿© Äڵ带 ÀÛ¼ºÇÑ´Ù.

OnWndProc À̺¥Æ®´Â NXPlanetLayer°¡ Ãß°¡µÇ¾î ÀÖ´Â ViewÀÇ À©µµ¿ì À̺¥Æ®¸¦ ¿ÜºÎ¿¡¼­ ¹Þ¾Æ¼­ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. OnRender´Â NXPlanetLayer°¡ Ãß°¡µÇ¾î ÀÖ´Â ViewÀÇ RenderingÀÌ ¿Ï·áµÈ ÈÄ ¾îÇø®ÄÉÀ̼ǿ¡¼­ Ãß°¡ÀûÀÎ ÀÛ¾÷À» ±¸ÇöÇØ¾ß ÇÒ ÇÊ¿ä°¡ ÀÖÀ» ¶§ »ç¿ëÇÏ¸é µÈ´Ù.

¿ÞÂÊ ¹öÆ°ÀÌ Å¬¸¯ÇÒ ¶§¸¶´Ù °¢µµ ÃøÁ¤À» À§ÇÑ Á¡À» Â÷·Ê´ë·Î ¼³Á¤ÇÏ°í 3Á¡ÀÌ ¸ðµÎ ¼³Á¤µÇ¸é °è»ê°á°ú¸¦ Visual Studio 2015 Ãâ·Ââ¿¡ Ãâ·ÂÇϵµ·Ï ÇÑ´Ù. ¶ÇÇÑ 2Á¡ ÀÌ»óÀÎ °æ¿ì È­¸é¿¡ ºÓÀº ¼±À¸·Î µµ½ÃÇÑ´Ù. ÄÚµå´Â ¾Æ·¡¿Í °°´Ù.

private bool nxPlanetLayer2D_OnRender(object sender, NXPlanetDrawArgs e)
{
      if (!userMeasure) return false;

      if (countPos > 1)
      {
          e.Graphics.glDisable(XGraphics.GL_DEPTH_TEST);
          e.Graphics.glEnable(XGraphics.GL_BLEND);
          e.Graphics.glBlendFunc(XGraphics.GL_SRC_ALPHA, XGraphics.GL_ONE_MINUS_SRC_ALPHA);

          e.Graphics.glPushMatrix();

          e.Graphics.glColor3f(1.0f, 0.0f, 0.0f);
          e.Graphics.glLineWidth(3);
          e.Graphics.glBegin(XGraphics.GL_LINE_STRIP);

          XVertex3d posWorld = nxPlanetView2D.GeographicToWorld(posAngle0);
          e.Graphics.glVertex3d(posWorld - e.WOS);

          posWorld = nxPlanetView2D.GeographicToWorld(posAngle1);
          e.Graphics.glVertex3d(posWorld - e.WOS);

          if (countPos >= 3)
          {
            posWorld = nxPlanetView2D.GeographicToWorld(posAngle2);
            e.Graphics.glVertex3d(posWorld - e.WOS);
          }

          e.Graphics.glEnd();
          e.Graphics.glColor3f(1.0f, 1.0f, 1.0f);
          e.Graphics.glPopMatrix();
          e.Graphics.glEnable(XGraphics.GL_DEPTH_TEST);
      }

          return default(bool);
}

private bool nxPlanetLayer2D_OnWndProc(object sender, NXPlanetDrawArgs e, ref System.Windows.Forms.Message m)
{
      if (m.Msg == Pixoneer.NXDL.XWndMsg.XWM_LBUTTONDOWN)
      {
           if (userMeasure)
           {
              double x = Pixoneer.NXDL.XWndMsg.GetLowValue(m.LParam);
              double y = Pixoneer.NXDL.XWndMsg.GetHighValue(m.LParam);

              XGeoPoint gpPos = nxPlanetView2D.ScreenToGeographic(x, y);
              if (countPos == 0)
              {
                  posAngle0 = gpPos;
              }
              else if (countPos == 1)
              {
                  posAngle1 = gpPos;
              }
              else if (countPos == 2)
              {
                  posAngle2 = gpPos;

               // µÎ ¼±ºÐÀÇ ±æÀÌ¿Í ¼¼ Á¡À¸·Î ÀÌ·ç¾îÁö´Â °¢µµ °è»ê
                  double distance = 0.0;
                  distance += Xcc.CalcGeodeticDistance(XAngle.FromDegree(posAngle0.lond), XAngle.FromDegree(posAngle0.latd),
                            XAngle.FromDegree(posAngle1.lond), XAngle.FromDegree(posAngle1.latd));
                   distance += Xcc.CalcGeodeticDistance(XAngle.FromDegree(posAngle1.lond), XAngle.FromDegree(posAngle1.latd),
                            XAngle.FromDegree(posAngle2.lond), XAngle.FromDegree(posAngle2.latd));

                    double angle = 0.0;
                    angle = Xcc.CalcGeodeticAngle(XAngle.FromDegree(posAngle1.lond), XAngle.FromDegree(posAngle1.latd),
                            XAngle.FromDegree(posAngle0.lond), XAngle.FromDegree(posAngle0.latd),
                            XAngle.FromDegree(posAngle2.lond), XAngle.FromDegree(posAngle2.latd));

                      System.Diagnostics.Debug.WriteLine("Distance : " + distance.ToString());
                      System.Diagnostics.Debug.WriteLine("Angle    : " + angle.ToString());
                    }
                    countPos++;
                    nxPlanetView2D.RefreshScreen();
           }
      }
            return default(bool);
}

 

2.3.7     ¼Ö·ç¼ÇÀ» ºôµåÇÏ°í ½ÇÇàÇÑ´Ù.

2D MeasurementÀÇ ¡°°Å¸®(Æú¸®¶óÀÎ) ÃøÁ¤¡± ¸Þ´º¸¦ ¼±ÅÃÇÑ µÚ nxPlanetView2D À§¿¡¼­ ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» Ŭ¸¯Çϸ鼭 ÃøÁ¤ÇÏ°íÀÚ ÇÏ´Â Á¤Á¡À» ¼³Á¤ÇÑ´Ù. ¾Æ·¡ ±×¸²°ú °°ÀÌ ÃøÁ¤ °á°ú°¡ °¢ ¼±ºÐ ¿ä¼Ò¿¡ µµ½ÃµÈ´Ù.

 

 

3D MeasurementÀÇ ¡°°¢µµ ÃøÁ¤(ÁøºÏ¹æÇâ)¡± ¸Þ´º¸¦ ¼±ÅÃÇÑ µÚ nxPlanetView3D À§¿¡¼­ ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» Ŭ¸¯ÇÏ°í ¸¶¿ì½º¸¦ ¿òÁ÷À̸é ÁøºÏ¹æÇâ°ú ÀÌ·ç´Â °¢µµ°¡ È­¸é¿¡ µµ½ÃµÇ¸ç ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» ´õºí Ŭ¸¯ÇÏ¿© ÃøÁ¤À» Á¾·áÇÑ´Ù.

 

 

»ç¿ëÀÚ Á¤ÀÇ ¸Þ´ºÀÇ ¡°°Å¸® ¹× °¢µµ ÃøÁ¤¡±À» ¼±ÅÃÇÑ µÚ nxPlanetView2D À§¿¡¼­ ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» Ŭ¸¯Çϸé 2Á¡ ÀÌ»óºÎÅÍ È­¸é¿¡ ºÓÀº ½Ç¼±ÀÌ µµ½ÃµÇ°í, 3Á¡ÀÌ ¼±ÅõǸé Visual Studio 2015ÀÇ Ãâ·Ââ¿¡ ÃøÁ¤°á°ú°¡ ³ªÅ¸³­´Ù.

 

 

 

 

ÃøÁ¤°á°úÀÇ ´ÜÀ§´Â °Å¸®ÀÇ °æ¿ì meter, °¢µµÀÇ °æ¿ì ¢ª(degree)ÀÌ´Ù.