home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 September / Simtel20_Sept92.cdr / msdos / worldmap / mapvu20.arc / MP1TOMPX.PAS < prev    next >
Pascal/Delphi Source File  |  1989-01-11  |  14KB  |  370 lines

  1. Program mp1tompx;  { WorldMap data file preprocessor }
  2. { convert .MP1 text file with map data to .MP0, .MP2 or .MP3 binary file     }
  3. { .MP3 format : precomputed values for fast MAPVIEW execution (4 byte reals) }
  4. { .MP2 format : precomputed values for fast MAPVIEW execution (6 byte reals) }
  5. { .MP0 format : very compact data format                                     }
  6.  
  7. { For file formats, see below: TYPEs mp2rec rsp. mp0rec                      }
  8. { For further description, see MAPVIEW.DOC                                   }
  9. { Specify /2, /3 or /0 on command line; default is /2.                       }
  10. { A file name must be specified on the command line. If the extension is     }
  11. { MP1, it will be processed; if it is LST, it is assumed to be a list file   }
  12. { as used by MapView. If the extension is missing, LST will be assumed.      }
  13. { Any other extension is an error.                                           }
  14.  
  15. { Original conversion programmes by:                                         }
  16. { Ton van den Bogert  <WWDONIC@HEITUE5.BITNET>                               }
  17. { Kenneth van Camp    <kvancamp@ARDEC.ARPA>                                  }
  18. { Combined conversion programmes, changed MP0 format,                        }
  19. { tweaked and adapted to TP5.0:                                              }
  20. { Gisbert W.Selke  <RECK@DBNUAMA1.BITNET> 17 Dec 1988                        }
  21.  
  22. {$R-,B-,S+,I+,N+,E+}
  23. {$M 65500,65500,560000}
  24.  
  25.   Const bufsize = 63500;
  26.  
  27.   Type
  28.     mp2rec = Record rectyp: byte;       { record type: 1 is start of segment }
  29.                     lon, lat: real;     { longitude and latitude }
  30.                     merclat: real;      { mercator function of latitude }
  31.                     x,y,z: real;        { globe coordinates }
  32.              End;
  33.  
  34.     mp3rec = Record rectyp: byte;       { record type: 1 is start of segment }
  35.                     lon, lat: single;   { longitude and latitude }
  36.                     merclat: single;    { mercator function of latitude }
  37.                     x,y,z: single;      { globe coordinates }
  38.              End;
  39.  
  40.     mp0rec = Record ilon, ilat : integer;
  41.       { 100*longitude, offset by 20000 if start of segment; then 100*latitude }
  42.              End;
  43.  
  44.   Var
  45.     filename, mapfilnam : string;
  46.     listfile, mapfile : text;
  47.     line : string[80];
  48.     onefile : boolean;
  49.     retcode : integer;
  50.     p1, p2, format : byte;
  51.     count : word;
  52.     inbuf : Array [1..bufsize] Of byte;
  53.     m1, m2 : real;
  54.     raddeg : real;                   { radians in one degree }
  55.     rlat, rlon : real;               { lat&lon in radians }
  56.     coslat : real;                   { cos of latitude }
  57.  
  58.   Procedure abort(t : string; i : byte);
  59.   { output error message and abort with error code                           }
  60.   Begin                                                              { abort }
  61.     writeln(t);
  62.     Halt(i);
  63.   End;                                                               { abort }
  64.  
  65.   Procedure init;
  66.   { initialize variables                                                     }
  67.     Var i : byte;
  68.         cmd : string;
  69.  
  70.     Procedure usage;
  71.     { give usage hints                                                       }
  72.     Begin                                                            { usage }
  73.       writeln;
  74.       writeln('Usage:  convert  [/0 | /2 | /3]  <filename>');
  75.       writeln('        where /2 is the default.');
  76.       writeln;
  77.       writeln('<filename> must have either extension LST or MP1.');
  78.       writeln('If it is MP1, the file with this name will be processed;');
  79.       writeln('if it is LST, it is assumed to be a text file containing the ',
  80.               'names of');
  81.       writeln('.MP1 raw data files, complete with path, one per line.');
  82.       writeln;
  83.       writeln('/3 yields large data files for fast 80x87 MapView execution;');
  84.     writeln('/2 yields large data files for fast non-80x87 MapView execution;');
  85.       writeln('/0 yields very compact data files with slower MapView ',
  86.               'execution.');
  87.       Halt(1);
  88.     End;                                                             { usage }
  89.  
  90.   Begin                                                               { init }
  91.     If ParamCount = 0 Then usage;
  92.     format := 99;
  93.     filename := '';
  94.     For i := 1 To ParamCount Do
  95.     Begin
  96.       cmd := ParamStr(i);
  97.       If cmd[1] = '?' Then usage;
  98.       If (cmd[1] In ['-','/']) And (Length(cmd) = 2 ) Then
  99.       Begin
  100.         If format <> 99 Then abort('Conflicting switches on command line',2);
  101.         Case cmd[2] Of
  102.           '3' : format := 3;
  103.           '2' : format := 2;
  104.           '0' : format := 0;
  105.           Else abort('Unrecognized command line switch "'+cmd+'"',2);
  106.         End;
  107.       End Else
  108.       Begin
  109.         If filename = '' Then filename := cmd
  110.                          Else abort('Multiple file names not supported',2);
  111.       End;
  112.     End;
  113.     If format = 99 Then format := 2;
  114.     If filename = '' Then abort('File name missing',2);
  115.     For i := 1 To Length(filename) Do filename[i] := UpCase(filename[i]);
  116.     cmd := filename;
  117.     While Pos('.',cmd) > 0 Do Delete(cmd,1,Pos('.',cmd));
  118.     If (cmd <> 'LST') And (cmd <> 'MP1') Then
  119.                                     abort('Illegal file name extension',2);
  120.     If cmd = 'MP1' Then
  121.     Begin
  122.       onefile := True;
  123.       mapfilnam := filename;
  124.     End Else
  125.     Begin
  126.       onefile := False;
  127.       Assign(listfile,filename);
  128.       {$I- } Reset(listfile);  {$I+ }
  129.       If IOResult <> 0 Then abort('Cannot open list file '+filename,3);
  130.       mapfilnam := '';
  131.     End;
  132.     m1 := Pi / 4.0;
  133.     m2 := Pi / 360.0;
  134.     raddeg := Pi / 180.0;
  135.   End;                                                                { init }
  136.  
  137.   Procedure  makemp3;
  138.   { prepare .MP3 file                                                        }
  139.     Var binfile : file of mp3rec;
  140.         buffer : mp3rec;
  141.         minlat, minlon, maxlat, maxlon : single;
  142.   Begin                                                            { makemp3 }
  143.     minlat :=  9000.0;
  144.     minlon :=  9000.0;
  145.     maxlat := -9000.0;
  146.     maxlon := -9000.0;
  147.     Assign(binfile,ConCat(mapfilnam,'.MP3'));
  148.     Rewrite(binfile);
  149.     With buffer Do
  150.     Begin
  151.       rectyp := $FE;
  152.       lon := 0.0; lat := 0.0; merclat := 0.0;
  153.       x := 0.0;   y := 0.0;   z := 0.0;
  154.     End;
  155.     write(binfile,buffer);  { dummy record, to be filled in later }
  156.     line := ' ';  { start with blank line }
  157.     count := 0;
  158.     Repeat
  159.       With buffer Do
  160.       Begin
  161.         Inc(count);
  162.         If lo(count) = 0 Then write(count,#13);
  163.         { blank line: start new curve segment }
  164.         If (length(line) = 0) or (line[1] = ' ') Then
  165.         Begin
  166.           rectyp := 1;
  167.           readln(mapfile,line);
  168.         End Else rectyp := 0;
  169.         { extract two reals }
  170.         line := line + ' ';
  171.         p1 := Pos(' ', line);
  172.         Val(Copy(line,1,Pred(p1)),lat,retcode);
  173.         p2 := Pos(' ', Copy(line,Succ(p1),100)) + p1;
  174.         Val(Copy(line,Succ(p1),p2-p1-1),lon,retcode);
  175.         x := m1 + m2*lat;
  176.         merclat := Ln(Sin(x)/Cos(x));
  177.         rlat := raddeg*lat;
  178.         coslat := Cos(rlat);
  179.         rlon := raddeg*lon;
  180.         x := Cos(rlon)*coslat;
  181.         y := Sin(rlon)*coslat;
  182.         z := Sin(rlat);
  183.         If lat < minlat Then minlat := lat;
  184.         If lat > maxlat Then maxlat := lat;
  185.         If lon < minlon Then minlon := lon;
  186.         If lon > maxlon Then maxlon := lon;
  187.       End; { With }
  188.       write(binfile,buffer);
  189.       If (Not Eof(mapfile)) Then readln(mapfile,line);
  190.     Until Eof(mapfile);
  191.     write(count,#13);
  192.     With buffer Do
  193.     Begin
  194.       rectyp := $FE;
  195.       lon     := minlon;  lat := minlat;
  196.       merclat := maxlon;  x   := maxlat;
  197.       y := 0.0;           z := 0.0;
  198.     End;
  199.     Seek(binfile,0);
  200.     write(binfile,buffer);
  201.     Close(binfile);
  202.   End;                                                             { makemp3 }
  203.  
  204.   Procedure  makemp2;
  205.   { prepare .MP2 file                                                        }
  206.     Var binfile : file of mp2rec;
  207.         buffer : mp2rec;
  208.         minlat, minlon, maxlat, maxlon : real;
  209.   Begin                                                            { makemp2 }
  210.     minlat :=  9000.0;
  211.     minlon :=  9000.0;
  212.     maxlat := -9000.0;
  213.     maxlon := -9000.0;
  214.     Assign(binfile,ConCat(mapfilnam,'.MP2'));
  215.     Rewrite(binfile);
  216.     With buffer Do
  217.     Begin
  218.       rectyp := $FF;
  219.       lon := 0.0; lat := 0.0; merclat := 0.0;
  220.       x := 0.0;   y := 0.0;   z := 0.0;
  221.     End;
  222.     write(binfile,buffer);  { dummy record, to be filled in later }
  223.     line := ' ';  { start with blank line }
  224.     count := 0;
  225.     Repeat
  226.       With buffer Do
  227.       Begin
  228.         Inc(count);
  229.         If lo(count) = 0 Then write(count,#13);
  230.         { blank line: start new curve segment }
  231.         If (length(line) = 0) or (line[1] = ' ') Then
  232.         Begin
  233.           rectyp := 1;
  234.           readln(mapfile,line);
  235.         End Else rectyp := 0;
  236.         { extract two reals }
  237.         line := line + ' ';
  238.         p1 := Pos(' ', line);
  239.         Val(Copy(line,1,Pred(p1)),lat,retcode);
  240.         p2 := Pos(' ', Copy(line,Succ(p1),100)) + p1;
  241.         Val(Copy(line,Succ(p1),p2-p1-1),lon,retcode);
  242.         x := m1 + m2*lat;
  243.         merclat := Ln(Sin(x)/Cos(x));
  244.         rlat := raddeg*lat;
  245.         coslat := Cos(rlat);
  246.         rlon := raddeg*lon;
  247.         x := Cos(rlon)*coslat;
  248.         y := Sin(rlon)*coslat;
  249.         z := Sin(rlat);
  250.         If lat < minlat Then minlat := lat;
  251.         If lat > maxlat Then maxlat := lat;
  252.         If lon < minlon Then minlon := lon;
  253.         If lon > maxlon Then maxlon := lon;
  254.       End; { With }
  255.       write(binfile,buffer);
  256.       If (Not Eof(mapfile)) Then readln(mapfile,line);
  257.     Until Eof(mapfile);
  258.     write(count,#13);
  259.     With buffer Do
  260.     Begin
  261.       rectyp := $FF;
  262.       lon     := minlon;  lat := minlat;
  263.       merclat := maxlon;  x   := maxlat;
  264.       y := 0.0;           z := 0.0;
  265.     End;
  266.     Seek(binfile,0);
  267.     write(binfile,buffer);
  268.     Close(binfile);
  269.   End;                                                             { makemp2 }
  270.  
  271.   Procedure  makemp0;
  272.   { prepare .MP0 file                                                        }
  273.     Var binfile : file of mp0rec;
  274.         buffer : mp0rec;
  275.         offset : integer;
  276.         lat, lon : real;
  277.         minlat, minlon, maxlat, maxlon : real;
  278.   Begin                                                            { makemp0 }
  279.     minlat :=  9000.0;
  280.     minlon :=  9000.0;
  281.     maxlat := -9000.0;
  282.     maxlon := -9000.0;
  283.     Assign(binfile,ConCat(mapfilnam,'.MP0'));
  284.     Rewrite(binfile);
  285.     buffer.ilon := 0;
  286.     buffer.ilat := 0;
  287.     write(binfile,buffer);  { two records, to be filled in later }
  288.     write(binfile,buffer);
  289.     line := ' ';  { start with blank line }
  290.     count := 0;
  291.     Repeat
  292.       With buffer Do
  293.       Begin
  294.         Inc(count);
  295.         If lo(count) = 0 Then write(count,#13);
  296.         { blank line: start new curve segment }
  297.         If (length(line) = 0) or (line[1] = ' ') Then
  298.         Begin
  299.           offset := 20000;
  300.           readln(mapfile,line);
  301.         End Else offset := 0;
  302.         { extract two reals }
  303.         line := line + ' ';
  304.         p1 := Pos(' ', line);
  305.         Val(Copy(line,1,Pred(p1)),lat,retcode);
  306.         p2 := Pos(' ', Copy(line,Succ(p1),100)) + p1;
  307.         Val(Copy(line,Succ(p1),p2-p1-1),lon,retcode);
  308.         If lat < minlat Then minlat := lat;
  309.         If lat > maxlat Then maxlat := lat;
  310.         If lon < minlon Then minlon := lon;
  311.         If lon > maxlon Then maxlon := lon;
  312.         If (100.0*lat > 12000.0) Or (100.0*lon > 32000) Then
  313.         Begin
  314.           writeln('Range error in line ',count,':');
  315.           writeln('latitude/longitude ',lat:15:5,lon:15:5);
  316.           close(binfile);
  317.           Halt(5);
  318.         End;
  319.         ilat := Round (lat * 100.0) + offset;
  320.         ilon := Round (lon * 100.0);
  321.       End; { With }
  322.       write(binfile,buffer);
  323.       If (Not Eof(mapfile)) Then readln(mapfile,line);
  324.     Until Eof(mapfile);
  325.     write(count,#13);
  326.     Seek(binfile,0);
  327.     buffer.ilat := Round(minlat * 100.0);
  328.     buffer.ilon := Round(minlon * 100.0);
  329.     write(binfile,buffer);
  330.     buffer.ilat := Round(maxlat * 100.0);
  331.     buffer.ilon := Round(maxlon * 100.0);
  332.     write(binfile,buffer);
  333.     Close(binfile);
  334.   End;                                                             { makemp0 }
  335.  
  336. Begin                                                                 { main }
  337.   writeln('MP1TOMPX 1.2 - preprocess MapView raw data files');
  338.   init;
  339.   If onefile Then
  340.        write('        Converting ',mapfilnam,' to .MP',format:1,' format',#13)
  341.     Else writeln('Converting files in ',filename,' to .MP',format:1,' format');
  342.   While mapfilnam <> 'END' Do
  343.   Begin
  344.     If Not onefile Then readln(listfile,mapfilnam);
  345.     While (mapfilnam <> '') And (mapfilnam[1] In [' ',#9]) Do
  346.                                                        Delete(mapfilnam,1,1);
  347.     If Pos(' ',mapfilnam) > 0 Then Delete(mapfilnam,Pos(' ',mapfilnam),255);
  348.     For p1 := 1 To Length(mapfilnam) Do mapfilnam[p1] := UpCase(mapfilnam[p1]);
  349.     If Not onefile Then write('        Processing ',mapfilnam,#13);
  350.     If (Copy(mapfilnam,1,3) <> 'END') Then
  351.     Begin
  352.       If Pos('.',mapfilnam) <> 0 Then Delete(mapfilnam,Pos('.',mapfilnam),999);
  353.       Assign(mapfile,mapfilnam+'.MP1');
  354.       {$I- } Reset(mapfile); {$I+ }
  355.       If IOResult <> 0 Then abort('Cannot open map file '+mapfilnam+'.MP1',4);
  356.       SetTextBuf(mapfile,inbuf);
  357.       Case format Of
  358.         3 : makemp3;
  359.         2 : makemp2;
  360.         0 : makemp0;
  361.       End;
  362.       Close(mapfile);
  363.     End;
  364.     If onefile Then mapfilnam := 'END'
  365.               Else If eof(listfile) Then mapfilnam := 'END';
  366.     writeln;
  367.   End; { While }
  368.   If Not onefile Then Close(listfile);
  369. End.
  370.