Я загрузил большой набор файлов DEM GridFloat (.flt, .hdr) из USGS NED (1"), чтобы реализовать собственный сервис высот на своем веб-сайте. Я хотел бы иметь возможность искать высотные отметки из этого набора файлов. , учитывая широту и долготу в качестве входных данных. Я использую Perl для разработки своего веб-сайта. Файлы имеют обычную схему именования, и я могу получить соответствующее имя файла плитки, используя широту / долготу. Однако доступ к внутренней части файла находится там, где У меня проблема.
Я знаю, что файл имеет довольно простой формат (.flt, по-видимому, называется «Gridfloat»), но мне не помешала бы помощь в выяснении магических чисел для расчета, где в файле мне нужно искать для заданной широты/долготы, и как обрабатывать порядок байтов и т. д., чтобы я получил высоту. Насколько я понимаю, очевидно, что порядок строк может быть проблемой, а также порядок байтов. Я ищу рецепт, который не предполагает использования каких-либо сторонних библиотек, таких как GDAL, которые, как мне кажется, слишком сложны и медленны для того, что я хочу сделать. Я думаю, что должна быть возможность просто открыть файл, найти позицию на основе некоторых вычислений, прочитать несколько байтов, а затем распаковать их в правильном порядке байтов. Вот пример файла .hdr, который сопровождает floatn48w097_1.flt, я думаю, в нем есть необходимая информация. Вместе с .zip поставляется множество других файлов, включая .prj, но я полагаю, что они предназначены для коммерческой программы, такой как ArcInfo. Я думаю, что все, что мне нужно, должно быть в следующем файле .hdr.
ncols 3612
nrows 3612
xllcorner -97.00166666667
yllcorner 46.99833333333
cellsize 0.000277777777778
NODATA_value -9999
byteorder LSBFIRST
На что я действительно надеюсь, так это на формулу для вычисления строки и столбца из широты/длины, а затем еще одну формулу для перевода строки/столбца в позицию для поиска, сколько байтов нужно прочитать и как преобразовать эти необработанные байты. в целое число (или что-то еще, что эти файлы содержат). Я чувствую, что это может быть очень быстрая операция без всех накладных расходов, связанных с большими библиотеками, которые, похоже, сосредоточены на выполнении множества вещей, которые мне не нужны.
Мне не нужен код Perl, просто псевдокод, показывающий расчеты для смещений строк/столбцов и т.д., был бы более чем достаточным. Я считаю, что файлы имеют двоичный формат, простую сетку 4-байтовых чисел. Пример файла, который идет с файлом .hdr выше, имеет размер 52186176, и когда вы умножаете ncols на nrows (из .hdr), вы получаете 13046544., что хорошо делится на размер файла на 4. Поэтому я предполагаю, что это просто вопрос получения правильной формулы для строки / столбца на основе широты / долготы, а затем получения байтов в правильном порядке. Я просто не так много сделал.
Я нашел ссылку на формат Gridfloat здесь: coolutils.com/formats/flt, так что, очевидно, файл состоит из сетки 64-битных значений с плавающей запятой.
Спасибо!
pack
иunpack
. Возможно, что-то вродеmy @vals = do { local $/; open my $fh, '<', $file or die $!; unpack 'V*', <$fh> };
, что даст вам массив значений для индексации или повторения. - person ThisSuitIsBlackNot   schedule 22.08.2014unpack
файл в массив один раз. Массив будет большим (не менее 400 МБ в 32-разрядной системе для файла примера, исходя из предварительных расчетов), но вы можете легко его проиндексировать, например.my $elev = $array[42];
Когда у вас есть фактические высоты в таком массиве, вам не нужно беспокоиться о порядке следования байтов (вы уже сделали это сunpack
); вам просто нужно вычислить смещение в массиве на основе размера ячейки и координат одного из углов. - person ThisSuitIsBlackNot   schedule 22.08.2014unpack
, что потребует значительно меньше памяти. - person ThisSuitIsBlackNot   schedule 22.08.2014