Создайте Geotiff, используя "LibTiff.Net", и добавьте географическую информацию - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь создать файл geotiff (данные высотной матрицы высот), используя Libtiff.Net.
Проблема в том, что мне никогда не удавалось добавить следующие два тега:

TiffTag.GEOTIFF_MODELTIEPOINTTAG
TiffTag.GEOTIFF_MODELPIXELSCALETA

Чтобы добавить тег, я написал следующий код:

tiff.SetField(TiffTag.GEOTIFF_MODELTIEPOINTTAG, 0.0, 0.0, 0.0, leftTopX, leftTopY, 0.0);
tiff.SetField(TiffTag.GEOTIFF_MODELPIXELSCALETAG, pixelScaleX, pixelScaleY, 0.0);

В соответствии с описанием метода «SetField», метод возвращает «true», если значение тега было установлено успешно.
Однаков моем случае метод никогда не возвращается при попытке добавить вышеупомянутые 2 тега.
(другие теги могут быть добавлены без проблем.)

Я уже подтвердил, что созданный геотиф не содержит географическогоинформация с использованием других программ ГИС, таких как ArcGIS.

Я что-то упустил или сделал что-то не так?
Будут благодарны за любые подсказки или ответы!


Для вашего удобства кодЯ пока пишу следующее:
public void WriteTiff()
{
   using (var tiff = Tiff.Open("C:\\test\\newCreated.tif", "w"))
   {
       if (tiff == null)
           return;

       int width = 100;
       int height = 100;
       int byteDepth = 4;
       int tileSize = 64;

       //Geo info to add
       double leftTopX = 10000;
       double leftTopY = 15000;
       double pixelScaleX = 1;
       double pixelScaleY = 1;

       //Set the basic tags
       tiff.SetField(TiffTag.IMAGEWIDTH, width);
       tiff.SetField(TiffTag.IMAGELENGTH, height);
       tiff.SetField(TiffTag.SAMPLESPERPIXEL, 1);
       tiff.SetField(TiffTag.BITSPERSAMPLE, 8 * byteDepth);
       tiff.SetField(TiffTag.ORIENTATION, Orientation.TOPLEFT);
       tiff.SetField(TiffTag.ROWSPERSTRIP, height);
       tiff.SetField(TiffTag.XRESOLUTION, 88);
       tiff.SetField(TiffTag.YRESOLUTION, 88);
       tiff.SetField(TiffTag.RESOLUTIONUNIT, ResUnit.INCH);
       tiff.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);
       tiff.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISBLACK);
       tiff.SetField(TiffTag.COMPRESSION, Compression.NONE);
       tiff.SetField(TiffTag.FILLORDER, FillOrder.MSB2LSB);
       tiff.SetField(TiffTag.SOFTWARE, "MyLib");
       tiff.SetField(TiffTag.SAMPLEFORMAT, SampleFormat.IEEEFP);

       //Set the size of the tile
       tiff.SetField(TiffTag.TILEWIDTH, tileSize);
       tiff.SetField(TiffTag.TILELENGTH, tileSize);

       //set the geographics info
       //The following two lines never succeeded....
       tiff.SetField(TiffTag.GEOTIFF_MODELTIEPOINTTAG, 0.0, 0.0, 0.0, leftTopX, leftTopY, 0.0);
       tiff.SetField(TiffTag.GEOTIFF_MODELPIXELSCALETAG, pixelScaleX, pixelScaleY, 0.0);

       //Write the tile data here
       //........
       //
   }
}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Я мог бы наконец добавить географическую информацию к своему изображению tiff следующим образом:

  1. Определить метод для метода "Tiff.TagExtender".

    public void TagExtender(Tiff tiff)
    {
        TiffFieldInfo[] tiffFieldInfo = 
        {
            new TiffFieldInfo(TiffTag.GEOTIFF_MODELTIEPOINTTAG, 6, 6, TiffType.DOUBLE, FieldBit.Custom, false, true, "MODELTILEPOINTTAG"),
            new TiffFieldInfo(TiffTag.GEOTIFF_MODELPIXELSCALETAG, 3, 3, TiffType.DOUBLE, FieldBit.Custom, false, true, "MODELPIXELSCALETAG")
        };
    
        tiff.MergeFieldInfo(tiffFieldInfo, tiffFieldInfo.Length);
    }
    
  2. Установите метод расширения тега, который определен в # 1.
    Примечание. Этот метод должен называться «ДО», чтобы открыть или создать изображение tiff для вступления в силу.

    Tiff.SetTagExtender(TagExtender);
    
  3. Открыть изображение tiff:

    this.tiff = Tiff.Open(fileName, "w");
    
  4. Добавить тег (+ обязательные базовые теги):
    Сложная частьявляется то, что значения (массив двойной) должны приводить к объекту.
    В противном случае существует вероятность, что метод SetField выдает исключение.

    double[] tiePoints = new double[] { 0, 0, 0, this.TopLeftX, this.TopLeftY, 0 };
    this.tiff.SetField(TiffTag.GEOTIFF_MODELTIEPOINTTAG, 6, (object)tiePoints);
    double[] pixelScale = new double[] { this.PixelScaleX, this.PixelScaleY, 0 };
    this.tiff.SetField(TiffTag.GEOTIFF_MODELPIXELSCALETAG, 3, (object)pixelScale);
    
  5. Сделайте что-нибудь, связанное со значениями пикселей.

  6. Готово!

0 голосов
/ 23 сентября 2018

LibTiff.Net не может записывать TiffTag.GEOTIFF_MODELTIEPOINTTAG и TiffTag.GEOTIFF_MODELPIXELSCALETAG из коробки.Все теги, которые библиотека может записать из коробки, перечислены в файле Tiff_DirInfo.cs.

Метод SetField возвращает false, когда вы пытаетесь написать неизвестный тег.Библиотека также выдает сообщение об ошибке в консоль.

Вы можете научить библиотеку писать эти теги GEOTIFF, используя код, подобный коду в этом примере

Добавить пользовательские теги TIFFк существующему образу TIFF

...