Какие соответствующие поля нужно установить в libtiff или libgeotiff, учитывая минимальный файл ESRI ASCII? - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть ESRI ASCII-файл в форме:

ncols         5 
nrows         4 
xllcorner     0 
yllcorner     0 
cellsize      10 
NODATA_value  -9999 
25.4 26.1 27 28.6 27.7
25 26 26.4 27.9 27.4
25.1 25.8 26.8 28.6 27.6
27.5 28 27.7 30.6 28.3

И мне нужно использовать libtiff.net (или его C ++-эквивалент, libtiff, или libgeotiff, или GDAL, или любой другойБиблиотеки C # или C ++ ) для преобразования их в файл геотиффов.

Но я просто не знаю, какие поля устанавливать, есть много полей, таких как TIFFTAG_IMAGEWIDTH, TIFFTAG_SAMPLESPERPIXEL или TIFFTAG_BITSPERSAMPLE что я не знаю, имеют ли они отношение или нет.

Если в файле ESRI ASCII, как указано выше, как использовать библиотеку libtiff.net или libtiff для создания файла геотифа?

Почему я это делаю?

Вв моем приложении у меня есть сетка, и мне нужно будет преобразовать сетку в растровый файл.Я хочу создать такой растровый файл Geotiff непосредственно из выборки сетки, не создавая сначала промежуточный ASCII-файл, потому что размер промежуточного файла очень велик по сравнению с конечным выходным файлом Geotiff.

Единственный подход, который я могу придуматьиз это напрямую манипулировать файлом geotiff с помощью libtiff.net, пока я получаю точки сетки на сетке.

Как это сделать, или есть лучший подход?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

На самом деле эту задачу легко выполнить, используя библиотеку GDAL (или ее эквивалент .Net, GDAL.Net).Здесь есть даже пример в Python:

ncols         174
nrows         115
xllcorner     14.97
yllcorner     -34.54
cellsize      0.11

И скрипт Python:

if __name__ == '__main__':
# Import libs
import numpy, os
from osgeo import osr, gdal

# Set file vars
output_file = "out.tif"

# Create gtif
driver = gdal.GetDriverByName("GTiff")
dst_ds = driver.Create(output_file, 174, 115, 1, gdal.GDT_Byte )
raster = numpy.zeros( (174, 115) )

# top left x, w-e pixel resolution, rotation, top left y, rotation, n-s pixel resolution
dst_ds.SetGeoTransform( [ 14.97, 0.11, 0, -34.54, 0, 0.11 ] )

# set the reference info 
srs = osr.SpatialReference()
srs.SetWellKnownGeogCS("WGS84")
dst_ds.SetProjection( srs.ExportToWkt() )

# write the band
dst_ds.GetRasterBand(1).WriteArray(raster)

Преобразование кода в .Net должно быть достаточно тривиальным.

0 голосов
/ 09 декабря 2018

Даже если вы планируете не использовать GDAL в своем приложении (подробнее об этом позже), ничто не мешает вам генерировать геотиф из ESRI ASCII GRID (gdal_translate -of "GTiff" in.asc out.tif) и проверять теги TIFF сгенерированного файла (это необходимые теги для создания геотифа из заданной сетки).

AsTiffTagViewer дает следующий вывод ( аналогично выводу утилиты TiffTags ):

TagCode (Count DataType): Value  // my comments

ImageWidth (1 Short): 5    // ncols
ImageLength (1 Short): 4   // nrows
BitsPerSample (1 Short): 32
Compression (1 Short): Uncompressed
Photometric (1 Short): MinIsBlack
StripOffsets (1 Long): 260
SamplesPerPixel (1 Short): 1
RowsPerStrip (1 Short): 4    //nrows
StripByteCounts (1 Long): 80
PlanarConfig (1 Short): Contig
SampleFormat (1 Short): 3
33550 (3 Double): 
33922 (6 Double): 
42113 (6 ASCII): -9999    // NODATA_value

Как вы можете видеть, есть 11 стандартных тегов Tiff и 3 нестандартных тега (но мы знаем типы данных и, что более важно, размеры этих последних 3 тегов, 3, 6, 6),Давайте подтвердим, что у нас есть 2 тега GeoTiff и один нестандартный GDAL-специфичный тег.

Библиотека Libgeotiff C распространяется с утилитой listgeo для вывода метаданных GeoTIFF.Вывод:

Geotiff_Information:
   Version: 1
   Key_Revision: 1.0
   Tagged_Information:
      ModelTiepointTag (2,3):
         0                0                0                
         0                40               0                
      ModelPixelScaleTag (1,3):
         10               10               0                
      End_Of_Tags.
   Keyed_Information:
      End_Of_Keys.
   End_Of_Geotiff.

Corner Coordinates:
Upper Left    (       0.000,      40.000)
Lower Left    (       0.000,       0.000)
Upper Right   (      50.000,      40.000)
Lower Right   (      50.000,       0.000)
Center        (      25.000,      20.000)

По размерам Tagged_Information мы можем идентифицировать следующие 2 тега.Кроме того, поскольку сетка регулярна (равны промежутки между X и Y, и нет перекошенных линий сетки), мы можем установить следующие формулы:

33550 tag:

ModelPixelScaleTag = [ cellsize , cellsize , 0 ]

33922 тег:

ModelTiepointTag = [ 0 , 0 , 0 , UpperLeftCorner_X , UpperLeftCorner_Y , 0] 

    where
            UpperLeftCorner_X = xllcorner 

            UpperLeftCorner_Y = yllcorner + cellsize * nrows

То есть последний тег 42113.Формат geotiff не имеет стандартного тега для значения nodata.GDAL сохраняет значение узловой полосы в нестандартном теге TIFFTAG_GDAL_NODATA ASCII (код 42113).

Наконец, в качестве примера, мы можем написать функцию, которая связывает заголовок сетки (ncols, nrows, cellsize, xllcorner, yllcorner) с тегами Tiff, используя библиотеку Libgeotiff C:

void SetUpTIFFDirectory(TIFF *tif)
{
    double tiepoints[6];
    double pixscale[3];

    double upperLeftCorner_X, upperLeftCorner_Y;

    upperLeftCorner_X = xllcorner;

    upperLeftCorner_Y = yllcorner + (cellsize*nrows);

    tiepoint[0] = 0.0;
    tiepoint[1] = 0.0;
    tiepoint[2] = 0.0;
    tiepoint[3] = upperLeftCorner_X;
    tiepoint[4] = upperLeftCorner_Y;
    tiepoint[5] = 0.0;

    pixscale[0] = cellsize;
    pixscale[1] = cellsize;
    pixscale[2] = 0.0;

    TIFFSetField(tif,TIFFTAG_IMAGEWIDTH,    ncols);
    TIFFSetField(tif,TIFFTAG_IMAGELENGTH,   nrows);
    TIFFSetField(tif,TIFFTAG_BITSPERSAMPLE, 32);
    TIFFSetField(tif,TIFFTAG_COMPRESSION,   COMPRESSION_NONE);
    TIFFSetField(tif,TIFFTAG_PHOTOMETRIC,   PHOTOMETRIC_MINISBLACK);
    TIFFSetField(tif,TIFFTAG_STRIPOFFSETS,  260L);
    TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL, 1);
    TIFFSetField(tif,TIFFTAG_ROWSPERSTRIP, nrows;
    TIFFSetField(tif,TIFFTAG_STRIPBYTECOUNTS, 80L);
    TIFFSetField(tif,TIFFTAG_PLANARCONFIG,  PLANARCONFIG_CONTIG);
    TIFFSetField(tif,TIFFTAG_SAMPLEFORMAT,  3;

    TIFFSetField(tif,GTIFF_TIEPOINTS, 6,tiepoints);
    TIFFSetField(tif,GTIFF_PIXELSCALE, 3,pixscale);

}

Примечание. Когда вы говорите, что не можете использовать GDAL, существует формат In Memory Raster, который, вероятно, можно использовать в качестве временного заполнителя для вашего растра при добавлении сетки.образцы:

https://www.gdal.org/frmt_mem.html

...