WPF – XDL Tutorial

XDL MapView È°¿ë ³×¹ø°

(piXoneer XDL Tutorial)

 

 

 

 

 

 

 NXMapView¸¦ È°¿ëÇÏ¿© ¿©·¯ÀåÀÇ TifÆÄÀÏÀ»

 µµ½ÃÇÏ´Â ±â´ÉÀ» ±¸ÇöÇÕ´Ï´Ù.

 

 

2019. 04.

 

 

¸ñÂ÷

XDL MapView È°¿ë ³×¹ø°... 1

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

1.1    NXMapView¸¦ ÀÌ¿ëÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ ¸¸µé±â... 1

1.2    Driverº¹»çÇϱâ... 1

1.3    ¸Þ´º »ý¼ºÇϱâ... 1

1.4    NXMapViewÄÁÆ®·Ñ ¿Ã¸®±â... 1

1.5    ¿µ»ó ¿­±â ±â´É... 1

 

 

 

 

1     »ç¿ëÇϱâ

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

 

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

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

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

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

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

 

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

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

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

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

1.2    Driverº¹»çÇϱâ

Driver´Â ÇöÀç µ¥¸ð ¹öÀü¿¡¼­´Â ¼³Ä¡µÈ °æ·Î·ÎºÎÅÍ ½ÇÇà °æ·Î ÇϺηΠÁ÷Á¢ º¹»çÇÏ¿© ³Ö¾î¾ß ÇÑ´Ù. Â÷±â ¹öÀüÀº º¹»ç¸¦ ÇÏÁö ¾Ê¾Æµµ ½ÇÇàµÉ ¼ö ÀÖµµ·Ï ±¸¼ºµÈ´Ù.

 

1.2.1     XDL ¶óÀ̺귯¸®°¡ ¼³Ä¡µÈ °æ·Î(C:\Pixoneer\XDL1.2\bin)·Î À̵¿ÇÑ´Ù.

 

1.2.2     IODriversÆú´õ¸¦ Åë°·Î º¹»çÇÏ¿© ÇöÀç ÇÁ·ÎÁ§Æ®ÀÇ ¡°¡¦..\XDL_MapView4\bin\Debug¡±Æú´õ ÇϺο¡ º¹»çÇÏ¿© ³Ö´Â´Ù.

1.2.3     F5Å°¸¦ ´­·¯ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¸é ´ÙÀ½°ú °°ÀÌ ±¸¼ºµÈ´Ù.

 

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

1.3.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.4    NXMapViewÄÁÆ®·Ñ Ãß°¡Çϱâ

1.4.1     Grid ·¹À̾ƿô ³»ºÎ¿¡¼­ µÎ ¹ø° Cell¿¡ Grid¸¦ ¹èÄ¡ÇÑ´Ù. WindowsFormsHost ÄÁÆ®·ÑÀ» µµ±¸»óÀڷκÎÅÍ ²ø¾î¼­ »ý¼ºÇϰųª XAML â¿¡ ÀÔ·ÂÇÏ¿© »ý¼ºÇÑ´Ù. ÀÌ´Â Window forms¸¦ Hosting ÇØÁÖ´Â °³Ã¼À̸ç Window Forms ControlÀ» »ç¿ëÇÒ ¶§ ÀÌ¿ëµÈ´Ù. (WindowFormIntegration¿Í System.Window.FormsÀ» ¾î¼Àºí¸®¿¡ ´ëÇÑ ÂüÁ¶ Ãß°¡¸¦ ÇÑ´Ù.)

1.4.2     ¾Õ¼­ Ãß°¡ÇÑ 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.4.3     [F5]Å°¸¦ ´­·¯ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù.

 

 

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

 

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

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

 

 

private void openFileMenuItem_Click(object sender, RoutedEventArgs e)
{

}

 

1.5.2     View ±¸Çö½Ã ÇÊ¿äÇÑ XRasterIO°´Ã¼¸¦ ¼±¾ðÇÑ´Ù.

public XRasterIO m_RasterIO;    //¿µ»óÀÇ ÀÔÃâ·ÂÀ» ´ã´çÇÒ °´Ã¼ ¼±¾ð

 

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

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

 

1.5.4     [File]-[Opne] ¹öÆ°À» ´­·¶À» ¶§ »ý¼ºµÉ Open ´ëÈ­»óÀÚ¿Í ¼±ÅÃµÈ ÆÄÀÏ¿¡ ´ëÇÑ XRSLoadFile°´Ã¼¸¦ »ý¼ºÇÑ´Ù.

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

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

    string strFilePath = openFileDialog.FileName;

    // FileDriverManger¸¦ ÅëÇØ XRSLoadFile¸¦ »ý¼ºÇÑ´Ù.
    // Tiff¸¦ Á÷Á¢ ·ÎµùÇÏ´Â °æ¿ì ¿µ»ó Å©±â°¡ Å« °æ¿ì µµ½Ã ¼Óµµ¸¦ À§Çؼ­ 
// LOD°¡ ÇÊ¿äÇϱ⠶§¹®¿¡ ÇÊ¿äÇÑ °æ¿ì °°Àº Æú´õ¿¡ .xdl ÆÄÀÏÀ» »ý¼ºÇÑ´Ù.
    string strError;
    XRSLoadFile xrsFileInput1 = m_RasterIO.LoadFile(strFilePath, out strError,
 false, eIOCreateXLDMode.All_NoMsg);
    if (xrsFileInput1 == null) return;

    // ´Ù½Ã Original Imange¿¡ ´ëÇÑ Composite¿Í Processed Image¿¡ ´ëÇÑ Composite¸¦
// »ý¼ºÇÏ¿© ºä ÄÁÆ®·Ñ¿¡ µµ½ÃÇÑ´Ù.
    XDMComposite newComp = CreateComposite(xrsFileInput1, 0, 1, 2);

    // ±âÁ¸¿¡ »ý¼ºµÇ¾î ÀÖ´Â Composite°¡ ÀÖ´Ù¸é LockÀ» °É¾î µµ½Ã ¼öÇàÀ» Àá½Ã ¸ØÃá´Ù.
    nxMapLayerComposite1.Lock();

    // nxMapLayerCompostie1°³Ã¼¿¡ Á¸ÀçÇÏ´Â XDMCompManagerµéÀ» ²¨³½´Ù.
    // XDMCompManager°¡ ½ÇÁ¦·Î CompositeµéÀÇ °ü¸®¸¦ ¼öÇàÇÑ´Ù.
    XDMCompManager xdmCompManager = nxMapLayerComposite1.GetXDMCompManager();

    // »ý¼ºµÈ Compostie¸¦ XDMCompManager¿¡ Ãß°¡ÇÑ´Ù.
    xdmCompManager.AddXDMComposite(ref newComp);

    // Àüü È­¸é º¸±â¸¦ ¼³Á¤ÇÑ´Ù.
    nxMapLayerComposite1.ZoomFit();

    // È­¸é ¾÷µ¥ÀÌÆ®¸¦ ¼öÇàÇÑ´Ù.
    nxMapLayerComposite1.Invalidate();

    // LockÀ» ´Ù½Ã Ç®¾î ÁØ´Ù.
    nxMapLayerComposite1.UnLock();
}

 

XDMComposite CreateComposite(XRSLoadFile xrsFileInput, int nBandIdx0, int nBandIdx1, int nBandIdx2)
{
     // XDMComposite¸¦ »ý¼ºÇÑ´Ù.
     XDMComposite newComp = new XDMComposite();

     // ·ÎµùµÈ ÆÄÀϷκÎÅÍ ¹êµåÀÇ °³¼ö°¡ Ä®¶ó·Î ±×¸± °ÍÀÎÁö Èæ¹éÀ¸·Î ±×¸± °ÍÀÎÁö ÆÇ´ÜÇÑ´Ù.
     // ¸¸¾à 3°³ ¹Ì¸¸ÀÎ °æ¿ì¿¡´Â Gray¸ðµå·Î ±×¸®°í, 3°³ ÀÌ»óÀÎ °æ¿ì´Â Ä®¶ó·Î ±×¸°´Ù.
     int nNumBand = xrsFileInput.NumBand;
     if (nNumBand < 3)   // 3°³ ¹Ì¸¸ÀÇ ¹êµå¸¦ °¡Áö°í ÀÖ´Â °æ¿ì
     {
          // Default·Î 0¹ø° ¹êµå¸¦ Gray ¸ðµå·Î ±×¸°´Ù.
          XDMBand band = xrsFileInput.GetBandAt(0);

          // Gray Mode·Î ±×¸®´Â °ÍÀ» ¼³Á¤
          newComp.Mode = eCompMode.Gray;

          // CompositeÀÇ 0¹ø¿¡ Band ¼³Á¤, Gray ¸ðµå¿¡¼­´Â 0¹ø ¹êµå¸¸À» ÀνÄÇÑ´Ù.
          newComp.SetBand(ref band, nBandIdx0);
          // ¿µ»ó 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 = xrsFileInput.GetBandAt(nBandIdx0);
          XDMBand band2 = xrsFileInput.GetBandAt(nBandIdx1);
          XDMBand band3 = xrsFileInput.GetBandAt(nBandIdx2);
// ÆÄÀÏ À̸§À» CompositeÀ̸§À¸·Î ¼³Á¤
          newComp.Name = xrsFileInput.FileName;

          newComp.Mode = eCompMode.RGB;  // RGB Mode·Î ±×¸®´Â °ÍÀ» ¼³Á¤
          newComp.SetBand(ref band3, nBandIdx0);  // CompositeÀÇ 0¹ø¿¡ Band¼³Á¤,
 Blue Channel ¼³Á¤
          newComp.SetBand(ref band2, nBandIdx1);  // CompositeÀÇ 1¹ø¿¡ Band¼³Á¤,                      
Green Channel ¼³Á¤
          newComp.SetBand(ref band1, nBandIdx2);  // 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 °´Ã¼¿¡ Ãß°¡ÇÑ´Ù.
         return newComp;
}

 

1.5.5     [F5]Å°¸¦ ´­·¯ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ°í ȨÆäÀÌÁö¿¡¼­ ´Ù¿î ¹ÞÀº »ùÇÿµ»óÀ» ½ÇÇà½ÃŲ´Ù. [File]-[Open]¸Þ´º¸¦ ´­·¯ ´Ù¿î¹ÞÀº1.tifÆÄÀÏÀ» ¿¬´Ù. ´Ù½Ã [File]-[Open]¸Þ´º¸¦ ´­·¯ 2.tifÆÄÀÏÀ» ¿¬´Ù.

¸ðÀÚÀÌÅ© µÈ ±×¸²À» È®ÀÎÇÒ ¼ö ÀÖ´Ù.