WPF - XDL Tutorial

XDL MapView È°¿ë ¼¼¹ø°

(piXoneer XDL Tutorial)

 

 

 

 

 

 NXMapView¸¦ ÀÌ¿ëÇÏ¿© Original Image¿Í ÇÊÅ͸µµÈ °á°ú¸¦

Áßø½ÃÄÑ SwapÇÏ´Â ±â´ÉÀ» ±¸ÇöÇÕ´Ï´Ù.

 

 

2019. 04.

 

 

¸ñÂ÷

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 2015À» ½ÇÇàÇÑ´Ù.

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

 

 

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

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

 

 

1.1.4     ¼Ö·ç¼Ç Ž»ö±âÀÇ ÇÁ·ÎÁ§Æ® ÇϺÎÀÇ [ÂüÁ¶]ÀÇ ¿À¸¥ÂÊ ¸¶¿ì½º Ŭ¸¯À» ÅëÇØ [ÂüÁ¶Ãß°¡]¸¦ ¼±ÅÃÇÑ´Ù

 

 

1.1.5     ¼Ö·ç¼Ç Ž»ö±âÀÇ ÇÁ·ÎÁ§Æ® ÇϺÎÀÇ [ÂüÁ¶]ÀÇ ¿À¸¥ÂÊ ¸¶¿ì½º Ŭ¸¯À» ÅëÇØ [ÂüÁ¶Ãß°¡]¸¦ ¼±ÅÃÇÑ´Ù.

1.1.6     [ã¾Æº¸±â]ÅÇÀ¸·Î À̵¿ÇÑ ÈÄ ¡°C:\Pixoneer\XDL1.2\bin\¡±°æ·Î·Î À̵¿ÇÑ´Ù. CtrlÅ°¸¦   
´©¸¥ ä ¿¬¼ÓÀ¸·Î ¡°NXDL.dll¡±, ¡°NXDLcc.dll¡±, ¡°NXDLgr.dll¡±, ¡°NXDLio.dll¡±, ¡°NXDLrs.dll¡±, ¡°NXMap.dll¡±À» ¼±ÅÃÇÑ ÈÄ ¡°È®ÀΡ±¹öÆ°À» ¼±ÅÃÇÑ´Ù.

 

1.1.7     ¼Ö·ç¼Ç Ž»ö±âÀÇ ÇÁ·ÎÁ§Æ® ÇϺÎÀÇ [ÂüÁ¶]Ç׿¡ NXDL, NXDLcc, NXDLgr, NXDLio, NXDLrs, NXMap°¡ Ãß°¡µÇ¾úÀ½À» È®ÀÎÇÑ´Ù.

1.1.8     MapViewÄÁÆ®·ÑÀ» È°¿ëÇϱâ À§ÇØ MainWindow.xaml â¿¡¼­ namespace¸¦ ´ÙÀ½°ú °°ÀÌ Ãß°¡ÇÑ´Ù.

 

 

1.2    ¸Þ´º »ý¼ºÇϱâ

1.2.1      MainWindow.xamlâ¿¡¼­ ±âº»À¸·Î »ý¼ºµÈ Grid ·¹À̾ƿô¿¡ Grid.RowDefinitionÀ» ÀÌ¿ëÇÏ¿© µÎ °³ÀÇ RowÀ» »ý¼ºÇÑ´Ù. Menu¸¦ ù ¹ø° Cell¿¡ ¹èÄ¡ÇÏ°í MenuItem Ç׸ñÀ» Ãß°¡ÇÏ°í Ç¥¸¦ Âü°íÇÏ¿© [File]-[Open]À» ÀÔ·ÂÇÏ¿© »ý¼ºÇÑ´Ù. (¸Þ´º »ý¼º¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº XDL MapView1À» Âü°íÇÑ´Ù.)

 

 

Control Type

Header

Name

MenuItem

_File

 

MenuItem

_Open

openFileMenuItem

 

¸Þ´º¸¦ »ý¼ºÇÏ¸é ´ÙÀ½°ú °°Àº XAML âÀÌ ¾òÀ½À» ¾Ë ¼ö ÀÖ´Ù.

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="30"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <Menu Grid.Row="0">
        <MenuItem Header="_File" Margin="5,5,0,0">
        <MenuItem x:Name="openFileMenuItem" Header="_Open"/>
</MenuItem>
    </Menu>
</Grid>

1.3    NXMapViewÄÁÆ®·Ñ Ãß°¡Çϱâ

1.3.1     µÎ ¹ø° Cell¿¡ Grid¸¦ ¹èÄ¡ÇÏ°í WindowsFormsHost ÄÁÆ®·ÑÀ» ¹èÄ¡ÇÑ´Ù. ÀÌ ÄÁÆ®·ÑÀº Window forms¸¦ Hosting ÇØÁÖ´Â °³Ã¼À̸ç Window Forms ControlÀ» ÀÌ¿ëÇÒ ¶§ »ç¿ëµÈ´Ù. (WindowFormIntegration¿Í System.Window.Forms À» ¾î¼Àºí¸®¿¡ ´ëÇÑ ÂüÁ¶ Ãß°¡¸¦ ÇÑ´Ù.)

1.3.2     Grid ·¹À̾ƿô¿¡ WindowFormsHost¸¦ ÀÔ·ÂÇÏ°í ¾Õ¼­ Ãß°¡ÇÑ namespaceÀÎ nxMap¸¦ ÀÌ¿ëÇÏ¿© NXMapViewÄÁÆ®·ÑÀ» ºÒ·¯¿Â´Ù. ÀÌ NXMapViewÀÇ À̸§Àº nxMapView1À¸·Î ÇÑ´Ù.

<Grid Grid.Row="1">
       <WindowsFormsHost  Margin="3,0,3,3">
           <nxMap:NXMapView x:Name="nxMapView1">
                  
</nxMap:NXMapView>
       </WindowsFormsHost>
</Grid>

.

1.3.3     NXMapLayerCompLink¸¦ Ãß°¡ÇÏ¿© NXMapView ÄÁÆ®·Ñ À§¿¡ ¿Ã·Á ³õ´Â´Ù.

NXMapLayerCompLink´Â µ¿½Ã¿¡ µ¿ÀÏÇÑ ºä¿¡¼­ 2°³ÀÇ ÄÄÆÛÁöÆ®¸¦ ºñ±³ÇÏ¿© µµ½ÃÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â ÄÁÆ®·ÑÀÌ´Ù.

<Grid Grid.Row="1">
       <WindowsFormsHost  Margin="3,0,3,3">
           <nxMap:NXMapView x:Name="nxMapView1">
               <nxMap:NXMapView.Controls>
                  <nxMap:NXMapLayerCompLink x:Name="nxMapLayerCompLink1"/>
               </nxMap:NXMapView.Controls>
</nxMap:NXMapView>
       </WindowsFormsHost>
</Grid>

 

 

1.3.4     [F5]Å°¸¦ ´­·¯ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù.

 

 

1.4    ¿µ»ó ¿­±â ±â´É

1.4.1     XAMLâ¿¡¼­ [File]-[Open]À» ´õºí Ŭ¸¯ÇÏ¿© ÇÔ¼ö¸¦ ÀÚµ¿ »ý¼ºÇÑ´Ù.

 

 

private void openFileButton_Click(object sender, RoutedEventArgs e)
{

}

 

1.4.2     LinkView ±¸Çö½Ã ÇÊ¿äÇÑ XRSLoadFile°ú XRasterIO°´Ã¼¸¦ ¼±¾ðÇÑ´Ù.

public XRasterIO m_RasterIO;       //¿µ»óÀÇ ÀÔÃâ·ÂÀ» ´ã´çÇÒ °´Ã¼ ¼±¾ð
XRSLoadFile xrsFileInput1 = null; // ¿µ»ó µð½ºÇ÷¹ÀÌ¿ë ÆÄÀÏ °´Ã¼ ¼±¾ð
XRSLoadFile xrsFileInput2 = null; // ¿µ»ó 󸮿ë ÆÄÀÏ °´Ã¼ »ý¼º

 

1.4.3     Window»ý¼ºÀÚ¿¡¼­ XRasterIOÀÇ °´Ã¼ »ý¼º ¹× NXMapLayerCompLink¿¡ ´ëÇÑ ¼Ó¼ºÀ» º¯°æÇÑ´Ù.

public MainWindow()
{
     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] ¹öÆ°À» ´­·¶À» ¶§ »ý¼ºµÉ Open ´ëÈ­»óÀÚ¿Í ¼±ÅÃµÈ ÆÄÀÏ¿¡ ´ëÇÑ XRSLoadFile°´Ã¼¸¦ »ý¼ºÇÑ´Ù.

private void openFileButton_Click(object sender, RoutedEventArgs e)
{
      // 1. ÆÄÀÏ OpenÀ» ¼öÇàÇÑ´Ù.
      OpenFileDialog openFileDialog = new OpenFileDialog();
      openFileDialog.Filter = "XDM file(*.xdm)|*.XDM||";
      openFileDialog.RestoreDirectory = true;

      Nullable<bool> result = openFileDialog.ShowDialog();
      if (result != true) 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 °³Ã¼¿¡ Á¸ÀçÇÏ´Â XDMCompMangerµéÀ» ²¨³½´Ù. 
// 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);
// ÆÄÀÏ À̸§À» CompositeÀ̸§À¸·Î ¼³Á¤
        newComp.Name = xrsFileInput1.FileName; 

        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]Å°¸¦ ´­·¯ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù. ¿ÞÂÊ ¸¶¿ì½º ¹öÆ°À» Ŭ¸¯ÇÑ Ã¤·Î Á¿ì·Î À̵¿½ÃŲ´Ù.