John Cichy wrote:
>
> Hello all,
Hello,
> I have a binary I*2 format data file that I would like to extract data from.
> The file comes with a discription file that contains a fortran sub to extract
> the data. For the life of me I can't figure out how to accomplish the extraction.
> The following is from the description file nad includes the fortran sub:
>
> ---begin paste
>
> 2. The goes.nav is a file containing latitude/longitude data which can be
> used with satellite images in this directory to pinpoint geographical
> locations on goes-8 images. The file is binary I*2 format with the
> first two values being the pixel and line (x,y) size of the image.
> The succeeding pairs of elements are I*2 values of latitude longitude * 100.
> Compared to the goes image, the lat/lon pairs are stored by column first,
> then row; i.e. all the elements in row 1 are stored, then row 2 etc until
> the bottom of the image.
>
> The following is a fortran subroutine that can be used to read
> the goes.nav file:
>
> subroutine getnav(lat,lon)
> c************************************************************************
> c* This routine reads goes.nav files with a maximum size of *
> c* 2000 pixels wide and 2000 lines/records and stores *
> c* latitude/longitude data into lat lon *
> c* the format of the goes.nav data is as follows *
> c* *
> c* i*2 i*2 *
> c* | | *
> c* V V *
> c* record 1 x size ysize *
> c* record 2 lat *100 lon*100 *
> c* record 3 lat *100 lon*100 *
> c* record 4 etc etc *
> c* *
> c************************************************************************
> character file_name*80
> real lat(2000,2000),lon(2000,2000)
> c
> c
> integer*2 tempstor(2)
> integer*4 buffout,record_count,xsize,ysize,yyyy,xxxx
> equivalence (buffout,tempstor(1))
> C
> C
> C PLEASE NOTE: recl=1 in the open statment below means
> C that the record length is 32 bits ( 4 bytes)
> C not 8 bits (1 byte)
> open(23,file='goes.nav',access='direct',recl=1,status='old')
> READ(23,REC=1)buffout
> C
> C
> xsize=tempstor(1)
> C
> C
> ysize=tempstor(2)
> type *,' width =',xsize, ' height =',ysize
> C
> C
> record_count=1
> do yyyy=1,ysize
> do xxxx=1,xsize
> record_count = record_count + 1
> read(23,rec=record_count)buffout
> lat(xxxx,yyyy)=tempstor(1) * .01
> lon(xxxx,yyyy)=tempstor(2) * .01
> c ...............................................
> c NOTE: LATITUDE VALUES OFF THE EARTH ARE 99.00
> C AND LONGITUDE VALUES ARE -256.35999 AT THIS
> C POINT IN THE SUBROUTINE
> C ...............................................
> end do
> end do
> RETURN
> END
>
> ----end paste
Well, my FORTRAN is a little rusty (to say the least) but I'll give it a shot.
(caveat: this is a literal translation and isn't very "Perlish". YMMV)
my $file = 'goes.nav';
open FILE, $file or die "Cannot open $file: $!";
$/ = \4;
my ( $xsize, $ysize ) = unpack 'ss', scalar <FILE>;
print " width=$xsize height=$ysize\n";
my ( @lat, @lon );
for my $yyyy ( 1 .. $ysize ) {
for my $xxxx ( 1 .. $xsize ) {
( $lat[$xxxx][$yyyy], $lon[$xxxx][$yyyy] ) = map $_ *= 0.01, unpack 'ss',
scalar <FILE>;
}
}
John
--
use Perl;
program
fulfillment
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]