Даже если вы планируете не использовать 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