Looking for RUSSIAN SharpMap users

Topics: General Topics
Mar 22, 2007 at 7:02 AM
Edited Mar 22, 2007 at 7:18 AM
Привет всем...
Предлагаю устроить в данной ветке небольшую комьюнити для руcскоязычных пользователей ШарпМапа.
Если таковые имеются :)
Mar 22, 2007 at 8:02 AM
Привет. Я не против :)
Mar 22, 2007 at 8:09 AM
Я тоже не против... :)
Mar 22, 2007 at 1:06 PM
Я тоже ЗА!
Mar 25, 2007 at 4:47 PM
Вопрос следующего характера: проблема отображения многоканальных растров в формате IMG (Erdas Imagine) с помощью gdal провайдера.
Проблема заключается в том, что независимо от количества каналов, на выходе gdal провайдер всегда возвращает ч.б. растр. Применение патча http://www.codeplex.com/SharpMap/WorkItem/View.aspx?WorkItemId=8873 не помогло - патч работает только со сжатыми растрами.
После прохода под дебагером выяснилась интересная деталь - проблема заключается либо в самой библиотеки либо во врапере gdal: для всех бэндов GetRasterColorInterpretation() возвращает одно и то же значение, в результате провайдер генерит ч.б. растр.
FWTools эти растры съедает на ура - все отрисовывается нормально.
Встречался ли кто нить с такой проблемой и кто как борется с этим?
Mar 25, 2007 at 9:12 PM
Edited Mar 25, 2007 at 9:19 PM
Привет. Сам с такой проблемой не встречался но возможно кое-чем помогу. В одном из мартовских коммитов в svn репозитарий gdal был добавлен пример на C# работы с RGB palette растрами. Расположен он в файле gdal\swig\csharp\apps\GDALReadDirect.cs, метод SaveBitmapPaletteDirect. Содержимое его несколько отличается от патча по приведенной тобой ссылке. На всякий случай вот исходный код:

private static void SaveBitmapPaletteDirect(Dataset ds, string filename) 
{
    // Get the GDAL Band objects from the Dataset
    Band band = ds.GetRasterBand(1);
 
    ColorTable ct = band.GetRasterColorTable();
    if (ct == null)
    {
        Console.WriteLine("   Band has no color table!");
        return;
    }
 
    if (ct.GetPaletteInterpretation() != PaletteInterp.GPI_RGB)
    {
        Console.WriteLine("   Only RGB palette interp is supported by this sample!");
        return;
    }
 
    // Get the width and height of the Dataset
    int width = ds.RasterXSize;
    int height = ds.RasterYSize;
 
    // Create a Bitmap to store the GDAL image in
    Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
 
    DateTime start = DateTime.Now;
    
    byte[] r = new byte[width * height];
    
    band.ReadRaster(0, 0, width, height, r, width, height, 0, 0);
    // Use GDAL raster reading methods to read the image data directly into the Bitmap
    BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);
 
    try 
    {
        int iCol = ct.GetCount();
        ColorPalette pal = bitmap.Palette;
        for (int i = 0; i < iCol; i++)
        {
            ColorEntry ce = ct.GetColorEntry(i);
            pal.Entries[i] = Color.FromArgb(ce.c4, ce.c1, ce.c2, ce.c3);
        }
        bitmap.Palette = pal;
        
        int stride = bitmapData.Stride;
        IntPtr buf = bitmapData.Scan0;
 
        band.ReadRaster(0, 0, width, height, buf, width, height, DataType.GDT_Byte, 1, stride);
        TimeSpan renderTime = DateTime.Now - start;
        Console.WriteLine("SaveBitmapDirect fetch time: " + renderTime.TotalMilliseconds + " ms");
    }
    finally 
    {
        bitmap.UnlockBits(bitmapData);
    }
 
    bitmap.Save(filename);
}

Возможно это чем-то тебе поможет.
Mar 25, 2007 at 9:59 PM
Хмм... Хорошая идея - порыться в исходника gdal'a )
Честно сказать - как то не было времени капаться в исходниках gdal'a, но похоже другого выхода нет.
Тем более исходники FWTools тоже открытые - думаю что решение проблемы можно найти именно в них.
Большой спасиб за наводку :)