WPF - XDL Tutorial

Áö±¸ Ÿ¿øü »óÀÇ ÁÂÇ¥ ¹× °Å¸® °è»ê

(piXoneer XDL Tutorial)

 

 

 

 

 

 

 ±¸ Ÿ¿øü »ó¿¡¼­ ƯÁ¤ ÁöÁ¡°£ÀÇ °ü°è¸¦ ÀÌ¿ëÇÏ¿© °Å¸®³ª ¹æÇâÀ» ±¸ÇÏ°í

 ECEFÁÂÇ¥°è·ÎºÎÅÍ GeodeticÁÂÇ¥°è·ÎÀÇ º¯È¯ µî¿¡ ´ëÇؼ­ ¼³¸íÇÕ´Ï´Ù.

 

 

2019. 04.

 

 

 

 

¸ñÂ÷

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

1.1    XDL ¿£Áø... 1

1.2    XDLÀÇ µ¥ÀÌÅͱ¸Á¶¸¦ ÀÌ¿ëÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ ¸¸µé±â... 1

1.3    Áö±¸»óÀÇ Æ¯Á¤ À§Ä¡(Reference Position)·ÎºÎÅÍ ¹æÀ§°¢(Azimuth Angle)°ú °Å¸®(Distance)¿¡ ÇØ´çÇÏ´Â À§Ä¡(Target Position) ±¸Çϱ⠿¹Á¦... 1

1.4    Áö±¸»óÀÇ Æ¯Á¡ ÇÑ À§Ä¡(Reference Position)¿Í ´Ù¸¥ Àå¼ÒÀÇ ÇÑ À§Ä¡(Target Position)·ÎºÎÅÍ ¹æÀ§°¢µµ¿Í °Å¸® ±¸ÇÏ´Â ¿¹Á¦... 1

1.5    Geographic ÁÂÇ¥°è·ÎºÎÅÍ ECEFÁÂÇ¥°è·ÎÀÇ º¯È¯ ¿¹Á¦... 1

1.6    ECEFÁÂÇ¥°è·ÎºÎÅÍ GeographicÁÂÇ¥°è·ÎÀÇ º¯È¯ ¿¹Á¦... 1

 

 


 

1      »ç¿ë Çϱâ

1.1    XDL ¿£Áø

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

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

 

1.2    XDLÀÇ µ¥ÀÌÅͱ¸Á¶¸¦ ÀÌ¿ëÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ ¸¸µé±â

1.2.1         Visual Studio 2015À» ½ÇÇàÇÑ´Ù.

1.2.2         ¸Þ´º [ÆÄÀÏ]-[»õ·Î ¸¸µé±â]-[ÇÁ·ÎÁ§Æ®]¸¦ ¼±ÅÃÇÑ´Ù.

 

 

1.2.3         [»õ ÇÁ·ÎÁ§Æ®] ´ëÈ­»óÀÚ¿¡¼­ ¿ÞÂÊÀÇ ÅÛÇø´ â¿¡¼­ ¡°Visual C#¡±À» ¼±ÅÃÇÏ°í, ´ëÈ­»óÀÚ Áß°£ÀÇ ¸ñ·Ï¿¡¼­ ¡°WPF ÀÀ¿ë ÇÁ·Î±×·¥¡±À» ¼±ÅÃÇÑ´Ù.

»ç¿ëÀÚ°¡ ¿øÇÏ´Â °æ·Î¸¦ ¼±ÅÃÇÑ ´ÙÀ½ ÇÁ·ÎÁ§Æ® À̸§À» ¡°XDL_GeoPosition¡± À¸·Î ÀÔ·ÂÇÏ°í [»õ ÇÁ·ÎÁ§Æ®] ´ëÈ­»óÀÚÀÇ ¡°È®ÀΡ± ¹öÆ°À» Ŭ¸¯ÇÑ´Ù.

 

 

ÀÌ ¹®¼­¿¡¼­´Â ´ëÈ­»óÀÚ ¿À¸¥ÂÊ ¾Æ·¡¿¡ ÀÖ´Â ¡°¼Ö·ç¼Ç¿ë µð·ºÅ͸® ¸¸µé±â¡±´Â ¼±ÅÃÇÏÁö ¾Ê°Ú´Ù. ¡°È®ÀΡ± ¹öÆ°À» ´©¸£¸é ÇÁ·ÎÁ§Æ®°¡ ±âº»ÀûÀ¸·Î »ý¼ºµÇ°í, È­¸é¿¡ WindowÀ» µðÀÚÀÎÇÒ ¼ö ÀÖ´Â È­¸éÀÌ ¶á´Ù. ¸¸¾à ¾Æ·¡¿Í °°Àº Window âÀÌ »ý¼ºµÇÁö ¾ÊÀ¸¸é, [¼Ö·ç¼Ç Ž»ö±â] â¿¡¼­ MainWindow.xaml¡±¸¦ ¸¶¿ì½º ´õºíŬ¸¯À» ÇÏ¿© âÀ» ¿¬´Ù.

 

 

1.2.4         ÂüÁ¶¸¦ ÅëÇØ NXDL.dll Ç׸ñÀ» Ãß°¡ÇÑ´Ù.

¼Ö·ç¼Ç Ž»ö±âÀÇ ÇÁ·ÎÁ§Æ® ¾Æ·¡¿¡ ÀÖ´Â ÂüÁ¶ ¾ÆÀÌÅÛÀÇ ¸¶¿ì½º ¿À¸¥ÂÊ ¹öÆ°À» Ŭ¸¯ÇÏ¿© »ý¼ºµÇ´Â Æ˾÷¸Þ´º¿¡¼­ ¡°ÂüÁ¶Ãß°¡¡± ¸Þ´º¸¦ ¼±ÅÃÇÑ´Ù.

 

 

¸Þ´º¸¦ ¼±ÅÃÇÏ¸é ¾Æ·¡¿Í °°ÀÌ [ÂüÁ¶Ãß°¡] ´ëÈ­»óÀÚ°¡ ³ªÅ¸³ª¸ç, ´ëÈ­»óÀÚ ¾Æ·¡ÂÊ¿¡ ÀÖ´Â ¡°Ã£¾Æº¸±â¡± ¹öÆ°À» Ŭ¸¯ÇÑ´Ù.

 

 

 

¡°C:\Pixoneer\XDL1.2\bin\NXDL.dll¡± °æ·Î·Î À̵¿ÇÑ ÈÄ ÆÄÀÏÀ» ¼±ÅÃÇÑ´Ù. ¡°Ãß°¡¡± ¸¦ Ŭ¸¯ÇÏ°í, [ÂüÁ¶Ãß°¡] ´ëÈ­»óÀÚÀÇ ¡°È®ÀΡ± ¹öÆ°À» Ŭ¸¯ÇÑ´Ù. [ÂüÁ¶] ¿¡ ¡°NXDL¡±°¡ Ãß°¡µÈ °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

 

 

1.2.5         ÇÁ·Î±×·¥ Á¾·á ½Ã ¸Þ¸ð¸®¸¦ ÇØÁ¦¸¦ À§ÇÑ Äڵ带 WindowâÀÌ ´ÝÈ÷´Â À̺¥Æ®¿¡ Ãß°¡ÇÑ´Ù.

MainWindow.xaml â¿¡¼­ WindowÀ» ¼±ÅÃÇÑ ÈÄ [¼Ó¼º] â¿¡¼­ ¡°À̺¥Æ®¡± ¸Þ´º¸¦ Ŭ¸¯ÇÏ°í À̺¥Æ® ¸ñ·Ï Áß ¡°Closed¡±¸¦ ¼±ÅÃÇÑ µÚ ¸¶¿ì½º ´õºíŬ¸¯À» ÇÏ¿© ÇØ´çÀ̺¥Æ®¸¦ Ãß°¡ÇÑ´Ù.

 

 

¾Æ·¡ÀÇ ±½Àº ±Û¾¾Ã³·³ Window_ClosedÇÔ¼ö¿¡ Äڵ带 Ãß°¡ÇÑ´Ù.

namespace XDL_DataStructrue
{
    
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Closed(object sender, EventArgs e)
        {
            Pixoneer.NXDL.Xfn.Close(); //ÄÚµåÃß°¡
        }
¡¦

 

1.2.6         ´ÙÀ½°ú °°ÀÌ NXDL¿¡ ´ëÇÏ¿© ÂüÁ¶¸¦ ¼³Á¤ÇÑ´Ù.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using Pixoneer.NXDL;  //Ãß°¡

 

1.2.7     ´ÙÀ½°ú °°ÀÌ Window¿¡ ¹öÆ°À» ¿Ã·Á µðÀÚÀÎÇÑ´Ù.

 

 


1.3    Áö±¸»óÀÇ Æ¯Á¤ À§Ä¡(Reference Position)·ÎºÎÅÍ ¹æÀ§°¢(Azimuth Angle)°ú °Å¸®(Distance)¿¡ ÇØ´çÇÏ´Â À§Ä¡(Target Position) ±¸Çϱ⠿¹Á¦

¿©±â¿¡¼­ °Å¸®´Â Æò¸é»óÀÇ °Å¸®°¡ ¾Æ´Ï°í Áö±¸ °î·üÀ» °í·ÁÇÑ °Å¸®¸¦ ÀǹÌÇÑ´Ù.

 

 

1.3.1         Calc Position By Bearing And Distance¹öÆ°À» ´õºí Ŭ¸¯ÇÏ¿© ÇÔ¼ö¸¦ ÀÚµ¿»ý¼ºÇÑ´Ù.

private void buttonCalcPositionByBearingAndDistance_Click(object sender, RoutedEventArgs e)
{

}

 

1.3.2         buttonCalcPositionByBearingAndDistance_Click ÇÔ¼ö¿¡ ´ÙÀ½°ú °°ÀÌ Äڵ带 ÀÔ·ÂÇÑ´Ù. ¾Æ·¡ ¿¹Á¦´Â ÀÓÀÇÀÇ ±âÁØÁ¡(¿¹¸¦ µé¾î ÇöÀç ÀÚ½ÅÀÇ À§Ä¡)·ÎºÎÅÍ ¹æÀ§°¢°ú ƯÁ¤ °Å¸®»ó¿¡ ÀÖ´Â ÁÂÇ¥°ªÀ» °è»êÇÑ´Ù.

private void buttonCalcPositionByBearingAndDistance_Click(object sender, RoutedEventArgs e)
{
        // Áö±¸ÀÇ Æ¯Àú ±âÁØÁ¡À¸·ÎºÎÅÍ ºÏÂÊÀ¸·ÎºÎÅÍ ½Ã°è¹æÇâÀÇ ¹æÀ§°¢°ú ÀÓÀÇÀÇ
// °Å¸®¿¡ ÇØ´çÇÏ´Â ÁöÁ¡À» °è»ê

        // 1. ±âÁØÁ¡ ¼³Á¤
        XAngle lon1 = XAngle.FromDegree(127);
        XAngle lat1 = XAngle.FromDegree(36);

        // 2. ºÏÂÊÀ¸·ÎºÎÅÍ ¹æÀ§°¢ ¼³Á¤
        XAngle bearing = XAngle.FromDegree(45);

        // 3. °Å¸® ¼³Á¤ (unit : meter)
        double dist = 10000;

        // 4. °á°ú°ª¿¡ ÇØ´çÇÏ´Â À§°æµµ °ªÀ» ¾òÀ» XAngle»ý¼º
        XAngle lon2 = new XAngle();
        XAngle lat2 = new XAngle();

        // 5. CalcPosByBearingAndDistÇÔ¼ö¸¦ ÅëÇØ ÁöÁ¡ °è»ê
        XAngle ang = Xfn.CalcPosByBearingAndDist(lon1, lat1, bearing, dist,
ref lon2, ref lat2);

        Console.WriteLine("Position : " + lon2.deg.ToString() + " " + 
lat2.deg.ToString());
        Console.WriteLine("Return Angle : " + ang.deg.ToString());

}

1.3.3         ÄÄÆÄÀÏÇÏ°í ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¿© Calc Position By Bearing And Distance¹öÆ°À» Ŭ¸¯ÇÑ´Ù.

 

1.3.4         Ãâ·Ââ¿¡ °ªÀÌ ÇÁ¸°Æ®µÊÀ» È®ÀÎÇÑ´Ù.

ÂüÁ¶ À§°æµµÀ§Ä¡ 127, 36ÀÎ À§Ä¡·ÎºÎÅÍ 45µµ ºÏ¹æÀ§°¢ÀÌ°í °Å¸®°¡ 10000meterÀÎ °á°ú¸¦ Ãâ·ÂÇÑ´Ù.

 

 

1.4    Áö±¸»óÀÇ Æ¯Á¡ ÇÑ À§Ä¡(Reference Position)¿Í ´Ù¸¥ Àå¼ÒÀÇ ÇÑ À§Ä¡(Target Position)·ÎºÎÅÍ ¹æÀ§°¢µµ¿Í °Å¸® ±¸ÇÏ´Â ¿¹Á¦

¿©±â¿¡¼­ °Å¸®´Â Æò¸é»óÀÇ °Å¸®°¡ ¾Æ´Ï°í Áö±¸ °î·üÀ» °í·ÁÇÑ °Å¸®¸¦ ÀǹÌÇÑ´Ù

.

 

1.4.1         buttonCalcArcDistAndAngle_Click¹öÆ°À» ´õºí Ŭ¸¯ÇÏ¿© ÇÔ¼ö¸¦ ÀÚµ¿»ý¼ºÇÑ´Ù.

private void buttonCalcArcDistAndAngle_Click(object sender, RoutedEventArgs e)
{

}

 

1.4.2         buttonCalcArcDistAndAngle_ClickÇÔ¼ö¿¡ ´ÙÀ½°ú °°ÀÌ Äڵ带 ÀÔ·ÂÇÑ´Ù. ¾Æ·¡ ¿¹Á¦´Â ÀÓÀÇÀÇ 2Á¡À¸·ÎºÎÅÍ ¹æÀ§°¢°ú ƯÁ¤ °Å¸®¸¦ °è»êÇÑ´Ù.

private void buttonCalcArcDistAndAngle_Click(object sender, RoutedEventArgs e)
{
        // Áö±¸ÀÇ Æ¯Á¤ µÎÁöÁ¡(±âÁØÁ¡°ú ÀÓÀÇÀÇ ÁöÁ¡)À» ÀÌ¿ëÇÏ¿© ±âÁØÁ¡À¸·ÎºÎÅÍ ÀÓÀÇÀÇ
// ÁöÁ¡±îÁöÀÇ ¹æÀ§°¢(Forward, Backward) °ª°ú ÁöÁ¡°£ÀÇ °Å¸®¸¦ ¾ò´Â´Ù.
        // 1. ±âÁØÁ¡ ¼³Á¤
        XAngle lon1 = XAngle.FromDegree(127);
        XAngle lat1 = XAngle.FromDegree(36);

        // 2. ÀÓÀÇÀÇ ÁöÁ¡ ¼³Á¤
        XAngle lon2 = XAngle.FromDegree(128);
        XAngle lat2 = XAngle.FromDegree(37);

        // 3. µÎ ÁöÁ¡°£ÀÇ Forward, Backward°¢µµ¸¦ ¾òÀ» °´Ã¼ »ý¼º
        XAngle fwdAz = new XAngle();
        XAngle revAz = new XAngle();

        double dist = 0;

        // 4. µÎÁöÁ¡À» ÀÔ·ÂÇÏ¿© CalArcDistAndAngleÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© °Å¸®¿Í °¢µµ¸¦ ¾ò´Â´Ù.
        bool bResult = Xfn.CalArcDistAndAngle(lon1, lat1, lon2, lat2, 
ref dist, ref fwdAz, ref revAz);

        Console.WriteLine("Distance : " + dist.ToString());
        Console.WriteLine("Forward Angle : " + fwdAz.deg.ToString());
        Console.WriteLine("Backward Angle : " + revAz.deg.ToString());

}

1.4.3         ÄÄÆÄÀÏÇÏ°í ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¿© Calc Arc Dist and Angle From Two Position¹öÆ°À» Ŭ¸¯ÇÑ´Ù.

 

1.4.4         Ãâ·Ââ¿¡ °ªÀÌ ÇÁ¸°Æ®µÊÀ» È®ÀÎÇÑ´Ù.

ÂüÁ¶ À§Ä¡ 127, 36(°æÀ§µµ)ÀÎ À§Ä¡·ÎºÎÅÍ 128, 37(°æÀ§µµ)À§Ä¡·ÎºÎÅÍ °Å¸®°¡ 142618.087¹ÌÅÍ¿Í 38.6195662318174µµÀÎ ¹æÀ§°¢À» ¾òÀ» ¼ö ÀÖ´Ù.

 

 

1.5    Geographic ÁÂÇ¥°è·ÎºÎÅÍ ECEFÁÂÇ¥°è·ÎÀÇ º¯È¯ ¿¹Á¦

 

1.5.1         buttonGeoToECEF_Click¹öÆ°À» ´õºíŬ¸¯ÇÏ¿© ÇÔ¼ö¸¦ ÀÚµ¿»ý¼ºÇÑ´Ù.

private void buttonGeoToECEF_Click (object sender, RoutedEventArgs e)
{

}

 

1.5.2         buttonGeoToECEF_Click ÇÔ¼ö¿¡ ´ÙÀ½°ú °°ÀÌ Äڵ带 ÀÔ·ÂÇÑ´Ù.

private void buttonGeoToECEF_Click (object sender, RoutedEventArgs e)
{
// Lat/Lon(À§°æµµ)ÁÂÇ¥°è·Î ºÎÅÍ ECEFÁÂÇ¥°è·Î º¯È¯Çϱâ

        // 1. À§°æµµ ÁÂÇ¥°ªÀ» ¼³Á¤.
        XGeoPoint geo = new XGeoPoint();
        XVertex3d ecr = new XVertex3d();
        geo.lond = 127;
        geo.latd = 36;
        geo.hgt = 1200;

        // 2. ECEF°ªÀ» ¾ò´Â´Ù.
        Xfn.GeoToEcr(geo, ref ecr);

	// 3. °á°ú°ªÀ» ÇÁ¸°Æ®ÇÑ´Ù.
        Console.WriteLine("X : " + ecr.x.ToString() + "Y : " + ecr.y.ToString() 
+ "Z : " + ecr.z.ToString());
}

1.5.3         ÄÄÆÄÀÏÇÏ°í ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¿© Geo To ECEF ¹öÆ°À» Ŭ¸¯ÇÑ´Ù.

 

1.5.4         Ãâ·Ââ¿¡ °ªÀÌ ÇÁ¸°Æ®µÊÀ» È®ÀÎÇÑ´Ù.

ÂüÁ¶ À§Ä¡ 127, 36(°æÀ§µµ)ÀÌ°í °íµµ°¡ 1200meterÀÎ À§Ä¡ÀÇ ECEF°ªÀº X : -3109559.92819602 Y : 4126525.40023087 Z : 3728897.01809016ÀÓÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

 

 

1.6    ECEFÁÂÇ¥°è·ÎºÎÅÍ GeographicÁÂÇ¥°è·ÎÀÇ º¯È¯ ¿¹Á¦

 

1.6.1         buttonECEFToGeo_Click¹öÆ°À» ´õºíŬ¸¯ÇÏ¿© ÇÔ¼ö¸¦ ÀÚµ¿»ý¼ºÇÑ´Ù.

private void buttonECEFToGeo_Click (object sender, RoutedEventArgs e)
{

}

 

1.6.2         buttonECEFToGeo_Click ÇÔ¼ö¿¡ ´ÙÀ½°ú °°ÀÌ Äڵ带 ÀÔ·ÂÇÑ´Ù.

private void buttonECEFToGeo_Click (object sender, RoutedEventArgs e)
{
// ECEFÁÂÇ¥°è·ÎºÎÅÍ Lat/Lon(À§°æµµ)ÁÂÇ¥°è·Î º¯È¯Çϱâ
        //  1. ECEF°ªÀ» ¼³Á¤
        XGeoPoint geo = new XGeoPoint();
        XVertex3d ecr = new XVertex3d();
        ecr.x = -3109559.9281960232;
        ecr.y = 4126525.4002308655;
        ecr.z = 3728897.0180901629;

//  2. À§°æµµ°ªÀ» ¾ò´Â´Ù
Xfn.EcrToGeo(ecr, ref geo);

// 3. °á°ú°ªÀ» ÇÁ¸°Æ®ÇÑ´Ù.
Console.WriteLine("Longitude : " + geo.lond.ToString() + 
" Latitude : " + geo.latd.ToString() + " Height : " +
 geo.hgt.ToString());
}

1.6.3         ÄÄÆÄÀÏÇÏ°í ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¿© ECEF To Geo¹öÆ°À» Ŭ¸¯ÇÑ´Ù.

 

1.6.4         Ãâ·Ââ¿¡ °ªÀÌ ÇÁ¸°Æ®µÊÀ» È®ÀÎÇÑ´Ù.

ÂüÁ¶ À§Ä¡ ECEF°ªÀÌ X : -3109559.92819602 Y : 4126525.40023087 Z : 3728897.01809016ÀÎ Geographic ÁÂÇ¥°è °ªÀº 127, 36(°æÀ§µµ)ÀÌ°í °íµµ°¡ 1200meterÀÎ À§Ä¡ÀÇ ÀÓÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.