70
Computers dl Geosciences VoL 15, No. 4. pp. 449-518. 1989 0098-300489 $3.00 + 0.00 Printed in Great Britain. All rights reserved Copyright ~ 1989 Pergamon Press plc DATUM: A FORTRAN 77 COMPUTER PROGRAM FOR DATUM SHIFT AND CONVERSION OF GEOGRAPHICAL COORDINATES BETWEEN DIFFERENT CARTOGRAPHIC SYSTEMS MARCO LIGI and GIOVANNI BORTOLUZZI lstituto per la Geologia Marina. Consiglio Nazionale delle Ricercbe, Via Zamboni 65. 40127 Bologna. Italy (Received 10 September 1986; receivedfor publication 27 September 1988) Abstract--A computer program is described for the datum change of geographical coordinates over large areas. The transformation to geocentric coordinates and ordinary least-squares techniques are applied to a set of coordinates of points (minimum three) in the two reference systems. The parameters of rotation, translation, and scaling between the two ellipsoids are output, and are suitable to be tabulated to provide for further shifting of data in the same area. The results indicate that accuracies of a few meters can be achieved over an entire country by using a single set of parameters. Higher accuracies may be obtained by local conversion procedures. The program also is used for accurate direct and inverse geographical-to- metric coordinate conversion for nine most used mapping projections. Mathematical expressions and the FORTRAN 77 source listing are provided. Key Words: Datum change, Geographical coordinates, Cartography. INTROI)UCYION A cartographic datum (Snyder. 1982) is characterized by the geometry of the selected ellipsoid (its semi- major axis and amount of flattening) and by its orientation, that is the adoption of an initial point where the ellipsoid is forced to be tangent to the geoid. From these initial points National Topographic Sys- tems (NTS) depart. Because good quality cartography is linked to NTS, attention must be paid to the errors that occur when processing geographical coordinates originated from different reference systems. The most frequent situations of error arise when digitizing maps. whose data are linked to a different datum, or when acquiring positioning data from instruments such as satellite or other precision navigation systems. where each of the latter are linked to some local or global datum To homogenize data, one should be able to shift the original data to another reference system. The transfer of data to a different cartographic datum must entail a good accuracy even at large-scale ap- plications (1:10.000. for example) and the possibility to apply the same procedure over large regions, for example an entire country. From specialized literature some fast datum change procedure can be determined, such as the abridged Molodenskji formula (International Hydro- graphic Organization. 1983), or the procedures of Vincenty (1965) and Born ford ( 1971 ). However, it was thought that they were not applicable to large-scale cartography, because the errors are larger than the graphic precision (Bortoluzzi and Ligi. 1986, 1987). In contrast, extremely accurate shift procedures can be performed only by Geodetic Surveys or specialists, because they involve long computations and the ac- cess to large data sets of geodetic information. However, good precision can be achieved with simpler methods even for large areas, if assumptions are made for the acceptable errors. Because we are concerned with map and cartographic data for geolo- gical and geophysical uses, we focused on obtaining accuracies that approach graphic precision when working with I: 10,000 maps (at this scale the graphic precision of 0.2 mm brings a real precision of 2 m). Further. we pointed at procedures suitable to be used by inexperienced people. in this paper we present DATUM, an interactive computer program that shifts geographical data among different reference systems, provided that the coordinates in the two systems of at least three points are known. These latter points can be both high- precision geodetic information provided by official agencies, or they can be obtained in published maps. As an example, the Italian official state cartography at 1:50,000 and the regional cartography at I:10.000 give the corner coordinates both in the European Datum of 1950 (ED50) and in the Italian National Topographic System (INTS) (Pericoli, 1971). METHODS Shifting of geographical coordinates to another reference system is a problem of rototranslating and scaling one ellipsoid to another. Under general assumptions this problem may be solved by using either curvilinear or rectangular 3-D (geocentric) coordinates. Morever, Cartesian coordinates are use- 449

DATUM: A FORTRAN 77 computer program for datum shift and conversion of geographical coordinates between different cartographic systems

Embed Size (px)

Citation preview

Computers dl Geosciences VoL 15, No. 4. pp. 449-518. 1989 0098-300489 $3.00 + 0.00 Printed in Great Britain. All rights reserved Copyright ~ 1989 Pergamon Press plc

DATUM: A FORTRAN 77 COMPUTER PROGRAM FOR DATUM SHIFT AND CONVERSION OF GEOGRAPHICAL COORDINATES BETWEEN DIFFERENT CARTOGRAPHIC

SYSTEMS

MARCO LIGI and GIOVANNI BORTOLUZZI

lstituto per la Geologia Marina. Consiglio Nazionale delle Ricercbe, Via Zamboni 65. 40127 Bologna. Italy

(Received 10 September 1986; received for publication 27 September 1988)

Abstract--A computer program is described for the datum change of geographical coordinates over large areas. The transformation to geocentric coordinates and ordinary least-squares techniques are applied to a set of coordinates of points (minimum three) in the two reference systems. The parameters of rotation, translation, and scaling between the two ellipsoids are output, and are suitable to be tabulated to provide for further shifting of data in the same area. The results indicate that accuracies of a few meters can be achieved over an entire country by using a single set of parameters. Higher accuracies may be obtained by local conversion procedures. The program also is used for accurate direct and inverse geographical-to- metric coordinate conversion for nine most used mapping projections. Mathematical expressions and the FORTRAN 77 source listing are provided.

Key Words: Datum change, Geographical coordinates, Cartography.

INTROI)UCYION

A cartographic datum (Snyder. 1982) is characterized by the geometry of the selected ellipsoid (its semi- major axis and amount of flattening) and by its orientation, that is the adoption of an initial point where the ellipsoid is forced to be tangent to the geoid. From these initial points National Topographic Sys- tems (NTS) depart. Because good quality cartography is linked to NTS, attention must be paid to the errors that occur when processing geographical coordinates originated from different reference systems. The most frequent situations of error arise when digitizing maps. whose data are linked to a different datum, or when acquiring positioning data from instruments such as satellite or other precision navigation systems. where each of the latter are linked to some local or global datum

To homogenize data, one should be able to shift the original data to another reference system. The transfer of data to a different cartographic datum must entail a good accuracy even at large-scale ap- plications (1:10.000. for example) and the possibility to apply the same procedure over large regions, for example an entire country.

From specialized literature some fast datum change procedure can be determined, such as the abridged Molodenskji formula (International Hydro- graphic Organization. 1983), or the procedures of Vincenty (1965) and Born ford ( 1971 ). However, it was thought that they were not applicable to large-scale cartography, because the errors are larger than the graphic precision (Bortoluzzi and Ligi. 1986, 1987). In contrast, extremely accurate shift procedures can be

performed only by Geodetic Surveys or specialists, because they involve long computations and the ac- cess to large data sets of geodetic information.

However, good precision can be achieved with simpler methods even for large areas, if assumptions are made for the acceptable errors. Because we are concerned with map and cartographic data for geolo- gical and geophysical uses, we focused on obtaining accuracies that approach graphic precision when working with I: 10,000 maps (at this scale the graphic precision of 0.2 mm brings a real precision of 2 m). Further. we pointed at procedures suitable to be used by inexperienced people.

in this paper we present DATUM, an interactive computer program that shifts geographical data among different reference systems, provided that the coordinates in the two systems of at least three points are known. These latter points can be both high- precision geodetic information provided by official agencies, or they can be obtained in published maps. As an example, the Italian official state cartography at 1:50,000 and the regional cartography at I:10.000 give the corner coordinates both in the European Datum of 1950 (ED50) and in the Italian National Topographic System (INTS) (Pericoli, 1971).

METHODS

Shifting of geographical coordinates to another reference system is a problem of rototranslating and scaling one ellipsoid to another. Under general assumptions this problem may be solved by using either curvilinear or rectangular 3-D (geocentric) coordinates. Morever, Cartesian coordinates are use-

449

450 M LIG! and G. I~)RrOLLrZZl

able if one works in the conformal plane, as for exam- ple with the affine transformation of homogeneous coordinates in the Universal Transverse Mercator (UTM) system (Bortoluzzi and Ligi, 1987).

The method we present performs a geometrical rototranslation of the (xt, x:, x,) rectangular geo- centric coordinates associated with ellipsoidal latitude and longitude (4~. ~). These relations (Bomford. 1971J are:

= (N + h) eos4~ sin,{ (I)

"c [(1 - - e 2 ) N + h I sin¢/~

{ ~. = tan ~ i.v:,'xt)

4~ = tan '[(xs + e:N sin~b)/,~/(.~ + xi)l (2)

h = .x~sec2sec,;b - N

= X2 cosec2 secq5 -- N

where N is the radius of curvature in the prime verti- cal. h is the height above the ellipsoid, and e is the eccentricity of the ellipsoid. In Equation (2). 0 is obtained by a rapidly convergent iterative process.

Relations of Equations ( I ) and (2) represent ;, one-to-one correspondence between geographical and rectangular coordinates. They suggest that simpler transformations may relate the coordinates of a point in any three right-handed rectangular Cartesian re- ference systems

\X~ / gu gJ2 gJJ 0 S1 \ l : ] - .Vii i

(3)

where (for i = I, 2, 3 a n d j = I, 2, 3), S~ are the scaling parameters, g,j are the direct ion cosines o f angles between axes x~ and %, and xo are the or igin coordinates of the x, system with respect to the origin of the x~.

The rotation matrix is orthogonat, and the direc- tion cosines g,, are function only of the rotation angles 0~, 0:, 0~, and are computed by:

. F~,:/,, b:a -,,: ] g,, = [ a , a , & - - bial aiaza~ + bib, anD."

Lbla:b~ + ala~ bla,a~ - alb~ blbz

(4)

where (for k = I, 2, 3) a~ = sin(0~) and & = cos (0~).

The parameters O s, S s, and xoj are unknown in Equation (3); they can be estimated by least-squares procedure if the coordinates o f m points (m /> 3) are known in the two reference systems. From Equation (3). any point provides the residual:

i = g , S (~ - ~,,i - ~ = 0 (5)

for i = 1. 2, 3. that yields a system of nonlinear equat ions

We assume that the differences between the tv, o ellipsoids are small, therefore the initial approximate values of the unknowns can be set (for i = 1, 2. 3): 0 , = O: S.* = I g* = 0

By Taylor's expansion of Equat,on (5) and con- sidering only' the first-degree polynomial approxima- tion. we obtain:

/=1

where A0, = /), - 0/*. AS~ = 5~. - S~, Ax,, z -%*,-

This yields a linear system ofthree m equations with unknowns A0,. AS,, 3.%. that is solved by the least- sqt, ares method. The so(u/ions obtained provide cor- rections for the initial guesses ((./~ S,*, x,*). The suc- cessive approximate values arc estimated itcratively fronl Eqt,ation (6) and the process is repeated until the difference of the sum of the squares of l~ (k = I, 2. . . 3m) o f t h e n t h arid nth - I iterations islcss than a spccitied amount (in our work 1.0-~0).

By tabulating rototranslation parameters for any area, changes of datum (or of the reference system) is performed using relationships given by Equations (I), (3), and (2) (subroutines GEOXYZ, GCSHFT, X Y Z G E O ) ,

DESCRIPTION OF TIlE PROGRAM

Program DATUM is structured into three phases, and can be run in both interactive and batch mode (each user response in interactive mode is copied on a log file, that can be edited and resubmitted to the system). The program makes extensive use of win- dows and menus, to give the user maximum assistance while performing this task

Phase (I) is the datum shift and projection in- formation collection (Fig. A 1 ), User has the opportun- ity to select old and new datum among several of the most used continental and national cartographic re- ference systems throughout the world, such as the ED50, the North American Datum of 1927, the NTS's of France and Great Britain and many others, plus the World Geodetic System of 1972 (WGS72). This information was taken by International Hydro- graphic Organization (1983). For the geographical- to-metric direct and inverse coordinate conversion, selections are available among nine mapping projec- tions, such as the Direct and Oblique Mercator, the UTM, the Cassini-Soldner, the Polyconic, the Lam- bert Conformal and Azimuthal, the Albers and the Stereographic. Care was taken to provide the user

Datum shift and conversion of geographical coordinates 451

with the possibility to select among the different cartographic applications of the projection (Snyder, 1982). such as the polar and oblique aspects, or the two methods for mapping in the Lambert Conformal.

It also is possible to select between (a) speditive, less accurate, and (b) accurate shift.

Procedure (a) converts data to and from each tab- ulated datum by the abridged Molodenskij formula. and uses the geometrical differences of each spheroid toward the WGS72. The accuracy one can expect has to be calculated for each specific datum. For the conversion from the INTS to the ED50 an accuracy of 15-20m (Bortoluzzi and Ligi. 1987, 1988) has been determined.

The conversion to and from the WGS72 ellipsoid is important particularly when geographical data are acquired by satellite positioning systems.

Procedure (b) is performed by the method des- cribed in this paper. It requires the availability of ellipsoidal geographical coordinates (latitude, longi- tude, and height) for the control points within the area of interest: although not essential, it is preferable that these points were distributed uniformly. On the assumption that the differences between the height above the ellipsoid and the height above the geoid are small, the required two values can be set to the height above the geoid.

Phase (2) prompts the user to furnish input and output information regarding the conversion process (Fig. A2). In sequence one is allowed to select:

(a) Source of input, either keyboard or disk file; (b) Type of coordinates of input and output data:

latitude and longitude expressed as Degrees Minutes Seconds (DMS), or Degrees Minutes Hundredths (DMH), or Decimal Degrees (D60), or Centesimal Degrees (DI00), or Hours Minutes Seconds (HMS). or radians: the metric projection coordinates may be selected as well: should this latter selection occur, the user is prompted for input of the relevant projection parameter (Fig. A3);

(c) Position of variables latitude (Northing). lon- gitude (Easting), and height within the input file (if the UTM option was selected the UTM zone is required also): this is accomplished in a simple manner by marking the related fields on the first record of the user file as shown at the terminal (the program creates automatically the FORTRAN format for read and write operations, and on output, the new coordinates are overwritten in places of the old ones, preserving the content of the rest of the record:

(d) Coordinates of (I) the vertexes of the polygon that includes the area of interest or (2) of the center of the area: if the former option is selected, the program calculates the coordinates of the center of gravity of the area (Zarkos and Rogers, 1987). and includes all the calibration points that lie within the area (Salo- mon. 1978); conversely, if the latter option is selected, the program uses the ten control points closest to the given center of area, after having sorted them by increasing distance.

Phase (3) is the conversion phase, that in sequence outputs: (a) the computed shifts between the two spheroids, (b) the rototranslation parameters, and (c) the "'goodness-of-fit'" of the conversion, expressed as mean and standard deviation of the distances in meters from the original and recalculated coordinates of calibration points (Fig. A5). After this the con- version process takes place.

In addition to performing change of datum or geo- graphical-to-projection coordinate conversion, the program can be used to transform the format of geographical coordinates in input, that is to and from DMS, DMH, D60, DI00. HMS. and RAD. This is accomplished by selection of option NO SHIFT during phase (I).

Examples of the interaction during each separate phase can be seen in Appendix I.

RESULTS

The procedure has been tested by shifting points among the three cartographic systems currently avail- able in Italy: (a) the datum of 1909 (IGBE. with different origin points)(Boaga, 1960: Pericoli, 1971; Area. 1987). (b) the INTS (with origin point M. Mario, near Roma), and the ED50 (with origin point Postdam, near Bonn, F.R.G.). Ellipsoid parameters are the Bessel of 1841 for IGBE, and the International (Hayford of 1924) for INTS and ED50. These two letter datum are used for various scale accurate land topography, whereas IGBE is used for marine map- ping in some particular areas and for Regional Plane Coordinate networks.

The calibration and test data have been set up from: (I) the coordinates in the three systems of some first-order geodetic points distributed all over the country (accuracy to the nearest thousandth of a second) (see Figs. I, 2) (these data were provided by Divisione Geodetica of the Instituto Geografico Militare ltaliano and by lstituto ldrografico della Marina of Italy): (2) the corner coordinates of pub- lished maps at 1:50,000 and I: 10,000 scales (accuracy to the nearest meter). To get reliable statistics of goodness of conversion, the available control point data set were split in two data files. Each of these files has been used alternatively as calibration and test data. The output of several test runs of the program are summarized in Table I.

The results indicate that the method is accurate sufficiently for working at a rather large scale (i:25,000), even by using a single set of rototrans- lation parameters for the entire country.

The data presented in Table 1 show the consistent reduction of the conversion errors when the roto- translation parameters are computed within separate blocks. This is particularly the situation of the conver- sion from INTS to ED50. On the contrary, when converting from IGBE to INTS, the errors are deter- mined to be smaller over the whole country. This discrepancy is thought to be explained by the major

452 M. Li~;i and G. Boaro~LzzJ

<

ov ( . . ~

:x

+ , ~ l , - , t

0. ~ m

~ + +.,, - - %

,.+ -

+

++ ++if! ~" ' + ~ + + + +

:: +=+++

ii" ++ +~++++~+ - : s i m + l l + x x |

, +

"i o

f~;S ~ /.'.. ~.."+ 414 • 4~

• 41

r ~ 4 { O

4 4 ~ 4 • , 4 • 4 d ~

/ ' 4

4 • • i " .,,+ 4

• • e q

4 P Q 1 • . . , , - • ++ -_+__~+ )

• , . . . , ~ , ~ p-~ ,

- . . + . . ~ ~. +. , + . . q

- . . - . . + : " + . . - - + ._ . , T + t I I q q 4q 4 ~ ~ i

4 4 4 0 t ~ I

~ l d TM • -"PI' 114 , I ' ~. ,~...:.,

+,i,'

01 .+

. 2

t '

j.-+

I

0 0 '~+

+.,,.j

++,,, .~

z " ~

" ~ 0

, M

~,_..

,.++~

er~

~ u.,

Datum shift and conversion of geographical coordinates 453

">~ °~ I I ! ' = = "-'-i:

~ i BI : " i : i i i i " 11~ = l i = - ' l i t I - ~ Az.

iol~.li. ~1 - .

I~1~1~ "

i '

-~o li

-

~ u

• ~ ~.

' ~ ' ' c ~ . ~

2-~ ~

f

S .,:~

~I '~' I .~J~<~_~

• • I

• ~ I . V / " ~.,! , tJ. /<

i l l e l l

_-=p_.

~.0" • • •

o o lla 0

45.a M LIGI and O. BORTI)LtrZZI

Table I. Summary of statistics of errors determined when shifting co,~rdlnale, with DATUM. NPCAL and NIrFEST are numbers ofcahbration and test pomt~ MEAN. MAX, and SDEV istandard de,,iationl are expressed in meters, and represent differences between expected and shifted coordinates. AREA represents region of territory used during runs (see Fig, 21. TEST field is orlgm of test polnl data set: ( I ) first-order geodetic points, and (2) corner coordinates of olticial maps

of 1:50.(RJI). 1:I0,00~). 1:5t)00 scales

SHIFT NPCAL NPTEST MEAN MAX SDEV AREA TEST

IBGE--INTS 165 168 0.21 2.65 0.34 ALL !I) 168 165 0.17 3.91 0,32 (17

INTS--EDS0

INTS-ED50

73 64 3 .44 1 2 . 2 3 2 .66 ALL ![~ 64 73 2 . 8 4 9 . 7 4 1 . 7 8 i l )

137 32 3.59 11 .21 3 .12 ~2)

28 9 1.2i 2,35 0.78 (A) {2) 29 19 1.32 2 38 0.58 (B) (2) i0 II 0.91 1.51 0,32 (C) (2)

homogenci ty of the IGBE and INTS. whose data were derived by the same t r igonometr ic n e t w o r k

Once the ro to t rans la t ion parameters arc cal- culated, the shift of coordin0tes is vir tual l) instan- taneous. It is notewor thy that the da tum shift is speeded up by the use of tabulated ro to l rans la t ion parameters Ibr any part icular area, as the least- squares computa t ion is bypassed

It is interesting to note also that some accuracy is added to the results obta ined from the abridged Molodenskj formula, when the geometrical shifts computed by D A T U M arc used. in pkice of the shifts

described in the l i terature ( IHO, 19831. This can be at tractive for works at smaller scales ( < 1:50,000) {Bortoluzzi and kigi, 1987, 19881.

The use of a larger control point data set within the same area redticed mean errors, and thus gives more conlidence to the obta ined results.

CONCI,12SIONS

We have presented a method of da tum shift, that uses a least-squares computa t ion of the rototranskt- tion parameters between two ellipsoids. The accuracy of conversion over large areas is considered to bc good. and points to a safe usage at scale of 1:25,000 Problems that arise when faced with poorly accurate cal ibrat ion data :ire solved by per lb rming Iota! con- versions. As a mat ter of fact. the errors resulting from geodetic closing procedures over large areas, are ncg- ligible when considering small areas. D A T U M re- quires a set of cal ibrat ion points with known geo- graphical coordinates in the two reference systems. This set of data is not made up necessarily of coor- dinates of geodetic points, Wherever a high accurac,, is not necessary, the corner coordinates of published official car tography can be used convenient ly with acceptable results.

To make the program more general we have added a less accurate shift procedure, that converts among the most widely used spheroids. This method is ap- plicable at scales of I: 100.000, and is thought to bc helpful in the conversion toward the WGS72 da tum,

t~tnch Is bccolning used ~,~ldct,, tin mapping purposes ([~e:.ItOlh 1986)

Morco' ,er . D A T U M can bc used t~ t ransform gcographic:l l l ind metric coordimttcs ( I . ITM, Lam- bert. ('dssini-Soldm.-r. and othcFs). An extensive use of l l l;isks f<~r input t ing and output t ing o f data makes the prograll ' l t i ts) to tp, c t\~i incx[~crienccd people

Ofhcr thail using it :l, ;t qanc,t-,iionc program, '¢,t.' bt.'lie,~e that the published librar}, procedures were useful ',t,hcn inserted irl programs as D I G M A P ( l lor toluiz i and l.igi, ltJ,~e,I, or P L O T M A P (Ligi and Bortoluezi, I'989). This will help s tandardiza t ion in acquisit ion and plot of gc~graphicat data.

,4cknouledt'm(',t~ Thi s ~(~rk represents contribution No 652 of the Istituto per la Gcologia Marina (IGM) of the Italian National Council for Research (CNR). Dr. M. Ligi was supported partially by a fellowship of the CNR's Com- ilatO per Ic scicnle (Jcologichc c Minerarie, and by ENEA c~mtract No 39077 Ing, Arca of the Divisione Geodetica of the Istitulo Gcogralico Militare Italiano, and C.V. (3 Angrisano. C.V. I-:. Spanio, P r . G. DiGiorgio, and P.T. R, D'Epifanio of the Istituto Idrogratico Militate Italiano gave valuable support for geodetic and test data information.

Dr G Buffoni of the CREA/ENEA of La Spezia is acknowledged warmly for criticism and review of the mathe- matical content Thanks also are given to Mr. A, Bruscbi and Mr S Sgorbini ofCREA ENEA for support and use of computing facilitms at ENEA

REFERENCES

Area. S, 1987, Calcoli di compensazlone della rete trigonometric;, nazionale: Boll. Geodesia So. Aft., v 46. no 2, p. 161-167

Bcalon. R, J . 1986, Marine geodc,,.y in the Department of Dcl'cnse (USA!: Intern. ftydrographic Review. v. 63, no, I, p. 109-117.

Boaga, G.. 1960, Sul cambio dclFe|lissoidc di riferimento per i vertici delle rcti geodctiche: Boll Geodesia .%:. Aft., v. 19, rio 4, p 56q-575.

Bomf~lrd. G., 1971, Geodc,,.~ Clarendtm Press. Oxford, p. 593-598

Bortoluzz), G , and l.,igl, M . 198,'). DIGMAP: a computer prograrn I\)r accurate acquisitmn h', digitizer of geo- graphical coordinates from conformal projections: Com- puters&Geosciences, ~ l?, no. 2. p 175-197

Datum shift and conversion of geographical coordinates 455

Bortoluzzi, G.. and Ligi, M.. 1987, Acquisition and display of geographical data in conformal cartography: on-line and off-line examples: Boll. Oceanol. Teorica Appl.. v. 5. no. 3. p. 173-182.

Bortoluzzi, G., and Ligi. M., 1988, Examples of spatial analysis and management in the geographical and con- formal projection domains, m Chung. C. F., and others. eds.. Quantitative analysis of mineral and energy resour- ces: D. Reidel Publ. Co., Dordrecht. Holland. p. 553- 564.

International Hydrographic Organization. 1983, Guidance to the determination of adjustment values for use in transformation notes: ANNEX-A. IHO Circular Letter. 44. September 1983. Monaco. France. 20p.

Ligi, M., and Bortoluzzi. G., 1989. PLOTMAP: geophysical

and geological applications of good standard quality cartographic software: Computers & Geosciences, v. 15, no, 4. p. 519-585.

Pericoli. A., 1971, 1 reticolati di riferimento nella cartografia italiana: Boll. Geodesia ~ . Aft.. v. 30, no. 3. p. 253-262.

Salomon. K. B., 1978. An efficient point-in algorithm: Com- puters & Geosciences. v. 4. no. 2. p. 173-178.

Snyder, J. P.. 1982. Map projections used by the U.S. Geolo- gical Survey: U.S. Geol. Survey Bull. 1532. 310p.

Vincenty, T., 1965, Transformation of coordinates between geodetic systems: Survey Review, v. XVIII(137). p. 128- 133.

Zarkos. R.W., and Rogers. G.F. . 1987. A complete algorithm for computing area and center of gravity for polygons: Computers & Geosciences, v, 13, no. 5, p. 561.

A P P E N D I X 1

Examples of Interaction and Use o/" Program DATUM

An interaction at the terminal with DATUM is presented. Figure AI is the datum and projection selection mask: by moving the arrow keys the user can select datum and type of shift; the fields on the right rotate to show semimajor axis and reciprocal flattening of the selected spheroid. Figure A2 shows the input/output option menu. whereas Figure A3 presents the projection parameter window. Finally. Figure A5 illustrates the shift parameters and output phase mask.

For testing purposes, an example of calibration data set is shown in Table AI. The data must be converted to binary format for the published version of subroutine DATUMS. or the READ statement have to be changed accordingly. The results of the procedure when using the data set can be seen in Figures A4. A5 (shift is from INTS to ED50).

D A T U M CONTINUE

D A T U M a n d P R 0 J Z C T I O N P A R A M E T E R S

D a t u m : NAD27 (CLARKE 1 8 6 6 ) S e m i m a j o r A x i s : 6 3 7 8 2 0 6 . 5 0 R e c i p r o c a l F l a t t e n i n g : 2 9 4 . 9 8

S h i f t : $ P E D I T I V E S H I F T S h i f t e d t o : WGS 72 S e m i m a j o r A x i s : 6 3 7 8 1 3 5 . 0 0

R e c i p r o c a l F l a t t e n i n g : 2 9 8 . 2 6 dX : - 2 2 . 0 0 dY : 1 5 7 . 0 0 dZ : 1 7 6 . 0 0

Figure Al. lntcraction with DATUM during phase (I). F I L E

D A T U M

I N P U T O p t i o n s O U T P U T O p t i o n s

F i l e : OROTEST.f~L~

C o o r d i n a t e T y p e s : GEOGRAPHICAL D a g M i n S o c . X X X

V a r £ a b l a s S t a r t C o l E n d C o l L A T I T U D E 1 10 LONGITUDE 11 20 HEIGHT 21 24

F i l e : O R O T E S T . C N V

C o o r d i n a t e T y p e s : PROJECTION LJU(BERT CONFORMAL

G a o q r a p h £ c a l WORK AREA B o u n d a r i e s

L a t i t u d e : 3 5 0 0 0 0 . 0 0 0 L o n g i t u d e : 1 8 3 0 0 0 . 0 0 0

B o u n d a r y P o l y g o n V e r t e x n . 4

F o r m a t : ( F I O . 2 , F I O . 2 , F 4 . 0 , 2 O X )

D a t a : 3 6 3 3 3 5 . 3 6 1 3 0 6 1 4 . 9 2 150 - 2 4 8 7 7 4 . 2 1 1 6 9 3 4 1 . 7

Figure A2. Interaction with DATUM during phase (2).

.156 M L]GZ and G. BORTOLLZZI

D k T U M FILE

I N P U T Options O U T P U T Options

File: OROTEST.MMA

Coordinate Types: GEOGRAPHICAL DegMinSec.XXX

F i l e : OROTEST.CNV

Coordinate Types: PROJECTION LAMBERT CONFOILRAL

Variah i ~ T Z r U I LONGIT HEIGHT

D a t a : L

(conic a n d C o n f o r m a l ) ANGLOSAXON METHOD

L a t i t u d e o f C a n t o r o f t h e Map L o n g i t u d e o f C e n t e r o f t h e Map S t a n d a r d P a r a l l e l ( 1 ) S t a n d a r d P a r a l l e l ( 2 ) R e d u c t i o n Scale F a c t o r F a l s e East ing F a l s e N o r t h i n g

: 393240.06 : 0.0000 : 364000.00 : 392000.00 : 1.0000 : 0 . 0 0 0 0 : 0 . 0 0 0 0

d a r i e s I

!ooo 000

Figure A3.1nteraction with D A T U M during p h a ~ (2),

FILE D A T U M

I N P U T Options O U T P U T Options

File: PTI MAP.TST

C o o r d i n a t e T y p e s : GEOGRAPHICAL DegMInSac.XXX

Variables Start Col End Col LATITUDE 4 14 LONGITUDE 15 25 HEIGHT 26 30

T i l e : FOR002.DAT

C o o r d i n a t e Types: PROJECTION LAMBERT CONFORMAL

G e o g r a p h i c a l WORK AREA B o u n d a r i e s

Latitude : 430000.000 Longitude : 120000.000

Boundary Polygon Vertaz n. 1

Format: { 3X,Fll .3,Fll. 3 ,r5. I, 27X)

D a t a : 1 4 3 0 0 0 0 . 0 0 0 1 2 0 0 0 0 . 0 0 0 0 . 0 4 3 0 0 0 0 . 0 0 0 1 2 0 0 0 0 . 0 0 0 0 . 0

Figure A 4 Test data input

D A T U M

A C C U R A T E S H I F T P a r a m e t • r s

Number of Points selected to Compute STATISTIC: i0

S h i r t Dx : -134.185 S t a n d a r d Dev ia t i on : 0 . 6 9 3 Dy: 3 0 . 2 3 7 S t a n d a r d D e v i a t i o n : 1 . 1 2 5 Dz: 128.549 Standard Deviation: 3.107

R M a t r i x :

T M a t r i x : S M a t r i x :

0 . 9 9 9 9 9 9 9 9 9 4 7 7 5 5 8 0 . 0 0 0 0 0 6 0 4 8 2 7 1 9 9 8 0 . 0 0 0 0 3 1 7 5 3 7 6 8 6 8 7

- 1 1 7 . 3 8 2 7 4 3 5 3 8 9 1 1 5 2 5 0 . 9 9 9 9 7 6 4 8 3 2 0 8 4 9 1

- 0 . 0 0 0 0 0 6 0 4 8 2 1 5 4 2 8 0 . 9 9 9 9 9 9 9 9 9 9 8 0 2 2 2

- 0 . 0 0 0 0 0 1 7 0 1 9 5 8 2 3 9 - 1 0 . 5 6 3 1 2 0 2 8 2 9 6 5 1 9 4

0 . 9 9 9 9 8 4 1 0 3 0 5 1 0 1 1

- 0 . 0 0 0 0 3 1 7 5 3 7 7 9 4 6 4 G . 0 0 0 0 0 1 7 8 1 7 6 6 1 8 4 0 . 9 9 9 9 9 9 9 9 9 4 9 4 2 6 1

- 6 9 . 4 3 2 1 5 3 8 1 2 1 9 7 3 0 5 0 . 9 9 9 9 8 1 5 8 6 2 6 1 2 4 1

Mean E r r o r : 0 . 5 9 0 mr. - Standard D e v i a t i o n ; 0 . 4 2 6

Data Output: 1 4 3 0 0 5 . 8 9 0 1 2 0 0 0 2 . 5 4 0 0 . 0 4 3 0 0 0 0 . 0 0 0 1 2 0 0 0 0 . 0 0 0 0o0

Figure AS. Output phase of DATUM~

Datum shift and conversion of geographical coordinates

Table AI. Example of calibration data set

457

DATUM i DATUM 2

N LATITUDE LONGITUDE HEIGHT

1 2 3 4 3 7 5 9 5 3 . 5 3 7 5 9 5 3 . 6 4 5 1 1 5 4 . 7 4 5 2 3 5 4 . 8 4 5 1 1 5 4 . 9 4 6 3 5 5 4 .

10 4 6 2 3 5 4 . 11 445954. 12 463554. 13 443554. 14 445954. 15 365153. 16 373553. 17 3 7 2 3 5 3 . 18 434754 19 443554 20 433854 21 433854 22 443554 23 443554 24 454754 25 451154 26 441154 27 455954 28 422354 29 415954 30 401153 31 395953 32 382353 33 364753

4 4 4 7 5 4 . 2 5 0 1 1 5 9 5 7 . 3 8 3 3 8 1 1 5 3 . 6 2 5 1 2 1 9 5 7 . 4 5 3 3 7 4 7 5 3 . 5 3 1 1 2 1 9 5 7 . 5 4 7

594 1 1 5 9 5 7 . 4 7 7 594 1 2 1 9 5 7 . 5 0 0 313 1 2 1 9 5 7 . 3 2 8 313 1 1 5 9 5 7 . 3 2 8 281 115957.367 438 115957.258 438 115957.258 313 121957.344 438 121957.227 219 115957.391 281 115957.367 375 120457.594 500 121957.563 531 125957.648 094 105957 219 114957 188 132957 188 132457 219 115957 219 120957 500 133957 063 63957 125 93957 250 91957 063 111957 031 151957 969 155957 938 181957 844 151957 688 145957

477 352 375 375 391 383 125 789 500 406 508 391 469 156 641 734

O 4 4 4 8 0 0 . 0 0 0 0 3 8 1 2 0 0 . 0 0 0 0 3 7 4 8 0 0 . 0 0 0 0 3 8 0 0 0 0 . 0 0 0 0 3 8 0 0 0 0 . 0 0 0 0 4 5 1 2 0 0 . 0 0 0 0 4 5 2 4 0 0 . 0 0 0 0 4 5 1 2 0 0 . 0 0 0 0 4 6 3 8 0 0 . 0 0 0 0 4 6 2 4 0 0 . 0 0 0 0 450000.000 0 463600.000 0 443600.000 0 450000.000 0 365200.000 0 373600.000 0 372400.000 .0 434800.000 • 0 443600.000 .0 433900.000 .0 433900.000 .0 443600.000 .0 443600.000 • 0 454800.000 .0 451200.000 .0 441200.000 .0 460000.000 .0 422400.000 .0 420000.000 .0 401200.000 .0 400000.000 .0 382400.000 .0 364800.000

120000 122000 122000 120000 122000 122000 120000 120000 120000 120000 122000 122000 000 120000 000 120000 000 120500 000 122000 O00 130000 000 110000 000 115000 000 133000 O00 132500 000 120000 000 1 2 1 0 0 0 . 0 0 0 1 3 4 0 0 0 . 0 0 0

64000 000 94000 000 92000 000

112000 000 152000 000 160000 000 182000 000 152000 000 150000 000

000 0 0 000 0 0 000 0 0 000 0 0 000 0 0 000 0 0 000 0 . 0 000 0 . 0 000 0 . 0 000 0 . 0 000 0 . 0

0 . 0 0 , 0 0 . 0 0 . 0 0 . 0 0 . 0 0 . 0 0 . 0 0 . 0 0 . 0 0 . 0 0 . 0 0 . 0 0 , 0 0 . 0 0 . 0 0 . 0 0 . 0 0 . 0 0 , 0 0 . 0 0 . 0

A P P E N D I X 2

Implementation Problems and Source Listings

The program is coded in ANSI FORTRAN 77. The presented version runs on DEC VAX, IBM PC, and compatibles (Microsoft FORTRAN Compiler 4.0). Few low-level machine-dependent modules are inserted into the ANSI terminal management library, and their usage is explained throughout the software listing. Compiler directives must be changed to match system requirements accordingly. It has to be kept in mind that for MS-DOS installations, the ANSI driver is required for proper functioning. It is believed that the program should run on other installations, provided that the low-level operating system calls were replaced.

The listed code includes a reviewed version of part of the library published in Bortoluzzi and Ligi (1986), to correct small "bugs" and to improve efficiency. The modified software from Salomon 0978) and Zarkos (1988) is presented too.

The routine of least-square solution was taken by the published software of the CERN computer library, as available at CINECA (Centro di Calcolo dell'italia Nord Orientale, Bologna, Italy). Any other available routine such as those in the NAG or IMSL FORTRAN libraries performs the task as well as the one we used (the IMSL routine LLSQR was tested and gave the same results). This would save time when coding and probably would improve efficiency.

The software is available upon request from the authors. Distribution media could be MS-DOS diskette, or, preferably, DECNET or EARN.BITNET (L56BOCglt~ ICINECA2, GEOF1SICA(b~ASTBOI) electronic mail.

1 C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C

2C M . L i g l , G . B o r t o l u z z i C 3C I s t i t u t o per la Geolog ia Marina - CNR Bologna C 4C ...................................................................... C 5C DATUM : A computer program to shift and convert geographical C 6C c o o r d i n a t e s f r o m c h a r t d a t u m t o a n o t h e r C 7C It also convert geographical to/from projection coord. C 8C in various input and output formats C 9C ...................................................................... C

10C Version : 3.0 January 1988 C llC Language : FORTRAN 77 MICROSOFT RELEASE 4.0, VAX/VMS C 12C Host : PC-IBM and compatibles, VAX C 13C Op.System : MS-DOS 3.xx, VMS 4... C 14C ...................................................................... C 15C Latitudes in range (-90 to +90) positive North C 16C L o n g i t u d e s in range (-180 to +180) positive East C 17C Negative UTM sane on input means Southern Emishera C 15c c

4.~8 M. LxG land G. BORTOLLZZI

19C . . . . .

20C The Control point data f11e is set up in the followlng manner : C 21C ..... Number (CF0,CL0,Height0) (CFI,CLI,Heightl) (CF2,CL2,Hexght2)... C

22C base datum datum shift 1 datum shift 2 c 23C ..... C

24C When geographical coordinate input As requested and no use[ C

25C selection is available the format must be DegMinSec.xxx ! ~ C 26C C

27C ..... On output data file the format is the same as the one selected C

28C by user, therefore make room for accomodation of necessary C

29C decimal figures when outputting sessagesimal or centesimal C 30C dogrees or radians ~! C 31C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32C ..... Due to lack of test data for other situations, the program shifts 33C Data accurately only among the Italian Cartographlc Networks. 34C Would you like shift among other Reference Systems please follow 35C the next steps: 36C

37C a) Within DTCOMMON set MAXDTM to max value of available spheroids 38C b) Within Procedure INPPAR set ACCSHF to .true. according to availa- 39C ble spheroids

40c c) Set NMAX, MDIM, KDIM according to number of calib~atlon points

41C d) Create the binary file DTMFILE (all variables REAL'8 ! ! )

42C Npoint LATI LONG1 HEIGHT1 .... LATn LONGn HEIGHTn 43C

44C As an example, in a situation wlthln NAD s~ea, wlth ~ calibration

45C points having coordinates in NAD27 (Clarke 66), MERCURY 66 and 46C WGS72 : 47C

48C MAXDTM = 3

49C DATA ACCSHF / 3".false.,.true.,5".false.,~true.,2"[alse...t[ue., 50C & .fa[se.,.true. /

51C IF K .gt. NMAX, then within Procedure DATUMS s e t 52C NMAX = K, NDIM w K*3, KDIM =63+I0"K'3 53C .......................................................................... C

54 IMPLICIT DOUBLE PRECISION (A-H,O-Z)

55 CHARACTER DATHLP*255,FILHLP*80,PRGSTR*I3,SFILE'3~STRHLDI255)'I, 56 L DATSTR'255,FMT*80,PRGTXT(3)*55 57 R~AL'8 DATe(6)

58 LOGICAL HALT,OK,INTSES,ABORT,INPGEO~OUTGEO,INPPRJ,OUTPRJ,UTMSTD 59 INCLUDE 'DTCOMMON.FOR'

60C ................................................................................... C

61C MAIN COMMON FOR DTLIB C 62C ............................................................................... C

63 REAL*8 ARCS,EPSI,FORTPI,HALFPI,PIGREC,TWOPI,DTOR,RTOD

64 COMMON /MATH/ ARCS,EPSI,FORTPI,HALFPI,PIGREC,TWOPI,DTOR,RTOD

65 REAL*8 SEQ,EFFE,EC2,ED,E,ECd,EC6,EC8,ECI0,ECI2,ECIq,

66 & DSEQ,DEFFE,DDX,DDY,DDZ,RM(3,3),TM(3),SM(3),SEQON(2) ,EC2ON(2) 67 COMMON/ELLIPS/SEQ,EFFE,EC2,ED,E,EC4,EC6,ECB,ECIO,ECI2,ECId, 68 & DSEQ,DEFFE,DDX,DDY,DDZ,RM,TM,SM,SEQON,EC2ON

69 REAL*8 CF0,CFI,CF2,CL0,CLI,CL2,K0,CN0,CE0,OMAZIM 70 COMMON/IPARPRJ/CFO,CFI,CF2,CLO,CLI,CL2,KO,CNO,CEO,OMAZIM 71 REAL*8 CSIGN,RAYPAR,EL0,EL1,EL2,EL3,P0,P,P2,P4,P6,PB,

72 & SGAM0,CGAM0,SOMA,COMA,U0,CI,C2,C3,RHO0,ENNE0,S2CF0,

73 k PSI0,XNI,EMME0,CHI0,CCHI0,SCHI0,POLCOS,SB0,CB0,XRH<~ 74 COMMON/PRJCOS/CSIGN,RAYPAR,ELO,ELI,EL2,EL3,PO,P,P2,Pd.P6,PS 75 & SGAMO,CGAMO,SOMA,COMA,UO,CI,C2,C3,RHOO,ENNEO,S2CFO, 76 & PSI0,XNI,EMME0,CHI0,CCHI0,SCHI0,POLCOS,SBO,CB0,XRHO 7 7 C . . . . . 78 79

80

81 82 83 84

85 86 87

88

89 90C .....

91 92 93

94 95

INTEGER INDUTM,INDOBM,INDLAM,INDSTR,INDLAZ COMMON /PRJTYP/ INDUTM,INDOBM,INDLAM,INDSTR,INDLAZ

INTEGER ILOG,IHELP,LOGPNT,IOFILE{2),IOSHLP

COMMON / IO / ILOG,IHELP,LOGPNT,IOFILE,IOSHLP INTEGER MAXRH,NRECH,RECHLF(100) COMMON / CHELP / NRECH,MAXRH,RECHLP INTEGER NPOLY,INTVLS,SWATH(20,25)

REAL*8 CFPOLY(21),CLPOLY(21),YINTVL[20),RSLOPE(20) ,YSORT(20 COMMON / INOUTR / CFPOLY,CLPOLY,YINTVL,RSLOPE,YSORT

COMMON / INOUTI / NPOLY,INTVLS,SWATH

LOGICAL DATUMC,DTMSFE,DTMACC,LATN

COMMON / LOGVAR/DATUMC,DTMSPE,DTMACC,LATN

PARAMETER (MAXELLwlS, MAXDTM=3, MAXFIL=20, MAXVAR~i01

INTEGER INDDTM,NEWDTM,INDASD{MAXDTM),INDFK,MAXLEN(2), & INDCT(MAXFIL),INDGT(MAXFIL) ,NUMVAR(MAXFIL} i & VPOS(MAXFIL,MAXVAR),POSCOL(MAXVAR,2) COMMON / INDEX / INDDTM,NEWDTM,INDASD,INDFK,MAXLEN~INDCT~

Datum shift and conversion of geographical coordinates

96 a INDGT,MUMVAR,VPOS,POSCOL

97 CHARACTER*80 FORMAT (MAXFIL) 98 COMMON / FMT / FORMAT 99C . . . . . . . .

459

I00 INCLUDE 'ANSICOMM.FOR' 10it .................... C I02C ANSILIB COMMON C 103C . . . . . . . . . . . . . . . . . C 2 0 4 PARAMETER ( MAXWIN m 25 ) 105 INTEGER ROWBEF,COLBEF,INDBEF,WNUM,WINROW,WINCOL 106 CRARACTER*I WINDOW(MAXWIN,25,80) 207 COMMON /ANSII/ ROWBEF,COLBEF,INDBEF,WNUM,WINCOL,WINROW 108 COMMON /ANSIC/ WINDOW 1 0 9 C * * * * * f o [ MSDOS 210¢ I N T E G E R * 2 A X , B X , C X , D X , S I , D I , D S , E S , F L A G S l i l t COMMON /REGS/ AX,BX,CX,DX,SI,DI,DS,ES,FLAGS 1 1 2 C * * * * * 113C . . . . . F o r VAX-VMS 114 BYTE WG(MAXWIN,25,80) 115 INTEGER INFLAG,CHANN 116 COMMON /VTDEV/ INFLAG,CHANN,WG 117C ..................................................................... C 2 1 8 PARAMETER ( MAXPRJ m 9, FILHLP m 'IGMGIS.HLP') 119 DATA OK, PRGSTR ,PRGTXT /.TRUE., 'D A T U M' 120 & , ' A C o m p u t e r P r o g r a m f o r Da tum S h i f t end C o n v e r s i o n o r ' 121 & ,'Oeographlcel C o o r d i n a t e s between Different Cartographic' 122 & ,' Systems ' / 123C . . . . . 124 ILOG = 10 1 2 5 IHELP = 1 1 126 LOGPNT . 12 127 IOFILE(1) - I 128 IOFILE(2) m 2 1 2 9 NRECH = 20 130 MAXRH = 3 131C . . . . . I n i t i a l i z e H e l p F i l e I 232 OPEN (UNIT=IHELP,FILE=FILHLP,STATUS='OLD',ACCESS='DIRECT' 133 & ,FORM-'UNFORMATTED',RECL- 440,IOSTAT=IOSHLP) IVAX 1 3 4 C . . . . & ,FORMI'UNFORMATTED',RECLmI760,IOSTATmIOSHLP) |MS-DOS 135 DO 10 I - 1 , 1 0 0 136 10 RECHLPiI) - I 137 CALL INIMAT 1 3 8 CALL STARTD (PRGSTR,PRGTXT,HALT,INTSES) 1 3 9 IF (HALT) GOTO 999 140C . . . . . Open L o ~ f l l e I 1 4 1 OPEN (UNITIILOG,FILEI'DATUM.LOG',STATUSm'UNKNOWN') 142C ..... Main Menus 143 I CALL INPPAR (0,PRGSTR,INTSES,HALT,KPR3) 1 4 4 1 4 5 1 4 6 1 4 7 1 4 8 1 4 9 1 5 0 1 5 1 1 5 2 1 5 3 1 5 4 1 5 5 1 5 6 1 5 7 1 5 8 1 5 9 1 6 0 1 6 1 1 6 2 1 6 3 1 6 4 1 6 5 1 6 6 1 6 7 1 6 8 1 6 9 1 7 0 1 7 1 1 7 2

IF (HALT) GOTO 999 CALL GETIO (MAXPRJ,PRGSTR,INTSES,HALT,ABORT,KPRJ) IF (HALT) GOTO 999 IF (ABORT) GOTO I INPGEO = INDCT(1).EO.I INPPRJ - INDCT(I}.EQ.2 OUTGEO I INDCT(2}.EO.I OUTPR3 = INDCT(2).EQ.2 UTMSTD m KPRJ.EQ.2.AND.INDUTM.EQ.I IF (.NOT.DATUMC.AND.(INPGEO.AND.OUTGEO,AND.INDGT(1).EQ.

& INDGT(2)).OR.(INPPRJ.AND.OUTPRJ) ) THEN CALL ERRMSG(20,ICODE) GOTO 999

ENDIF IF (DATUMC) THEN

CALL MSKDTM (PRGSTR) IF (DTMACC) THEN

CALL DATUMS (OK) ELSE

CALL PUTSHF (0,DDX,DDY,DDZ,0.0D0,O.0D0,0.0D0) CALL WAIT (3.0)

ENDIF ENDIF IF (.NOT.OK) GOTO 999 IF (INDFK.EQ.2) THEN

CALL MSKKBD (PRGSTR,KPRJ) ELSE

CALL VTCSET(24,1} CALL VTWRIT ('Data Output: ',13)

CAGSO lS:4*S

46O M. LIGl a n d O. I~-)RrOLUZZI

173 ENDIF

174 2 In (INDFK.EQ.I) THEN 175C ........ File read 176 3 READ (IOFILE(1), '(A255)' ,END=999) DATSTR 177 READ {DATSTR,FORMAT(1),ERR=3} 178 ~ (DATI(VPOS(I,J)),J=I,NUMVAR{I) 1 179 ELSE In (INDFK.EQ.2) THEN 180C ........ Keyboard read 181 CALL KBDRD (DATI,HALT,ABORT) 182 IF (HALT) GOTO 999 183 I F (ABORT) GOTO 1

184 ENDIF 185 IF (DTMACC) HOLD = DATI(3 J 186 In (INPGEO) CALL COOGEO (DATI,CF,CI , .TRUE. ) 187 IF (INPPRJ) CALL COOPRJ (DATI,CF,CL, .TRUE. ,KPRJ)

188C ..... Datum Shift 189 In (DATUMC; THEN 190 IF (DTMSPE) THEN 1 9 1 CALL MLDSKJ (CF,CL,CFN,CLN) 192 ELSE IF (DTMACC) THEN 193 CALL DSHIFT (CF,CL,HOLD,CFN,CLN,HNEWI

194 ENDIF 195 ELSE 196 CFN = CF 197 CLN m CL

198 ENDIF 199C ..... Output 200C ..... Note: If Haigth is above ellipsoid ellminate comment next instr.

201C IF (DTMACC) DATI(3) = HNEW 202 IF ( OUTGEO .OR. (INPGEO.AND.OUTPRJ) 203 & CALL COOGEO (DATI,CFN,CLN,.FALSE.I 204 IF { OUTPRJ .OR. (INPPR,7.AND.OUTGEO) ) 205 & CALL COOPR3 (DATI,CFN,CLN, .FALSE. ,KPRJ)

206C . . . . . 207 READ (DATSTR,'(255AI)'} (STRHLP(J),J=I,MAXLEN(1)) 208 WRITE (DATHLP,FORMAT(2)) (DATI(VPOS(I,J)),J=I,NUMVA~(2) 1

209 DO 200 ImI,NUMVAR(1) l l O FMT - ' (255AI)' 211 IF ((I.NE.I).OR.((POSCOL(I,I)-I).NE.0) ) WRITE(FHT,'~A,13,A)') 212 ~ ' (' ,POSCOL(I,1)-I, 'X,255AI)' 213 200 READ (DATHLP,FMT) (STRHLP(J),J-POSCOL( I,I},POSCOL(I./! I

214 IF (MAXLEN(1).NE.M~XLEN(2)) THEN 215 WRITE{FMT,'(A,I3,A)') '(',MAXLEN{I),'X,255AI)' 216 READ (DATHLP,FMT) (STRHLP(J) ,J=MAXLEN(1)+I,MAXLEN(2) I

2 1 7 E N D I F 2 1 8 WRITE ~DATSTR,' (255AI)') (STRHLP(J),J=I,MAXLEN(2) ~ 219 WRITE (FMT,' (A,I3,A)') ' (A',MAXLEN(2}+I, ' )'

220 WRITE (IOFILE(R},FMT) DATSTR 221 IF (INDFK.EQ.I) THEN 222 CALL VTCSET (24,14) 223 LENSTR = 66

224 ELSE 225 CALL VTCSET (18,4) 226 LENSTR m 72 227 ENDIF 228 CALL VTATTR (i,0,0,0,0,01 229 CALL VTWRIT (DATSTR,LENSTR) 230 CALL VTATTR (0,0,0,0,0,0)

231 GOTO 2 232 999 CALL VTCSET 24,1) 233 CALL VTELIN~0} 234 CALL VTATTR(O,O,O,O,O,O)

235 STOP 236 END

1 C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C

2C DTLIB Double p r e c i s i o n Topographic subroutine LIBrary C 3C ...................................................................... C

4C Version : April 1988 C 5C Language : FORTRAN 77 C

6C INCLUDE files : DTCOMMON (Double precision Topographic COMMON) C 7C MS-DOS MICROSOFT FORTRAN 4.0 )FL /c /Gt DTLIB.FOR C 8C Remove or add c o m m e n t s or change compiler dlroctives ~ ! C

9C ....................................................................... C

10CSLAROE In e v e : ' y aeparately compiled module f o r MS-DOS C IIC ........................................................................ C

12C----- 13 SUBROUTINE GEOPRJ (KPRJ,CFP,CLP,CN,CE~

Datum shift and conversion o f geographical coordinates 461

1 4 C . . . . . F r o m g e o g r a p h i c a l t o p r o j e c t i o n c o o r d i n a t e s 15C O n i n p u t C f , C 1 i n r a d i a n s l ! 1 6 C O n o u t p u t C n , C e a d d e d f a l s e n o r t h i n g a n d e a s t i n g a n d r e d u c e d b y K0 1 7 C

18C 1 D i r e c t M e r c a t o r [ c o n f o r m a l ) 19C 2 UTM ( c o n f o r m a l ) 20C 3 c b l i q u e M e r c a t o r ( c o n f o r m s 1 ) 21C 4 C a s s i n i S o l d n e r ( e q u i d i s t a n t ) 22C 5 L a a b e r t C o n f o r m s 1 ( F r e n c h , A n g l o s a x o n , USGS m e t h o d s ) 23C 6 A l b e r s ( E q u a l A r e a ) 2 4 C 7 P o l y c o n i c ( N e i t h e r c o n f o r m a l n o r E q u a l A r e a ) 2 5 C 8 Stereographic (Conformal) ( P o l a r , oblique-equatorial a s p e c t ) 26C 9 Lambert Azimuthal (Equal areal 27C ......

28 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 29 INCLUDE 'DTCOMMON.FOR' 70 LOGICAL GOLOOP

7 1 CF = C F P 72 CL = CLP

73 IF (DABS(CF).GE.HALFPI) CF = DSIGN(1.D0,CF)*(HALFPI-EPSI) 74 THETA = CSIGN • (CL-CL0) 75 SCL = DSIN(THETA) 76 CCL m DCOS(THETA) 77C ..... Entry point for different projections ~! 78 GaTe (I,2,3,4,5,6,7,8,9), KPRJ 79C ..... Cylindrical projections t ) 8 0 I C O N T I N U E 8 1 C . . . . . D i r e c t M e r c a t o r ( c o n f o r m a l ) S2 CN = K0 • RAYPAR • ELLE(CF) + CN0 83 CE m K0 • RAYPAR • THETA + CE0 8 4 R E T U R N 85 2 CONTINUE

86C ..... UTM (conforms1)

87 IF (DABS(THETA).EQ.HALFPI) THETA = THETA-DSIGN(I.D0,THETA)eEPSI 88 P S I m E L L E ( C F ) 89 $HPSI m DSINH(PSI) 90 CHPSI m D C O S H ( P S I ) 9 1 S C L S O = S C L • S C L 92 CCLSQ - C C L • C C L 93 SH2PSI m DSINH(2.0D0•PSI) q 4 $7CL m DSIN(2.0D0•ThETA) 95 $1NL m SCL/CHPSI

96 $INLSQ m SINL•SINL 97 COSLSQ m 1.0D0-SINLSQ

98 C H P C L 4 m CHPSI•*4•COSLSQ•COSLSQ

99 CFS m DATAN(SHPSI/CCL) 100 C L S m D A T A N H ( S I N L ) 101 A - SHPSI • CCL * (I.0D0+SINLSQ)/(CHPSI•COSLSQ)**2 102 B m SINL • (CCLSQ-SHPSI•SHPSI)*(CHPSI•CO~LSQ)*•(-2)

103 C m (SH2PSI*SH2PSI-S2CL•S2CL)/(4.0D0*CHPCL4) 1 0 4 D - ( S H 2 P S I • S 2 C L ) / ( 2 . 0 D 0 • C H P C L 4 ) 105 C2 - C*C

106 D2 m D•D

107 CD = C•D 108 S0P - 1 . 0 D 0 109 S0D = 0 . 0 D 0 1 1 0 S i P = C

111 S I D - D 112 S 2 P = C 2 - D 2

113 S2D m 2 . 0 D 0 • C D 1 1 4 S 3 P = C • ( C 2 - 3 . 0 D 0 • D 2 } 115 S3D - D • ( 3 . 0 D 0 • C 2 - D 2 ) 116 S 4 P - ( C 2 - D 2 ) • ' 2 - ( 2 . 0 D 0 • C D ) • • 2 117 S4D = 4 . 0 D 0 • C D • ( C 2 - D 2 ) 1 1 8 S U M S P = P 0 * S O P - P 2 • S I P + P 4 • S 2 P - P 6 * S 3 P + P e e s 4 P 119 SUMSD = P0•SOD - P 2 " S I D + P 4 • S 2 D - P 6 " S 3 D + P S " S 4 D

120 CN = K0 * SEO • (P•CPS + A'SUMSP - B'SUMSD) + CN0 121 CZ m K0 • SEQ • ( P • C L S + B•SUMSP + A 'SUMSD) + C E 0 1 2 2 R E T U R N

1 2 3 3 CONTINUE 124C . . . . . O b l i q u e M e r c a t o r ( c o n f o r m a l ) 125 IF(DABS(TNETA).GT.PIGREC) THETA = CL-DSIGN(1.D0,THETA)•TWOPI-CL0 126 Q - C3 • DEXP(C2•ELLE(CF))

127 S - ( Q - 1 . D 0 / Q ) * 0 . S D 0 128 T - (Q+I.D0/Q) * 0.SD0 129 V - DSIN(C2•THETA)

130 U m (-V*CGAM0+S*SGAM0)/T

402 1%,1. LIG1 and G. BORrOLCZZ=

131 IF (DABS(U).EQ.I.D0) U = U ÷ OSIGN(I.D0,U)*EPSI

132 VC = CI*DLOG((I-D0-U)/(I.D0+u))/(2.D0*C2) 133 C2CL = DCOS(C2*THETA)

1 3 4 IF (C2CL.EQ.0.D0) UC = CI*C/*THETA

135 IF (C2CL.NE.0.D0) UC = CI*DATAN( (S*CGAM0+V*SGAM0~/CZCL~/C2

136 CE = K0 * (VC*COMA + UC*SOMA) + CE0

137 CN = K0 * (UC*COMA - VC*SOMA) ÷ CN0 138 RETURN

139 4 CONTINUE

140C ..... Cessini Soldner (equidistant 141 CFI = CF

142 CE = 0.0D0

143 4001 GOLOOP = .FALSE.

144 CETMP = CE

145 ENNEI = ENNE(CFI)

146 TANCFI = DTAN(CF1)

147 CE = ENNEI*DCOS(CFI)*THETA + CETMP*CETMP*CETMP*TANCFI~TANCFI/

1 4 8 ~ (3.0D0*ENNEI*ENNEI) 149 IF (DABS(CE-CETMP) .GT,EPSI) THEN 150 GOLOOP = .TRUE.

151 CFI = CF + CE*CE*TANCFI/(2.0DO*ERRE(CFI)*ENNEI~ 152 ENDIF

153 IF (GOLOOP) GOTO 4001 154 CN = 0.0D0

155 DTACF = CFI - CF0

156 4002 CNTMP = CN

157 CN = RHOO*DTACF+O.~50DO*Ec2,CNTMP~CNTMP,52CFO/(ENNEO*(I.ODO-EC2)) 158 IF (DABS(CN-CNTMP).GT.EPSI) GOTO 4002 159 CN - K0 * CN + CN0

1 6 0 CE = K0 * CE + CE0

161 RETURN

162C . . . . . Conic Projections 1~

163 5 CONTINUE

164C ..... Lambert Conformal

165 THETA = XNI * TIIETA

166 IF (INDLAM.EQ.I) THEN

167C ........ French Method Lambert Conformal Tangent Cone)

168 XRHO = RHO0 ~ DEXP -XNI~(ELLE(CSIGN'CF)-PSI0)) 169 ELSE

170C ........ Angloaaxon method Lambert Conformal Secant Cone

171 XRHO = RHO0 * DEXP -XNI*ELLE(CSIGN*CF})/CI 172 ENDIF

173 CN = KO * (CSIGN " ~RHO0 - XRHO'DCOS(THETA))) + CN0

174 CE - K0 * (CSIGN * (XRHO * DSIN(THETA) ) ) + CE0 d

175 RETURN

176 6 CONTINUE

177C ..... Albera (Equal Area)

178 XRHO - SEQ * DSQRT(CI-XNI*CFTOQ(CSIGN*CF)) / XNI

179 THETA = XNI * THETA

180 CN m K0 * CSIGN * (RHO0 - XRHO~DCOS(THETA) ) + CN0

181 CE = K0 * CSIGN * (XRHO * DSIN(THETA) ) + CE0

182 RETURN

183 7 CONTINUE

184C ..... Polyconic (Neither conformal n o r Equal A~ea)

185 IF (CF.EQ.0D0) THEN

186 CN - K0*CSIGN*(-EMME0) + CN0

187 CE = K0*CSIGN*SEQ*THETA + CE0

1 8 8 ELSE

189 CSCF = CSIGN * CF

190 EX - THETA * DSIN(CSCF)

191 ENT = ENNE(CSCF)/DTAN(CSCF)

192 CN = K0tCSIGN*(EMME(CSCF)-EMME0+ENT*(I.D0-DCOS(EX ~)+CN0

193 CE - K0*CSIGN*(ENT*DSIN(EX) ) ÷ CE0

194 E N D I F

195 RETURN 196C . . . . . Azimuthal Projections ! !

197 8 CONTINUE 198C ..... Stereographic (Conformal) (Polar. oblique-equato~ lal a~;pect)

199 IF (INDSTR.EQ.11 THEN

200C . . . . . . . Polar aspect 201 XRHO = POLCOS * DEXP(-ELLE(CSrGN*CFI •

202 CN = K0 • CSIGN * (-XRHO ~CCL) + CN0

203 CE = K0 * CSIGN • ( XRHO*SCL) + CE0

204 ELSE 205C ....... Oblique (also equatorial when cfl=0) aqpect

206 CFCHI - CHI(CSIGN*CF)

207 CCHI - DCOS(CFCHI)

D a t u m shift and conve r s ion o f geograph ica l coord ina tes

2 0 8 2 0 9 2 1 0 2 1 1 2 1 2 2 1 3 2 1 4 2 1 5

SCHI = DSIN(CFCHI)

CCH • CCHI'CCL A = Cl / (CCHI0*(I.D0+SCHI0*SCHI+CCHI0*CCH))

CN = K0 * CSIGN * A*(CCHI0*SCHI-SCHI0*CCH) + CN0

CE = K0 * CSIGN * A QCCHI*SCL + CE0

E N D I F RETURN

9 CONTII~UE 2 1 6 C . . . . . L a m b e r t A z i m u t h a l ( E q u a l a r e a ) 2 1 7 Q = C F T O Q ( C S I G N ' C F ) 2 I S I F t T N D L A Z . E Q . 1 ) THEN 2 1 9 C . . . . . P o z a r a s p e c t N o r t h - S o u t h 2 2 0 XRHO - SEQ * D S Q R T ( C 1 - Q ) 2 2 1 CE = K0 * C S I G N * ( X R H O ' S C L ) + CN0 2 2 2 CN = K0 * C S I G N * ( - X R N O ' C C L ) + CE0 2 2 3 E L S E 2 2 4 C . . . . . O b l i q u e ( E q u a t o r i a l w h e n c f l = 0 ) a s p e c t 2 2 5 BETA - DASIN(Q/CI) 226 CBETA = DCOS(BETA) 2 2 7 SBETA = Q/CI 228 B m C2*DSQRT(2.D0/(I.D0+S~0*SBETA+CB0*CBETA*CCL)) 2 2 9 CN = K0 * CSIGN * ((B/C3)*(CB0*SBETA-SB0"CBETA*CCL)) + CN0 2 3 0 CE = K0 * CSIGN * (B*C3*CBETA*SCL) + CE0 2 3 1 ENDIF 2 3 2 RETURN 2 3 3 END

2 SUBROUTINE PRJGEO (KPRJ,Y,X,CF,CL) 3C ..... From Projection coordinates to geographical coordinates 4C On input ¥,X subtracted False masting and northing, expanded by K0 5C . . . . . On o u t p u t C F , C L i n r a d i a n s , C I a d d e d t h e v a l u e o f c e n t r a l m e r i d i a n 6 IMPLICIT DOUBLE PRECISION (A-R,O-Z) 7 INCLUDE 'DTCOMMON.FOR'

48 LOGICAL TSING,GOLOOP 49 CN = ( ¥ - C N 0 ) / K 0 50 CE - ( X - C ¢ 0 ) / K 0 51C . . . . . E n t r y p o i n t f o r d i f f e r e n t p r o j e c t i o n s I I 52 GOTO (1,2,3,4,5,6,7,8,9), KPRJ 53C . . . . . C y l i n d r i c a l p r o j e c t i o n s I 1 54 1 CONTINUE 55C . . . . . D i r e c t M e r c a t o r ( C o n f o r m a } ) 56 CF = DASIN (SILAT(CN/RAYPAR)) 57 CL - CE/RAYPAR + CL0 58 RETURN 59 2 CONTINUE 60C . . . . . U.T.M. (Gauss-Kruger) ( C o n f o r m a l ) 61 R m SEQ*(I.0D0--EL0) 62 CNS m CN/R 63 CES = CE/R 64 SCNS - DSIN(CNS) 85 CCNS = DCOS(CNS) 66 SHCES - DSINH(CES) 67 CHCES - DCOSH(CES) 68 F - DASI~i(SCNS/CHCES) 69 U = DLOG(DTAN(FORTPI+F/2.0D0}) 70 XL - DATAN(SHCES/CCNS) 71 A = SCNS*CHCES 72 B - CCNS*SHCES 73 A2=A*A 74 A4=A2*A2 75 A6-A4*A2 76 B 2 m B * B 77 B 4 = B 2 * B 2 70 B 6 - B 4 " B 2 79 XP0 m 1 . 0 D 0 80 X P l - A 2 - 3 . 0 D 0 " B 2 81 XP2 m A 4 - 1 0 . 0 D 0 * A 2 " B 2 + 5 . 0 D 0 * B 4 82 XP3 = A6-2t.0D0*A4*B4+35.0D0~A~*B4-7.0D0"B6 83 XQ0 - 1 . 0 O O 84 X O l - 3 . 0 D 0 * A 2 - B 2 85 XQ2 - 5 . 0 D O Q A 4 - 1 0 . 0 D O ' A 2 " B 2 + B 4 86 XO3 - 7 . 0 D O Q A 6 - 3 5 . 0 D 0 * A 4 " B 2 + 2 1 . 0 D 0 ' A 2 " B 4 - f 1 6 87 CL - XL-BO(EL0eXQ0-ELI*XQI+EL2*XQ2-EL3"XQ3) + CL0 88 CF - DASIN!SILAT(U-A'(EL0*XP0-ELI'XPI+EL2"XP2-EL3"XP3) ) ) 89 RETURN 90 3 C O N T I N U E 9 1 C . . . . . O b l l q u e M e r c a t o r ( C o n f o r m a l )

463

464 M~ LK;I a n d O. [~OalOLLZZI

9 2 VC - CE*COMA - CN*SOMA

93 UC -. CN*COMA + CE*SOMA

94 Q = DEXP(-C2*VC/CI~

95 S = (Q-1.D0/Q) " 0.590

96 T = (Q+I.D0/Q) * 0.5D0

97 V = DSIN(C2*UC/CI)

98 U = (V'CGAM0+S*SGAM0)/T

99 TEMP = DATAN2( (S*CGAM0-V'SGAM0),DCOS(C2*UC/CI !

1 0 0 ~F (DABS(TEMP).GT.PIGREC) TEMP = TEMP - DSIGN(I ~D0,TEMP)'TWOPI

I01 CF m DASIN(SILAT(-I.DO/C2*DLOG(C3/DSQRTI (I.DO+U~/(I.DO-U)) ) ) ) 102 CL = - TEMP/C2 + CL0

103 R E T U R N

104 4 CONTINUE

I05C ...... Cassini-Soldner

106 CFI=CFO+CN/RHOO-O.75DO*EC2*CN*CN*S2CFO/(RHOO*EgNEO'i I.ODO-EC2}I

107 ENNEI = ENNE(CFI) i08 TANCFI = DTAN(CF1)

109 CF = CFI - 0.5D0*CE*CE*TANCFI/(ERRE(CFI)*ENNEI}

ii0 CL = CL0 + CE/(ENNEI*DCOS(CFI))*( 1.0D0 - CE*CE'TANCFI*TANCFI/

iII ~ (3.0D0*ENNEI'ENNEI ] )

112 RETURN

113C ..... Conic Projections I~

114 5 CONTINUE

115C ..... Lambert Conformal

116 THETA = DATAN(CSIGN*CE/(RHO0-CSIGN*CN) )

117 IF (TSING(THETA,PIGREC)) THEN

118 XRHO - (RHO0-CSIGN'CN)/DCOS(THETA)

119 ELSE

120 XRNO - CSIGN'CE / DSIN(THETA)

121 E N D I F

1 2 2 IF (INDLAM.EQ.I) THEN

123C ........ French Method (Lambert Conformal Tangent Cone)

124 CF - CSIGN * (DASIN(SILAT(PSI0-DLOG(XRHO/RHO0)/XNI)) )

125 ELSE 126C ........ Anglosaxon method (Lambert Conformal Secant Cone)

[27 CF - CSIGN * (DASIN (SILAT (-DLOG(XRHO'CI/RHOO)/XNI J I )

128 ENDIF

129 CL m CSIGN*THETA/XN£ + CL0

130 RETURN

1 3 1 6 CONTINUE

132C ..... Albera (Equal Area)

133 THETA = DATAN(CSIGN'CE/(RHO0-CSIGN*CN) )

134 XRHO = DSQRT(CE*CE+(RHO0-CSIGN*CN)''2)

135 Q a (CI-XRHO*XRHO*XNI*XNI/(SEQ*SEQ))/XNI

136 CF - CSIGN * QTOCF(Q)

137 CL m CSIGN'THETA/XNI + CL0

1 3 8 RETURN

139 7 CONTINUE

140C ..... Polyconlc (Neither conformal nor Equal Area)

141 IF (CSIGN*CN.EQ.-EMME0) THEN

1 4 2 C F - 0 . 0 143 CL m CSIGN*CE + CL0

1 4 4 ELSE

145 Q - (EMME0+CSIGN*CN)/SEQ

146 S - CE*CE/(SEQ*SEQ) + Q*Q

147 CFTMP = Q

148 7001 GOLOOP - .FALSE.

149 T = DSQRT(I.D0-EC2*DSIN(CFTMP)*'2)'DTAN(CFTMP!

150 EM - EMME (CFTMP)/SEQ

151 EMSQ - EM*EM

152 EMI = EMMED(CFTMP)

153 S2CF - DSIN(2.D0*CFTMP)

154 CF m CFTMP - (Q*(T*EM+I.D0)-EM-0.ED0*(EMSQ+S)*TJ/(0.25D0"EC2*

155 & S2CF*(EMSQ+S-2.DO*Q*EM)/T+(Q-EM)'(T'EMI-2.DO/S2CF)-EMI) 156 IF (DABS(CF-CFTMP).GT.EPSI) THEN

157 CFTMP l CF

158 GOLOOP m .TRUE.

159 ENDIF

160 IF (GOLOOP) GOTO 7001

161 CF - CSIGN*CF 162 CL - CSIGN*DASIN(CSIGN'CE*T/SEQ)/DSIN(CSIGN*CF] * CL0

1 6 3 ENDIF

164 RETURN

165 8 CONTINUE

166C ..... Steraographlc (Conformal)

167 IF (INDSTR.EQ.I) THEN

168C ......... Polar Aspect

Datum shift and conversion o f geographical coordinates 465

169 170 lTl 172 173 174 175 176 IT7 178 179

THETA - DATANI(CSIGN*CE,-CSIGN*CN) I F (TSING(THETA,PIGREC)) THEN

XRNO m - CSIGN*CN/DCOS(THETA)

ELSE XRHO m CSIGN*CE/DSIN(THETA)

ENDIF SCF m SILAT(DLOG (POLCOS/XRHO))

CF u CSIGN*DASIN (SCF) CL - CSIGN*THETA + CL0 IF (DAES(CL).GT.PIGREC) CL - -DSIGN(I.D0,CL)*TWOPI + CL

ELSE 280C . . . . . . . . . O b l i q u e a n d e q u a t o r i a l a s p e c t l S l RHO - D S Q R T ( C E * C E + C N * C N ) 182 CCE = 2.D0*DATAN(RHO*CCHI0/CI) 183 SCE = DSIN(CCE) 2 8 4 CCE - DCOS(CCE) 185 IF (RHO.EQ.0.D0) CHI - CHI0 286 IF (RHO.NE.0.D0) CHI 1 DASIN(CCE*SCHI0+CSIGN*CN*SCE*CCHI0/RHO) 187 TEMP = RHO*CCHI0*CCE-CSZGN*CN*SCHI0*SCE

288 CF l CSIGN*DASIN(SILAT(DLOG(DTAN(FORTPI+CHI/2.D0)))) 189 CL = CSIGN*DATANI(CSIGN*CE*SCE,TEMP) + CL0 190 ENDIF 1 9 1 RETURN 1 9 2 9 CONTINUE

193C ..... Lambert Azimuthal (Equal area) 2 9 4 I F (INDLAZ.EQ.I) THEN 1 9 5 C . . . . . . . . P o l a r a s p e c t 196 THETA m DATANI(CSIGN*CE,-CSIGN*CN) 197 RHO - DSQRT(CN*CN+CE*CE) 1 9 0 Q I CI-RHO*RHO/(SEQ*SEQ) 199 CF m CSIGN*QTOCF(Q) 200 CL I CSIGN*THETA + CL0 201 I F (DABS(CL).GT.PIGREC) CL - -DSIGN(I.D0,CL)*TWOPI + CL

202 ELSE 203C ........ O b l i q u e Aspect 204 C3SO " C3 "C3 2 0 5 RHO - DSQRT(CE*CE/C3SQ+CN*CN*C3SQ) 206 CCE m 2 . D 0 * D A S I N ( R H O / ( C I * 2 . D 0 ) ) 207 SCE - DSIN(CCE) 2 0 8 CCE m DCOS(CCE) 209 I F ( R H O . E Q . 0 . D 0 ) Q - C I * S B 0 210 IF (RHO.NE.0.D0) Q m CI * (CCE*SB0 + C3*CSIGN*CN*SCE*CB0/RHO) 211 TEMPI C3*RHO*CB0*CCE-C3SO*CSIGN*CN*SB0*SCE 212 CF 1 C S I G N * Q T O C F ( Q ) 213 CL i CSXGN*DATAN2(CSIGN*CE*SCE,TEMP) + CL0 224 ENDIF 2 1 5 RETURN 216 END

1 C - - - m - S U B R O U T I N E P R 3 P A R ( K P R 3 ) I t i n i t i a l i z e s c o m m o n c o s t a n t s f o r e l l i p s o i d a n d p r o j e c t i o n

2 ) C . . . . .

4 I M P L I C I T DOUBLE P R E C I S I O N ( A - H , O - Z ) 5 I N C L U D E 'DTCONMON.FOR'

46C . . . . . E l l i p s o i d 47 E m D S Q R T ( E C 2 ) 48 ED m E / 2 . 0 D 0 49 E C 4 m E C l e E C 2 50 E C 6 m E C 4 * E C 2 51 E C 8 m E C 4 * E C 4 52 E C 1 0 o E C B * E C 2 53 E C 1 2 m E C 6 * E C 6 54 E C I 4 m E C I l * E C 2 55C . . . . . G e n e r a l 56 LATN m . T R U E . 57 C S I G N m I . D 0 58 I F ( K P R J . G E . 5 ) THEN 59C . . . . . . . . . F o r C o n i c e n d A z i m u t h a l p r o j e c t i o n s 60 CFTMP - C r 0 62 I F ( C F T M P . E Q . 0 . D 0 ) CFTMP - C Y l 62 CSIGN m D S I G N ( I . D 0 , C F T M P ) 63 I F ( C S I O N . L T . 0 . D 0 ) LATN m . F A L S E . 64 E N D I F 6 5 C . . . . . E n t r y p o i n t f o r d i f f e r e n t p r o j e c t i o n s t l 66 GOTO ( I , 2 , 3 , 4 , 5 , 6 , 7 , 8 , g ) , K P R 3 67 I CONTINUE 68C . . . . . D i r e c t M e r c a t o r 69 RAYPAR - ENNE(CF0)*DCOS(CF0)

466 M. LIol and G. BORTOLUZZl

70 RETURN 71 2 CONTINUE

72C ..... UTM (Gauss-Kruger)

73C ..... Costants for UTM-Geo (EL..) Geo-UTM (P..) trasformatlon

74 ELOlO.25DO*EC2+3.DO*EC4/64.DO+5.DO*EC6/256.DO+I75.DO*ECB/16384.DO 75 ELIIEC4/24.D0+35.D0*EC6/768.D0+71.D0*ECS/1536.D0

76 EL2=I27.DO'EC6/SBOS.DO+9803.DO'ECS/185856.DO 77 EL3=33239.D0*ECB/1626240.D0

78 P 0 m E L 0 + 441.D0*ECI0/65536.D0 79 P=I.0D0-P0

$ 0 P21(13.DO*EC4/96.DO+59.DO'EC6/384.DO+I307.DO*ECS/8191.DO+I5943.DO 81 • "ECI0/98304.D0)

82 P4-(61.D0*EC6/480.D0+609.D0*ECS/2048,D0+20627.D0*ECI0/40960.D0)

83 p6m(49561.DO*ECB/322560.DO÷IO4393.DO'ECIO/184320.DO) 8 4 PB=(34729.D0*ECI0/161280.D0}

85 RETURN 86 3 CONTINUE

87C . . . . . oblique Mercator .. (Snyder,1982)

88 CSIGN = DSIGN(I.D0,CF0)

89 SCF0 = DSIN(CF0)*'2

90 CCFO = DCOS(CF0)

91 C2 = DSQRT(I.D0+EC2*CCF0**4/(I.D0-EC2) ) 92 C l = SEQ " C2 * DSQRT(I.DO-EC2)/(I,DO-EC2"SCFO' 93 D m C2 * DSQRT(I.D0-EC2)/(CCF0'DSQRT(I,D0-ECf'SCF0> ~

94 IF (D.EQ.I.D0) D = D - EPSI

95 F - (D + CSIGNQDSQRT(D*D-I.D0) ) 96 C3 = F " DEXP(-C21ELLE(CF0) )

97 I F (INDOBM.EQ.I) T H E N

98C ....... If central line passing through two given polnt~

99 TH = DEXP(-C2"ELLE(CFI) )

100 T L m D E X P ( - C 2 * E L L E ( C F 2 } )

I01 IF (DABS(CLI-CL2).GT.PIGREC) CL2=CL2+DSIGN(I.D0, (CLI-CL2))~TWOPI

102 CL0 m (CLI+CL2)/2.D0 - DATAN((C3*C3-TL*TII)/(C3*C3+TL+TII) *

I03 & DTAN(C2*(CLI-CL2)/2.D0) ' (TL+TH)/(TL-TH)) / C2

I04 I F (DABS(CLI-CL0).GT.PIGREC} CL0=CL0+DSIGN(I.D0,(CLI-CL0) ) ~TWOPI

105 GAM0 - DATAN(DSIN(C2*(CLI-CL0) )*2.D0/(C3/TH-TH/C3) )

106 OMAZIM = DASIN(D*DSIN(GAM0)) 107 E L S E

I08C ....... If Azimuth of central llne through the central poznt was glven 109 GAM0 i DASIN(DSIN(OMAZIM)/D)

II0 CL0 m CLI - (DASIN((F-I.D0/F)*DTAN(GAM0)/2.0)) / C2

Ill UO - CSIGN'CI/C2 " DATAN(DSQRT(D'D-I.D0)/DCOS(OMAZIM)) 1 1 2

1 1 3

1 1 4

1 1 5

1 1 6

1 1 7

1 1 8 4 1 1 9 C . . . . . 1 2 0

1 2 1

122 1 2 3

ENDIF

SOMA - DSIN (OMAZIM) COMA - DCOS (OMAZIM)

SGAM0 = DSIN {GAM0)

CGAM0 - DCOS (GAM0)

RETURN

CONTINUE

Cassini-Soldner

RHO0 - ERRE(CF0)

ENNE0 - ENNE(CF0)

S2CF0 = DSIN(2.D0*CF0)

RETURN 124 5 CONTINUE

125C ..... Lambert Conformal

126 PSI0 = ELLE (CSIGN'CF0)

127 IF (INDLAM.EQ.I) THEN 120C ........ French Method

1 2 9 XNI m DSIN(CSIGN*CF0)

130 RHO0 - ENNE(CSIGN*CFO}/DTAN(CSIGN*CFO) 131 E L S E

1 3 2 C ........ Anglosaxon Method

I]] PSII l ELLE (CSIGN*CFI) 134 PSI2 - ELLE (CSIGN*CF2) 135 ENCFI = ENNE(CSIGN*CF1)*DCOS(CSIGN*CF1)

136 ENCF2 - ENNE(CSIGN*CF2)*DCOS(CSIGN*CF2) 137 XNI - DLOO(ENCFI/ENCff2)/(PSI2-PSII) 13a C1 = DEXP(-XNI*PSI0) 139 RHO0 - ENCFI/(XNI*DEXP(-XNI*PSII)) * C1 140 ENDIF 141 RETURN 1 4 2 6 CONTINUE

143C ..... Albers Equal Area 1 4 4 Q0 I CFTOQ{CSIGN*CF0}

145 Q1 - CFTOQ(CSIGN*CFI} 146 Q2 m CFTOQ(CSIGN*CF2)

D a t u m shift and c o n v e r s i o n o f geographical coo rd ina t e s

1 4 7 E N C F 1 - DCOS(CSIGN*CF1)/DSQRT(I.DO-EC2*DSIN(CFI)**2) 14 8 ENCF 2 l DCOS(CSIGN*CFR)/DSQRT(I.D0-ECR*DSIN(CFR)**2) 1 4 9 X N I - ( E N C F I * E N C F I - E N C F 2 e E N C F 2 ) / ( Q 2 - Q 1 ) 1 5 0 C1 " E N C F I * Z N C F I + X N I * Q 1 1 5 1 RHO0 - SEQ * DSQRT(CI-XNI*Q0)/XNI 1 5 2 RETURN 1 5 3 7 CONTINUE 154C ..... Polyconlc 155 P0 - I.DO-ECR/4.0-EC4*3.DO/64.DO-EC6*5.DO/256.DO- 156 & EC8*ITS.0/16384.D0 1 5 7 P2 - EC2*3.DO/8.DO+EC4*3.DO/32.DO+EC6*45.DO/lO24.DO+ 1 5 0 & E C e * I 0 5 . D 0 / 4 0 g 6 . D O 1 5 9 P4 - EC4*IS.DO/256.DO+EC6*45.DO/lO24.DO+ 160 & EC8*525.D0/16384.D0 1 6 1 P6 I EC6*35.D0/3072.D0+EC8*I75.D0/12288.D0 162 P8 - ECB*315.D0/131072.D0 163 EMME0 m EMME(CSIGN*CF0} 164 RETURN 165 8 CONTINUE 1 6 6 C ..... S t e r e o g r a p h i c 16T IF (INDSTR.EQ.1) THEN 1 6 8 C . . . . . . . . P o l a r a s p e c t 169 SINCF0 - DSIN (CSIGN*CF0) 170 POLCOS 1 (SEQ*(I.0D0+SINCF0)*(I.0D0-E*SINCF0)**EDI / 1 7 1 & (DSQRT(I.0D0-ECR*SINCF0*SINCF0)*(I.0D0+E*SINCF0)**ED) 172 ELSE 1 7 3 C ........ o b l i q u e ( a l s o e q u a t o r i a l ) aspect 174 C H I 0 - CHI(CSIGN*CF0) 175 CCHI0 - DCOS(CHI0) 176 SCHI0 - DSIN(CHI0) 177 Cl - 2.D0 * ENNE(CSIGN*CF0) * DCOS(CSIGN*CF0) IT8 ENDIF I T 9 RETURN 1 8 0 9 C O N T I N U E 1 8 1 C . . . . . L a m b e r t A z i m u t h a l 1 8 2 C . . . . . P o l a r a n d o b l i q u e a s p e c t 1 8 3 C l - CFTOQ(HALFPI) 184 I F (INDLAZ.EO.2) THEN 1 8 5 C . . . . . . . . O b l i q u e a s p e c t 1 8 6 S B 0 - CFTOQ(CSIGN*CF0)/C1 1 8 7 CBO - D C O S ( D A S I N ( S B 0 ) ) 1 8 8 C2 - SEO * D S O R T ( C 1 / 2 . D 0 ) 18g C3 - ENNE(CSIGN*CF0) * DCOS(CSIGN*CF0) / (CR*CB0) l g 0 E N D I F 1 9 1 RETURN 192 END

2 SUBROUTINE MLDSKJ (CF,CL,CFNpCLN) 3 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 4 INCLUDE 'DTCOMMON.FOR'

45C . . . . . R e d u c e d M o l o d e n s k j p r o c e d u r e 46 DSCF - DSIN(CF) 47 DCCF - DCOS(CF) 48 DSCL m DSIN(CL) 49 DCCL m DCOS(CL) 50 DSA - DSIN(ARCS) 51 52 53 54 55 56 57

DCF - &

DCL - CFN - CLN - RETURN END

IC----- 2 3C .....

(-DDX*DSCF*DCCL-DDY*DSCF*DSCL+DDZ*DCCF+(SEO*DEFFE+ ErFE*DSEO)*DSIN(2.D0*CF))/(ERRE(CF)*DSA*3600.D0)

(-DDXODSCL+DDY*DCCL)/(ENNE(CF)*DCCF*DSA*3600.D0) (CF + DCF*DTOR) (CL + DCL*DTOR)

SUBROUTINE DSHIFT (CF,CL,HOLD,CFN,CLN,HNEW) It performs datum shift: Cfn,Cln,Hnew shifted coordinates

4 5

46 47 48 49 50 51 52 53 54

IMPLICIT DOUBLE PRECISION (A-H,O-Z) INCLUDE 'DTCOMMON.POR' REAL*8 COLD(3),CNEW(3) $EQ - SEQON(1) EC2 m ZCRON(1) CALL GEOXYZ (CF,CL,HOLD,COLD(II,COLD(2),COLD(3)) CALL OCSHFT (COLD,RM,TM,SM,CNEW) SEOm SEQON(2) EC2 m ZC2ON(2) CALL XYZOEO (CNEW(1),CNEWiR),CNEWi3),CFN,CLN,HNEW) RETURN

467

4 6 8 M . L I G l a n d (5 . B O R T O L L Z Z I

5 5 E N D

I t = = = - = 2 SUBROUTINE GCSHFT(~OLD,R,T,F,CNEW)

3C ..... Geocentric shift 4C COLD,CNEW m Matrlx of Old X,Y,Z and Matrlx of New X,Y,Z

5C R = Rotation Matrix

6C T m Translation Matrix

7C F = S c a l i n g M a t r i x 8 IMPLICIT DOUBLE PRECISION (A-H,O-Z~ 9 DIMENSION COLD(3) ,R(3,3),T(3),F(3),CNEW(3 }

I0 DO I00 I = 1,3

I I I 0 0 CNEW(I) = R(I,I)'F(1)'(COLD(1)-T(1))+R(I,2)'F(2)~(COLD(2)-TI2) )

1 2 ~ + R(I,3)*F[3)'(COLD(3)-T(3)) 13 RETURN 14 END

lC=-=== 2 SUBROUTINE GEOXYZ(CF,CL,H,X,Y,Z) 3C ..... It computes the geocentric coordinates (x,y,z in meters) from

4C the elllpsoidal latitude,longitude (cf,cl, radians) and heigth 5 IMPLICIT DOUBLE PRECISION (A-H,O-Z)

6 INCLUDE 'DTCOMMON.FOR'

47 EN = ENNE(CF)

4 8 SCF = DSIN(CF)

49 CCF = DCOS(CF)

50 SCL = DSIN(CL) 51 CCL = DCOS(CL)

52 X = (EN+H)°CCF*CCL 53 Y = (EN+H)*CCF'SCL

5 4 Z = ( E N ' ( I . D 0 - E C 2 ) + H ) * S C F

55 RETURN

56 END

IC---=- 2 SUBROUTINE XYZGEO (X,Y,Z,CF,CL,Ht

3C ..... It computes the ellipsoidal latitude, longitude ~cf,cl,cadlansl

4C and height {in meters} from the geocentric x,y,z (in meters)

5 IMPLICIT DOUBLE PRECISION (A-H,O-Z)

6 INCLUDE 'DTCOMMON.FOR'

47 CL - DATAN(Y/X)

48 W m DSQRT(X*X + Y'Y)

49 CF - 0.D0 50 ZN = Z

51C . . . . . It iterates to compute latitude

52 i0 CFTMP - CF

53 CF m DATAN(ZN/W)

54 ZN = Z + EC2*ENNE(CF)'DSIN(CF) 55 IF(DABS(CF-CFTMP) .GT.EPSI) GOTO I0

56 IF(X.GE.Y) H - X/(DCOS(CF)*DCOS(CL) - ENNE(CF)

57 IF(X.LT.Y) H = Y/(DCOS[CF)*DSIN(CL) - ENNE(CF)

58 RETURN

59 END

IC-===-

2 SUBROUTINE INIMAT

3C . . . . . It initializes math and trigonometrlc constants

4 IMPLICIT DOUBLE PRECISION (A-H,O-Z)

INCLUDE 'DTCOMMON.FOR'

EPSI = 1.0D-9

PIGREC = DATAN2(0.0D0,-~.0D0) TWOPI = 2.0D0*PIGREC

FORTPI - PIGREC*0.25D0

HALFPI = PIGREC'0.50D0 DTOR - PIGREC/180.0D0 RTOD - 1.0D0/DTOR ARCS m DTOR/]600.0D0

RETURN END

iC----- 2 DOUBLE PRECISION FUNCTION DMSD60 (ALFA)

3C ..... Decoding O f Decimal Degrees from real numbers containing 4 C ..... Degrees, Minutes and seconds - Ex. 453000.000 --> 45.50000

5 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 6 X - DINT (ALFA/10000.D0)

7 Y - DINT ( (ALFA - X*Z0000.D0)/100.D0)

8 Z = A L F A - ( X * I 0 0 0 0 . O D 0 + Y ' Z 0 0 . 0 D 0 )

9 DMSD60 m X + Y/60.0D0 + Z/3600.0D0 RETURN END

5

4 6

4 7

4 8

4 9

5 0

5 1

5 2

5 3

5 4

5 5

i0

11

D a t u m shift a nd convers ion o f seograph ica l coord ina tes

ICmmmmm

2 DOUBLE P R E C I S I O N F U N C T I O N DSODMS ( A L F A , N U M D E C ) 3C . . . . . E n c o d i n g o f D o c i m e l D e g r e e s t o r e e l n u m b e r s c o n t a i n i n g 4C . . . . . D e g r e e s , M i n u t e s a n d s e c o n d s - E x . 4 5 . 5 0 0 0 0 - - ) 4 5 3 0 0 0 . 0 0 0 5 I M P L I C I T DOUBLE P R E C I S I O N ( A - H , O - Z ) 6 EPSZ m 5 . D 0 / ( 1 0 . D 0 O * N U M D E C ) 7 C S I G N - D S I G N ( 1 . D 0 , A L F A ) 8 ALFA m DABS ( A L F A ) 9 XD m D I N T ( A L F A )

10 XDM m ( A L F A - X D ) * 6 0 . 0 D 0 11 XM - D I N T ( X D H ) 12 XS - ( X D M - X M ) * 6 0 . 0 D 0 13 I F ( X S . G E . 6 0 . 0 D 0 - E P S I ) THEN 14 XS = 0 . D 0

15 XM = XM + 1 . 0 D 0 16 E N D I F 17 IF (XM.OE.60.0D0 ) THEN 18 XM m 0 . 0 D 0 19 XD - XD + 1 . 0 D 0 20 ENDIF 21 D60DMS m C S I G N * ( X D * I 0 0 0 0 . 0 D 0 + X M * I 0 0 . 0 D 0 + X S ) 22 RETURN 23 END

1 C . o - o - 2 DOUBLE P R E C I S I O N F U N C T I O N DMHD60 ( A L F A ) 3C . . . . . D e c o d i n g o f D e c i m a l D e g r e e s f r o m r e a l n u m b e r s c o n t a i n i n g 4C . . . . . D e g r e e s , M i n u t e s . h u n d r e d s - E x . 4 5 3 0 . 0 0 0 0 - - ) 4 5 . 5 0 0 0 0 5 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 6 X - DINT (ALFA/100.D0) 7 y m ALFA-X*I00.0D0 8 DMHD60 m X + Y / 6 0 . 0 D 0 9 RETURN

10 END I C - o - - - 2 DOUBLE PRECISION FUNCTION D60DMH (ALFA) ] C E n c o d i n g of Decimal Degrees to Real n u m b e r s c o n t a i n i n g 4C DegreesMinutes.Hundreds Es. 39.899 .... ) 3953.94 5 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 6 CSION m DSIGN(I.D0,ALFA) 7 ALFA m DABS (ALFA)

8 XD - DINT (ALFA) 9 XM m (ALFA-XD)*60.0D0

I0 IF (XM.GE.60.0D0-0.0005D0 ) THEN 11 XN m 0 . D 0 12 XD m XD + 1 . 0 D 0 13 ENDIF

14 D60DMH m CSIGN * (XD*I00.D0 + XM) 15 RETURN 16 END

1 C - o - - o 2 DOUBLE PRECISION FUNCTION RADDEG (XRAD,ICONV) 3C . . . . . I t c o n v e r t s a n g l o s f r o m r a d i e n s t o d i f f e r e n t f o r m a t s 4 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 5 INCLUDE 'DTCOMMON.FOR'

46 GOTO (10,20,30,40,50,60} ICONV

47 I0 RADDEG - D60DMS (XRAD * RTOD,3) 48 RETURN 49 20 RADDEG - D60DMH (XRAD * RTOD) 50 RETURN 51 30 RADDEG - XRAD * RTOD 52 RETURN 53 40 RADDEO m (XRAD * RTOD)*I00.D0/90.D0 54 RETURN 55 50 RADDEG m D60DMS(XRAD*RTOD/15.D003) 56 RETURN 57 6 0 RADDEO - XRAD 58 RETURN 59 END

1¢''''" 2 DOUBLE PRECISION FUNCTION DEORAD (XDEG,ICONV) 3C . . . . . It c o n v e r t s e n g l o s f r o m d i f f e r e n t f o r m a t s t o r s d i a n s 4 I M P L I C I T DOUBLE P R E C I S I O N ( A - N , O - Z ) 5 INCLUDE 'DTCOMMON.FOR'

46 GOTO (10,20,30,40,50,603 ICONV 47 10 DEGRAD m DMSD60(XDEG) * DTOR 48 RETURN

469

4";'0 M, LIGl and G . ~3RTOLCZZI

49 20 DEGRAD = DMHD60{XDEG) " DTOR

50 RETURN 51 30 DEGRAD = XDEG * DTOR

52 R E T U R N 53 40 DZGRAD = XDEG'90.D0/100.D0 "

54 RETURN

55 50 DEGRAD - DMSD60(XDEG) * DTOR

56 RETURN

57 60 DEGRAD = XDEG

58 RETURN 59 END

DTOR

" 15,D0

1Cmlmmm 2 DOUBLE PRECISION FUNCTION ENNE (X)

3C ..... Grand Normal {radius of curvature in the prime vertlcal) 8t lat.X

4 IMPLICIT DOUBLE PRECISION {A-H,O-Z)

5 INCLUDE 'DTCOMMON.FOR'

46 ENNE = SEQ/DSQRT(1.0D0-EC2*DSIN{X)*DSIN{X) }

47 RETURN 48 END

1 C = = = - ~ 2 DOUBLE PRECISION FUNCTION ERRE {X)

3C ..... Radius of curvature of meridian at latitude X 4 IMPLICIT DOUBLE PRECISION (A-H,O-Z)

5 INCLUDE 'DTCOMMON.FOR'

46 ERRE - SEQ*fl.0DO-EC2)/(I.ODO-EC2*DSIN(X)*DSIN{X) ) ~*I.50DO 4 7 R E T U R N 48 END 1C=m---

2 DOUBLE PRECISION FUNCTION ELLE (X)

3C ..... Increasing (isotherm) Latitude from allipsoidical latitude X 4 IMPLICIT DOUBLE PRECISION (A-H,O-Z)

5 INCLUDE 'DTCOMMON.FOR' 46 ESX - E'DSIN(X)

47 ELLE - DLOG(DTAN(FORTPI+X*0.5D0)'((I.0D0-ESX)/(I,0D0+ESX))**ED) 48 RETURN

49 END

1C----- 2 DOUBLE PRECISION FUNCTION SILAT (PSI)

]C ..... Sine of geographical latitude from increasing (1~otherm) latitude

4C ..... Tomellari(1977) cited in Bortoluzzi&Ligi (1986) Computsrs&Gaosc

5 IMPLICIT DOUBLE PRECISION (A-H,O-Z)

6 INCLUDE 'DTCOMMON.FOR'

47 TPBI m DTANH(PSI)

4B TPSI2 - TPSI*TPSI 49 TPSI4 - TPSI2*TPSI2

50 TPSI6 - TPSI4*TPSI2

51 TPSIB - TPSI4*TPSI4

52 TPSII0 = TPSI6*TPSI4

53 TPSI12 - TPSI6*TPSI6

54 TO m TPSI

55 T2 - TPSI'{1.0D0-TPSI2)

56 T4 = T2*(1.0D0-5.0D0"TPSI2/3.0D0) 57 T6 - T2*(1.0D0-4.0D0*TPSI2+I6.0D0*TPSI4/5.0D0)

58 T8 - T2*{I.DO-7.DO*TPSI2+IBB.DO'TPSI4/15.DO-2069.DO"TPSI6/315.DO) 59 TI0 - T2*(I.0D0-32.0D0*TPSI2/3.0D0+95.0D0*TFSI4/3 0D0

60 & -II344.0D0*TPSI6/315.0D0+883.0D0"TPSI8/63.0D0) 61 TI2 - T2t(I.0D0-15.0D0*TPSI2+65.0D0*TPSI4-37636.0D0*TPSI6/315.0D0

62 & +281107.0D0"TPSIB/2835.0D0-1594444.0D0*TPSII0/51975.0D0) 63 TI4 - T2"(I.0D0-20.0D0*TPSI2+)53.0D0*TPSI4/3.0D0 64 & -13904.0DO*TPSI6/45.0DO+II57437.0DO'TPSIB/2835.0DO 65 & -13841536.0DO*TPSIIO/51975.0DO+2199332.0DO'TPSII2/32175.0DO) 66 SILAT - T0+T2*EC2+T4*EC4+T6"EC6+TB*ECB+TIOQECI0+TI2*ECI2+TI4*ECI4

67 RETURN

68 END

IC--=-- 2 DOUBLE PRECISION FUNCTION CHI {X)

3C ..... Conformal latitude {Snyder, 1982)

4 IMPLICIT D O U B L E PRECISION ( A - H , O - Z } 5 INCLUDE 'DTCOMMON.FOR'

46 ESX - E'DSIN{X) 47 CHI ~ 2.DO*DATAN{DTAN{FORTPI+X/2.DO}'((I,DO-ESX)/ I.D0+ESX} )**ED)

48 & - HALFPI 49 RETURN 50 END

1C- .... 2 DOUBLE PRECISION FUNCTION CFTOQ (X) 3C ..... Q(CF)-Sina of authallc latitude " cftoq (halfpi) Snyder, 1982)

Datum shift and conversion o f geographical coordinates

4 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 5 INCLUDE 'DTCOMMON.FOR'

46 SCF - DSIN(X) 47 CFTOQ - (I.D0-EC2) * (SCF/(1.D0-EC2*SCF*SCF) - 48 & D L O G ( ( 1 . D 0 - E * S C F ) / ( 1 . D 0 + E * S C F ) ) / ( 2 . D 0 * E ) ) 49 RETURN 50 END IC----- 2 DOUBLE PRECISION FUNCTION QTOCF (X) 3C ..... Elllpsoidsl latitude trom Q(CF} 4 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 5 LOGICAL GOLOOP 6 INCLUDE 'DTCOMMON.FOR'

47 CFTMP - BASIN (X/2.D0) 48 XEC2 = X/(I.D0-EC2) 49 I GOLOOP s .FALSE. 50 SCF m DSIN(CFTMP) 51 TEMP ~ (I.D0-EC2*SCF*SCF) 52 CF m CFTMP + TEMP*TEMP/(2.D0*DCOS(CFTMP)) * 53 & ( XEC2 - SCF/TEMP +DLOG( (I.D0-E*SCF)/(I.D0+E*SCF) )/(2.D0*E) ) 54 IF (DABS(CP-CFTMP) .GT. EPSI) THEN 55 GOLOOP m .TRUE. 56 CFTMP m CF 57 ENDIF 58 IF (GOLOOP) GOTO 1 59 QTOCF - CF 60 RETURN 61 END IC----- 2 DOUBLE PRECISION FUNCTION EMME ( X ) 3C ..... Length Of arc of meridian at latitude X 4C Constants P0...P8 are initialized in PRJPAR 5 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 6 INCLUDE 'DTCOMMON.FOR'

47 EMME m SEQ * (P0*X - P2*DSIN(2.D0*X) + P4*DSIN(4.D0*X) 48 & - P6*DSIN(6.D0*X) + PB*DSIN(8.D0*X) ) 49 RETURN

50 END

2 DOUBLE PRECISION FUNCTION EMMED ( X ) 3C . . . . . T h e d e r i v a t i v e o f A r C o t M e r i d i A n ( u s e d i n P o l y c o n i c ) 4 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 5 INCLUDE 'DTCOMMON.FOR'

46 EMMED - P0 - 2.D0*P2eDCOS(2.D0*X) + 4.D0*P4*DCOS(4.D0*X)

47 & - 6.D0*P6*DCOS(6.D0*X} + 8.D0*PB*DCOS(8.D0*X) 4B RETURN 49 END IC----- 2 DOUBLE PRECISION FUNCTION FUSO (XLONG) ]C ..... UTM 8one according to XLONG (longitude) 4 IMPLICIT DOUBLE PRECISION (A-N,O-Z) 5 FUSO - DBLE(AINT((SNGL(XLONG) + 186.0) / 6.0)) 6 RETURN 7 END

2 DOUBLE PRECISION FUNCTION CMER (PUS) 3C ..... UTM - Central Meridian Longitude according to zone PUS 4 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 5 CMER - FUS*6.0D0 - 183.0D0 6 RETURN 7 END IC-m--- 2 DOUBLE PRECISION FUNCTION CONVER (CF,CL) 3C ..... Convergence Angle of UTM grid at point of Ist.,long. CF,CL 4 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 5 INCLUDE 'DTCOMMON.FOR P

46 CCFSQ 1 DCOS(CP)*DCOS(CF) 47 ETASQ - EC2 * CCFSQ / (I.0D0 - EC2) 48 CONVER - CL*DSIN(CF)*(I.0D0+CL*CL*CCFSQ*(I.0D0+3.0D0*ETASQ)/3.0D0) 49 RETURN 50 END

I C - - - - - 2 LOGICAL FUNCTION TSING (X,PIGREC) 3C ..... Test o f the singularity point theta-k*pigrec for k=-l,0,1 4C pigrac - 3 . 1 4 . . . 5 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 6 TSING ~ X.EQ.-PIGREC.OR.X.EQ.0.0D0.OR.X.EQ.PIGREC

471

472 M. LIGI a n d G. BORTOLL'ZZ]

7 RETURN

8 END

2 DOUBLE PRECISION FUNCTION DATANH (X)

3C ..... Hyperbolic erctangent

4 IMPLICIT DOUBLE PRECISION (A-H,O-Z)

5 DATANH = DLOG( (I.0D0+X}/(I.0D0-X))*0.50D0

6 RETURN 7 END

IC--===

2 SUBROUTINE DATUMS (OK)

)C ..... Datum Shift main Routine

4 IMPLICIT DOUBLE PRECISION {A-H,O-Z) 5 INCLUDE 'DTCOMMON.FOR'

46 CHARACTER DTMFIL*80,STRHLP*80

47C ..... mdim=nmax*3

48C ..... For Cernlib call : kdim=7*ndim+mdim*ndim+mdim

49 PARAMETER (NMAX=350,MDIMllOSO,NDIM=9,KDIM=IO563,NMIN=IO, 50 & DTMFIL='PTI.BIN' )

51C INTEGER IPVOT (NDIM)

52 REAL*8 CFDTM(MAXELL),CLDTM(MAXELL),HDTM(MAXELL),DIST(NMAX),

53 & NUMP(NMAX),CFOLD(NMAX),CLOLD(NMAX},HOLD(NMAX),COLD(3},CNEW(3),

54 & XOLD(NMAX),YOLD(NMAX),ZOLD(NMAX),CFNEW(NMAX),CLNEW(NMAX),

55 & HNEW(NMAX),XNEW(NMAX},YNEW(NMAX},ZNEW(NMAX),TH(3),A(MDIM,NDIM)

56 & B(MDIM,I),X(NDIM,I),WORK(KDIM) 57 LOGICAL OK,GOLOOP,OLDOK,NEWOK,INOUT,FOUND 5 8 C . . . . . 59 INQUIRE (FILE=DTMFIL,EXIST-FOUND)

60 IF (.NOT.FOUND) THEN

61 CALL ERRMSG(40,ICODE) 62 OK-.FALSE.

63 RETURN

64 ELSE

65 OKm.TRUE.

66 ENDIF

67 SUMDX ~ 0.D0

68 SDXSQ - 0.D0

69 SUMDY ~ 0.D0

70 SDYSQ - 0.D0 71 SUMDZ - 0.D0

72 SDZSQ - 0.D0

73 IF (NPOLY.EQ.I) THEN

74 CFMAP - CFPOLY(1)

75 CLMAP m CLPOLY(1)

76 ELSE 77 CALL POLY (NPOLY,CLPOLY,CFPOLY,CLMAP,CFMAP,TWOPI) 78 ENDIF

79C ..... It reads Control Point Data file

80 I - I

81 OPEN (UNIT~LOGPNT,FILEmDTMFIL,FORM-'UNFORMATTED' ,STATUS='OLD' }

82 l READ (LOGPNT,END-2) [|UMP(I}, (CFDTM(INDASD(K}),CLDTM(INDASD(K) ),

83 & HDTM(INDASD(K)),K=I,MAXDTM)

84 OLDOK - CFDTM(INDDTM).NE.0.D0.AND.CLDTM(INDDTM).NE.0.D0 85 IF (OLDOK) THEN

86 CFOLD(I} - DMSD60 (CFDTM(INDDTM) } * DTOR 87 CLOLD(I] - DMSD60 (CLDTM(INDDTM)) * DTOR

88 HOLD(I} - HDTM (INDDTM)

89 ENDIF 90 NEWOK m CFDTM(NEWDTM).NE.0.D0.AND.CLDTM(NEWDTM).NE.0.D0

91 IF (NEWOK) THEN

92 CFNEW(I} - DMSD60 (CFDTM(NEWDTM) } " DTOR

93 CLNEW(I) - DMSD60 (CLDTM(NEWDTM}) * DTOR 94 HNEW (I) - HDTM (NEWDTM)

95 ENDIF 96 IF {OLDOK.AND.NEWOK) I - I + 1

97 GOTO 1 98 2 CLOSE (LOGPNT)

99 M - I - 1 100 DO I0 K w l,M

i01 DIST(K) - (CFMAP-CFOLD(K))**2 + (CLMAP-CLOLD{K))**2

1 0 2 10 CONTINUE i03C ..... It sorts Control Points (cfold,cfnew} by increasing distance

104 II - M - 1

105 DO 20 INDI-I,II 106 I2 - INDI+I 107 DO 20 IND2-I2,M

Datum shift and conversion o f geographical coordinates

1 0 5

1 0 9 1 1 0

1 1 1 1 1 2

1 1 3 1 1 4 1 1 5 1 1 6 1 1 7 l i b

IF (DIST(INDI).GE.DIST(IND2)) THEN

CALL SWAP(DIST,INDI,IND2)

CALL SWAP(CFOLD,INDI,IND2 CALL SWAP(CLOLD,INDI,IND2 CALL SWAP(CFNEW,INDI,IND2

CALL SWAP(CLNEW,INOI,IND2 CALL SWAP(HOLD ,INDI,IND2 CALL SWAP(HNEW tINDI,IND2

CALL SWAP(NUMP ,INDI,IND2

ENDIF 20 CONTINUE

I19C ..... Select the n points that lie within work area 120C ..... If n.lt.nmin then select nmin points closer to mid-map

1 2 1 N C O U N T m 0 122 IF (NPOLY.GT.I) THEN

123 DO 25 I-I,M 124 25 IF (INOUT(CLOLD(I),CFOLD(I))) NCOUNT = NCOUNT + I

125 ENDIF 126 IF (NCOUNT.LT.NMIN) THEN

127 M m NMIN

128 ELSE 1 2 9 NCOUNT m 1

130 DO 26 I - I , M 131 IF (INOUT(CLOLD(I),CFOLD(1))) THEN 132 CFOLD(NCOUNT) m CFOLD(I) 133 CLOLD(NCOUNT) m CLOLD(I) 1 3 4 HOLD(NCOUNT) m H O L D ( I ) 135 CFNEW(NCOUNT) m C F N E W ( I ) 136 C L N E W ( N C O U N T ) - C L N E W ( I ) 1 3 7 H N E W ( N C O U N T ) m H N E W ( I ) 1 3 8 NUMP(NCOUNT) m NUMP(I) 139 NCOUNT n NCOUNT + l 1 4 0 ENDIF 141 26 CONTINUE 142 M m NCOUNT - l 143 ENDIF

144C ..... It computes the geocentric coordinates and mean shifts dX, dY, dZ 145 DO 30 Inl,M 146 SEQ m S E Q O N ( I )

1 4 7 Z C 2 a E C 2 O N ( 1 ) 148 CALL OEOXYZ(CFOLD(1),CLOLD(1),HOLD(I),XOLD(I),YOLD(1),ZOLD(I)) 1 4 9 S E Q - S E O O N ( 2 ) 150 E C 2 m EC2ON(2)

151 CALL OEOXYZ(CFNEW(I),CLNEW(I),HNEW(I),XNEW(I),YNEW(I),ZNEW(I)) 152 DX m XNEW(I) - XOLD(I)

153 DY - YNEW(I) - YOLD(I) 154 DZ m ZNEW(I) - ZOLD(I) 155 SUMDX m SUMDX + DX 156 SDXSQ m SDXSQ + DX*DX 157 SUMDY m SUMDY + DY 158 SDYSQ m SDYSQ + DY*D¥ 1 5 9 SUMDZ m SUMDZ + DZ 160 SDZSQ m SDZSQ + DE*DE 161 30 CONTINUE 162 AM m DBLE(FLOAT(M) ) 163 AMI m DBLE(FLOAT(M*(M-I))) 164 DXM m SUMDX/AM 165 DSDX m DSQRT((AM*SDXSQ - SUMDX*SUMDX)/AMI) 166 DYM m SUMDY/AM 167 DSD¥ m DSQRT((AM*SDYSQ - SUMDY*SUMDY)/AMI) 168 DZM m SUMDZ/AM

169 DSDZ - DSQRT((AM*SDZSQ - SUMDZ*SUMDZ)/AMI) 1 7 0 CALL PUTSHF (M,DXM,DYM,DZM,DSDX,DSDY,DSDZ) 1 7 1 C . . . . . L e a s t S q u a r e s C o m p u t a t i o n o f r o t o t r a n s l a t i o n p a r a m e t e r s 1 7 2 1 0 0 C O N T I N U E 1 7 3 AM - D B L E ( F L O A T ( H ) ) 1 7 4 AM1 - D B L E ( F L O A T ( M * ( H - I ) ) ) 175 SUMDST - 0 . 0 D 0 176 SDSTSQ - 0 . 0 D 0 1 7 7 I C O N T m 0

1 7 8 DO 4 0 I - 1 , 3 179 T H ( I ) - 0 . 0 D 0 180 TM(I) m 0 . 0 D 0 181 S M ( I ) - 1 . 0 D 0

1 8 2 4 0 C O N T I N U E 183 M3 - 3*M

473

474 M. LIGI and G. B O R T O L t . : Z Z I

189

190 191

192

193

194 195

196

197

198

199

200

201

202

203 204

205

206 207

208

209

210

211

212

213

214

215 216

217

218

219

220

221

222 223

224

225 226 227

228 229

230

231

232

233

234

235 236 237

238 239

240 241

242 243

244

245

246

184 OK - .TRUE.

185 SUMTNH = 0.0D0

186 200 GOLOOP - .FALSE.

I$7C ..... Coefficient Matri 188 STHI = DSIN(TH(I

CTH1 = DCOS(TH(I

STH2 - DSIN(TH(2 CTH2 = DCOS(TH(2

STH3 - DSIN(TH(3

CTH3 - DCOS(TH(3

II = 0

DO 50 I=I,M3,3

II = II + 1

DX = XOLD(II) - TM(1)

DY = YOLD(II) - TM(2) DZ = ZOLD(II) - TM(3)

A I,l = 0.D0

A 1,2 = -STH2*(CTH3"SM(1)*DX+STH3*SM(2)*DY)-CTH2"SMI3)*DZ A 1,3 - CTH2*(CTH3*SM(2)*DY-STH3*SM(1)*DX)

A 1,4 = -CTH2*CTH3*SM(1)

A 1,5 = -CTH2*STH3*SM(2)

A 1,6 = STH2*SM(3)

A 1,7 = CTH2~CTH3"DX

A 1,8 - CTH2*STH31DY A 1,9 - -STH2*DZ

B(I,I = -(CTH2*CTH3*SM(1)*DX+CTH2~STH3*SM(2)*D~-STH2*SM(3)*DZ & - XNEW(II))

A(I+l,l) - (CTHI~STH2*CTH3+STHI*STH3)*SM(1)*DX ÷

(CTHI*STH2*STH3-STHI*CTH3)*SM(2)*DY+CTHI*CTH2*SM(3)*DZ

A(I+I,2)=STHI*(CTH2*(CTH3*SM(1)*DX+STH3*SM(2)*DY)-STH2*SM(3)*DZ) A(I+I,3) - (-STHIeSTH2*STH3-CTHItCTH3)*SM(1)*DX ÷

(STHI*STH2*CTH3-CTHIeSTH3)*SM(2)*D¥

A(I+I,4) - (CTHI*STH3-STHIeSTH2*CTH3)*SM(1)

A(I+I,5) - -(STHIeSTH2*STH3+CTHI*CTH3)eSM(2)

A(I+I,6) - -STHI*CTH2*SM(3)

A(I+l,7) = (STHI*STH2*CTH3-CTHI*STH3)*DX

A(I+I,8) = (STHI*STH2*STH3+CTHIeCTH3)*DY

A(I+I,9) = STHIeCTH2eDZ

B(I+I,I)- -((STHI*STH2*CTH3-CTHI*STH3)*SM(1)*DX+(STHI'STH2*STH3

& +CTHI*CTH3)*SM(2)*DY + STHI*CTH2*SM(3)*DZ - YNEW(II))

A(I+2,1) - (-STHI*STH2*CTH3+CTHI*STH3)*SM(1)'DX-(STHI*STH2*STH3

& +CTHI~CTH3)*SM(2)*D¥ - STHI*CTH2*SM(3)*DZ A(I+2,2) m CTHI*CTH2*CTH3*SM(1)'DX+CTHI*CTH2*STH3*SM(2)*DY-

& CTHI*STH2*SM(3}*DZ

A(I+2,3)-(STHI*CTH3-CTHI*STH2*STH3)*SM(1)*DX+(CTHI*STH2"CTH3

& +STHI*STH3)*SM(2)*DY

A(I+2,4) - -(CTHI*STH2*CTH3+STHI*STH3)tSM(1)

A(I+2,5) = (STHI*CTH3-CTHI*STH2*STH3)*SM(2)

A(I+2,6) - -CTHI*CTH2*SM(3)

A(I+2,7) - (CTHI*STH2*CTH3+STHI*STH3)*DX

A(I+2,8) - (CTHI*STH2*STH3-STHI*CTH3)'D¥ A(I+2,9) = CTHI*CTH2*DZ

B(I+2,1}--((CTHI*STH2*CTH3+STHI*STH3)*SM(1)*DX+(CTHI*STH2*STH3 & -STHI*CTH3)*SM(2)'DY + CTHI*CTH2*SM(3)*DZ - ZNEW(II))

50 CONTINUE

SUMTN = 0.0D0

DO 60 I = I,M3

SUMTN - SUMTN + B(I,I)*B(I,I)

60 CONTINUE IF ( DABS(SUMTN-SUMTNH).GT.EPSI.AND.ICONT.LT.5 ) THEN

GOLOOP ~ .TRUE.

IERR = 0

OK = .TRUE.

247C ........ IMSL Library Routine call 248C TOL = 0.0

249C KBASIS = 0 250C CALL LLSQF(A,MDIM,M],NDIM,B,TOL,KBASIS,X,WORK,ZPVOT,IERR) 251C ........ $SP Ibm library Routine call 252C CALL DLLSQ (A,B,MDIM,NDIM,I,X,IPVOT,SNGL(EPSI),IERR,WORK) 253C ........ CERN Library Routine call 254 IF (IERR.NE.0) OK = .FALSE.

255 CALL LSQQR(A,X,B,M3,NDIM,I,MDIM,NDIM,OK,WORK) 256 IF (.NOT.OK) THEN

257 GOLOOP - .FALSE.

258 ELSE 259 ICONT = ICONT ÷ 1

Datum shift and conversion of geo~'aphical coordinates

260 DO 70 I m 1,3

261 T H ( I ) - T H ( I ) + X(l,l) 262 T M ( I ) m T M ( I ) ÷ X(l÷3,1) 263 SM(1) m S M ( I ) + X(I+6,1) 264 70 CONTINUE 265 CALL VTCSET(24,1)

266 WRITE (STRHLP,'(A,I302(A,D20.12))') 'Iteration n . ',ICONT, 267 & ' SUMTN - ',SUMTN,' SUMTNH m ',SUMTNH 268 CALL VTWRIT (STRHLP,79) 269 ENDIF 2 7 0 SUMTNH m SUMTN 271 ENDIF 272 IF (GOLOOP) GeTS 200 273 IF (.NOT.OK) GeTS 999 274C . . . . . R o t a t i o n M a t r i x 275 RM 1 , 1 = C T H 2 " C T H 3 276 RM 1 , 2 - C T H 2 * S T H 3 277 RM 1,3 w -STN2 278 RM 2,1 w STHI*STH2*CTH3 - CTHI*STH3 279 RM 2,2 ~ STHI*STH2*STH3 + CTHI*CTH3 280 RM 2,3 m STHI*CTH2 281 RM 3,I - CTHI*STH2*CTH3 + STHI*STH3 282 RM 3,2 m CTHI*STH2tSTH3 - STHI*CTH3 283 RM 3 , 3 - CTHI*CTH2 284C ..... Statistical Test of rototranslation parameters 285 CALL VTCSET (II,4) 286 CALL VTWRIT ('R Matrix: ',0) 287 DO 81 LJal,3 288 WRITE (STRHLP,'(3F21.15)') (RM(LJ,LK),LK=I,3) 289 CALL VTCSET(10+LJ,14) 2 9 0 CALL VTWRIT(STRI|LP,LENGTH(STR]|LP,255)) 2 9 1 81 CONTINUE 292 CALL VTCSET(14,4) 293 WRITE (STRHLP,'(A,3F21.15)') 'T Matrix: ',(TN(J),J-l,3) 294 CALL VTWRIT(STRHLP,LENOTH(STRHLP,255)) 295 CALL VTCSET(15,4) 296 WRITE (STRHLP,'(A,3F21.15)') 'S M a t r i x : ',(SM(J),J-l,3)

297 CALL VTWRIT(STRHLP,LENGTH(STRHLP,255))

298 CALL VTCSET ( 1 9 , 1 ) 2 9 9 C A L L V T W R I T ( ' E r r o r s t i n m o t o r s ) o f c o m p u t e d c o o r d i n a t e s c o m p a r e d 300 a t o t h e o r i g i n a l v a l u e s ' , 7 9 ) 301 SEQ - $ E Q O N ( 2 ) 302 EC2 - E C 2 O N ( 2 ) 3 0 3 CALL VTCSET(20,1)

304 CALL VTESCR ( 1 ) 3 0 5 CALL SCROLL('INITIALIZE SCROLL',20,24) 306 DO 80 I m I,M 307 C O L D ( I ) - X O L D ( I ) 308 COLD(2) - YOLD(I)

309 COLD(3) m ZOLD(I) 310 CALL GCSHFT(COLD,RM,TM,SM,CNEW) 311 CALL XYZGEO(CNEW(1),CNEW(2),CNEW(3),CF,CL,H) 3 1 2 C . . . . . . . . L o c a l s p h e r e r s y , i t c o m p u t e s a n g u l a r a n d m e t r i c d i s t a n c e s 3 1 3 RSL - BEO*DSQRT(I.D0-EC2)/(I.D0-EC2*DSIN(CF)eDSIN(CF)) 3 1 4 DBT - DSQRT ((CF-CFNEW(1))**2 + (CL-CLNEW(I))**2) * RSL

315 SUMDST - SUMDST + DST 316 SDSTS0 I SDSTSQ + DST*DST 317 WRITE (STRHLP,'(A,F5.0,A,F8.3,A)') ' Point n. ',NUMP(I),

318 & ' E r r o r m ',DST,' mr.' 319 CALL SCROLL (STRHLP,0,0) 320 80 C O N T I N U E 3 2 1 DSTMED - SUMDST/AM 322 DSDIST I DSQRT((AM*SDSTSQ - SUMDST*SUMDST)/AMI) 323 CALL VTCSET (17,4) 324 WRITE (STRHLP,'(A,F8.3,A,F8.3)') 'Mean error : ',DSTMED, 325 & ' mr. - Standard deviation : ',DSDIST 326 CALL VTWRIT(STRHLP,74) 327 CALL SCROLL('INITIALIZE SCROLL',I,24) 3 2 8 CALL VTCSET ( 1 9 , 1 ) 329 CALL VTESCR(1) 330999 RETURN 3 3 1 END

I t - n - - -

2 SUBROUTINE SWAP (VECT,INDI,IND2) 3 REAL*8 VECT(1), TEMP 4 TEMP m VECT(INDI)

475

CAGES 15 : 4--C

0,76 M, LJGI and G. BORTOLCZZ]

5 VECT(INDI) " VECT(IND21

6 VECT(IND2) - TEMP

7 RETURN

8 END

IC=='== 2 SUBROUTINE POLY (NPOLY,X,Y,CX,CY,VALMINI

]C ..... Modified after Zarkos & Rogers (1987) - Comp.&Oeosc~ , 13,5,561.

4 IMPLICIT DOUBLE PRECISION (A-H,O-Z}

5 DIMENSION X(1),Y(1) 6 IF (VALMIN.NE.0.D0) THEN 7 DO 1 I = 1,NPOLY

8 X(I = X(I) + VALMIN 9 1 Y(I = Y(I) + VALMIN

i0 ENDIF

ii X(NPOLY+I = X(1) + VALMIN

12 Y(NPOLY+I = Y(1) + VALMIN 13 ATEMP = 0.D0

14 XTEMP = 0.D0

15 YTEMPs0,D0

16 NPT-NPOLY

17 IF (NPT.GE.3) THEN 18 DO 2 IsI,NPT

19 I i - I + l 20 IF (I.EQ.NPT) Ii=I

21 A = X ( I ) ' Y ( I I ) - X ( I I ) * Y ( I ) 22 CI-X(I)+X(II)

23 C2~Y(I)÷Y(II) 24 ATEMPmATEMP+A

25 XTEMPmXTEMP+CI*A

26 2 YTEMPmYTEMP÷C2"A 27 ENDIF

28 IF (ATEMP.NE.0.D0) THEN 29 AREA-DABS(ATEMP/2.D0)

30 CXmDABS(XTEMP/(6.D0*AREA)) - VALMIN

31 CYmDABS(YTEMP/(6.D0"AREA) ) - VALMIN

32 ELSE

33 AREAm0.D0

34 CXM0.D0 35 CYm0.D0

36 ENDIF 37 IF (VALMIN.NE.0.D0) THEN

38 DO 3 I = I,NPOLY

39 X(I) - X(I) - VALMIN

40 3 Y(I) ~ Y(I) - VALMIN

41 ENDIF

42 RETURN

43 END IC'm=''

2C After Salomon (1978) - Computers & Geosciences, 4~2,173-178'

3C=---- 4 SUBROUTINE PREPLY (X,Y,NP,ERROR)

5 IMPLICIT DOUBLE PRECISION (A-H,O-Z)

6 LOGICAL ERROR

7 REAL*8 X ( 1 ) , Y ( 1 ) 8 INCLUDE 'DTCOMMON.FOR'

49 ERROR m .FALSE.

50 CALL SORT(Y,NP)

51 IF (INTVLS.GT.0) THEN

52

53 54 55100

56 57 58 5g L

60200

61

62 63300

64 65

66 67

68

69 70

X(NP÷I)mX(1)

Y(NP+I)-Y(1) DO I00 I-I,INTVLS

SWATH(I,I)m0

DO 200 ImI,INTVL$ DO 200 JmI,NP

IF(Y(J).GE.YINTVL(I).AND.YINTVL(I÷I) .GE.¥(O+I).OR.Y(J+I)

.GE.YINTVL(I).AND.YINTVL(I+I).GE.Y(J)) CALL INCLUD(I,J)

CONTINUE DO 300 I-I,NP

IF(Y(I).NE.Y(I+I)) RSLOPE(I)m(X(I+I)-X(I))/(Y(I+I)-Y(I))

CONTINUE

CALL ORDER (X,Y,ERROR)

ELSE ERROR m .TRUE.

CALL ERRMSG (21,ICODE)

ENDIF

RETURN END

Datum shift and conversion of geographical coordinates

ICmmmmm 2 SUBROUTINE INCLUD (l,J) 3 IMPLICIT DOUBLE PRECISION (A-N,O-Z) 4 INTEGER POINTR 5 INCLUDE 'DTCOMMON.FOR'

46 SWATH(I,I)=SWATH(I,2)+I 47 POINTRaSWATH(Iol) 4 8 SWATH(I,POINTR+I)=J 4 9 RETURN 50 END 1C=-=-= 2 SUBROUTINE ORDER (X,Y,ERROR) 3 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 4 INTEGER POINTR,SEGNO,UPPER 5 REAL*8 X(1),Y(1),XINTSC(25) 6 LOGICAL VERTSGoERROR 7 INCLUDE 'DTCOMMON.FOR'

48 ERROR m .FALSE. 49 DO 200 INTVAL=I,INTVLS 50 NMBSEGmSWATH(INTVAL,I) 51 YMID=(YINTVL(INTVAL)+YINTVL(INTVAL÷I))/Z.0D0 52 DO i00 POINTR=I,NMBSEG 53 SEGNO-SWATH(INTVAL,POINTR+I) 54 VERTSGmDABS(X(SEGNO+I)-x(SEGNO) ).LT.I.D-I0 55 IF (VERTSG) THEN 56 XINTSC(POINTR)mX(SEGNO) 57 ELSE 58 XINTSC(POINTR)u X(SEGNO)+RSLOPE(SEGNO)*(YMID-Y(SEGNO) ) 59 ENDIF 60 100 CONTINUE 61 IF (NMBSEG.LT.2.OR.MOD(NMBSEGo2).NE.0) GOTO 300 62 UPPERINMBSEG-I 63 DO 200 Ill,UPPER 64 IPLSI=I+I 65 DO 200 JmIPLSI,NMBSEG 66 IF (XINTSC(I).GT.XINTSC(J)) THEN 67 TEMPmXINTSC(I) 68 XINTSC(I)mXINTSC(J) 69 XINTSC(J)mTEMP 70 ITEMPaSWATH(INTVALoI+I) 71 SWATH(INTVALoI+I)mSWATH(INTVAL,J+I) 72 SWATH(INTVAL,J+I)mITEMP 73 ENDIF 74 200 CONTINUE 75 RETURN 76 300 CALL ERRMSG (22,ICODE) 77 ERROR m .TRUE. 7 8 RETURN 79 END

2 SUBROUTINE SORT (Y,NP) 3 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 4 I N T E G E R U P P E R 5 REAL*8 Y(I) 6 INCLUDE 'DTCOMMON.FOR'

47 DO 100 Iml,NP 4 8 100 Y S O R T ( I ) m Y ( I ) 49 U P P E R m N P - 1 50 DO 200 ImI,UPPER 51 I P L S l m I + I 52 DO 200 JmIPLSI,NP 53 I F (YSORT(I).LT.YSORT(3)) THEN 54 TEMPmYSORT(I) ~5 YSORT(I)mySORT(J) 56 ¥SORT(J)mTEMP 57 ENDIF 58 200 CONTINUE 59 YINTVL(1)-YSORT(1) 60 INTVLSm0 6 1 U P P E R m N P - I 62 DO 300 ImI,UPPER 63 IF (YSORT(1).NE.YSORT(I+I)) THEN 64 INTVLSmINTVLS+I 65 YINTVL(INTVLS+I)mYSORT(I+I) 66 ENDIF 67 3 0 0 CONTINUE 68 YINTVL(INTVLS+2)m-l.D37

477

4V8 M. Lzo~ and O. BORrOLL'ZZX

69 RETURN

70 END

IC----- 2 LOGICAL FUNCTION INOUT(XP,YP) 3 IMPLICIT DOUBLE PRECISION (A-H,O-Z~ 4 INTEGER SEGNO 5 INCLUDE 'DTCOMMON.FOR'

46 INOUT=.FALSE. 47 INTVAL=0 48100 INTVAL=INTVAL+I 49 IF (YINTVL(INTVAL).GT.YP) GO TO 100 50 INTVAL=INTVAL-I 51 IF (INTVAL.GE.I.AND.INTVAL.LE.INTVLS) THEN 52 NMBSEGISWATH(INTVAL,I)+I 53 DO 400 I=2,NMBSEG 54 SEGNO=SWATH(INTVAL,I) 55 IF (XP-CLPOLY(SEGNO).LE.(YP-CFPOLY(SEGNO~) 56 & "RSLOPE(SEGNO) ~ THEN 57 INOUT=MOD(I,2) .EQ.I 58 RETURN 59 ENDIF 60400 CONTINUE 61 ENDIF 62 RETURN 63 END

IC----- 2C Loast Square Method from CERN Computing Library

3C----- 4 SUBROUTINE LSQQR (A,X,B,M,N,IP,IM, IN,ERR,WORK) 5 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 6 DIMENSION A(IM,N),X(IN,IP),B(IM,IP) ,WORK(1) 7 LOGICAL OK,ERR 8 DATA ETAE/I.0D-14/

9 OK I .TRUE. i0 ERR m .TRUE. 11 IMPI~M~N+6"N+M+I

12 IMP2-6*N+M+I 13 IMP3-6*N+I 14 IMP4-4*N+I 15 JO-IMP3-1 16 JOI-2~N 17 CALL PROCI (A,WORK(IMP2),M,N,IM) 18 CALL DECOMP(M,N,WORK(IMP2),WORK(1),WORK(IMPI),OK,WORK(5*N+I) 19 i WORK(]*N+I) ) 20 IF(.NOT.OK) THEN

21 CALL ERRMSG (23,1CODE)

22 RETURN 23 ENDIF 24 ETA-ETAE**2 25 DO 55 KzI,IP 26 DO I0 I=I,M 27 JU=JO+I 28 i0 WORK(JU)-B(I,K) 29 CALL SLV (M,N,WORK(IMP2) ,WORK(1),WORK(IMPI) ~WORK(IMP3) , 30 i WORK(2*N+I),WORK(IMP4) ) 31 DO 15 I=I,M 32 JUmJO+I 33 15 WORK(JU)--PROD2(A,WORK(2~N+I) ,IM,I,N,I,-B(I,K) } 34 CALL SLV (M,N,WORK(IMP2),WORK(1) ,WORK(IMP1) ,WORK(IMP3), 35 I WORK(N+I),WORK(IMP4) )

36 YNORM0=0.D0 37 ENORMI=0.D0 38 DO 20 I~I,N 39 JU-JOI+I 40 YNORM0-YNORM0+WORK(JU)**2

41 JU-N+I 42 20 ENORMIsENORMI+WORK[JU)**2 43 IF(ENORMI.LE. 0.0625D0"YNORM0) GO TO 25 44 CALL ERRMSG (24,ICODE) 45 ERRs. FALSE. 46 RETURN 47 25 DO 30 I-1,N 48 JU-JOI+I 49 JUIuN+I 50 30 WORK[JU)-WORK(JU)+WORK(JUI )

51 IF(ENORMI .LT. ETA*YNORM0) GO TO 45

Datum shift and conversion of geographical coordinates

52 53 54 35 55 56 57 58 59 60 61 40 62 63 45 64 65 50 66 55 67 68

DO 35 I11,M 3UmJO+i WORK(JU)--PROD2(A,WORK(2*N÷I),IM,I,N,I,-B(ZoK))

CALL SLV (M,N,WORK(IMP2),WORK(1),WORK(IMPI),WORK(IMP3) , 1 WORK(N+1) ,WORK(IMP4))

ENORM0-ENORMI ENORMI-0.D0 DO 40 I-I,N

JU-N+I ENORMImENORMI+WORK(JU)**2

IF(ENORMI .LE. 0.0625D0*ENORM0) GO TO 25 DO 50 I=I,N

JU=JOI+I X(I,K)=WORK(JU)

CONTINUE RETURN END

2 3 4 5 6 7C 8 9 5

10 11C 12 13 14 15 16 17 18 19 20 10 21 11 22 23C 24 25 26 27 28 29 30 31 32 15 33 20 34 35 36 3'7 38 22 39 40 41 42 43 44 45 46 25 47 48 49 30 50 35 51 40 S2 53

lCmmlml SUBROUTINE DECOMP(M,NoQR,ALPHA,PIVOT,ERR,YA,SUM) IMPLICIT DOUBLE PRECISION (A-H,O-Z) DIMENSION QR(M,N),ALPHA(N),PIVOT(N),YA(N) oSUM(N) LOGICAL ERR DO 5 Jml,N *** J TH. COLUMN SUM ***

SUM(J)mPRODI(QR(Io3) oQR(I,J),I°M) PIVOT(J)mDBLE(FLOAT(3) )

DO 40 K-I,N *** K TN. HOUSEHOLDER TRANSFORMATION ***

SIGMAmSUM(K) JBARmK LmK+I IF(L.GT.N) GO TO Ii DO i0 JmL,N

IF(SIGMA .OE. SUM(J)) GO TO I0 SIGMAmSUM(J) JBARmJ

CONTINUE CONTINUE IF(JBAR .EQ. K) GO TO 20

*** COLUMN INTERCHANGE *** ImlNT(SNGL(PIVOT(K))) PIVOT(K)mPIVOT(JSAR) PIVOT(JBAR)mDBLE(FLOAT(I)) SUM(JBAR)mSUM(K) SUM(K)mSIGMA DO 15 Iml,M

SIGMAmQR(I,K) QR(I,K)mQR(I,JBAR) QR(I,JBAR)mSIGMA

CONTINUE SIGMAmPRODI(QR(1,K),QR(I,K),K,M) IF(SIGMA .NE. 0.D0) GO TO 22 ERRm. FALSE. RETURN QRKKmQR(K,K) ALPHA(K)mDSQRT(SIGMA) IF(QRKK .GE. 0.D0) ALPHA(K)m-ALPHA(K} ALPHAKmALPHA(K) BETAmI.D0/(SIGMA-QRKK*ALPHAK) QR(K,K)mQRKK-ALPHAK IF (L.GT.N) GO TO 40 DO 25 JmL,N

YA(J)oEETA*PRODI(QR(I,K),QR(I,J),K,M) DO 35 JmL,N

DO 30 I-K,M QR(I,J)mQR(I,J)-QR(I,K)*YA(J)

S U M ( J ) m S U M ( J ) - Q R ( K , J ) * * 2 CONTINUE

RETURN END

lC----- 2 SUBROUTINE SLV (M,N,QR,ALPHAoPIVOT,R,Y,Z) 3 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 4 5 6

DIMENSION QR(M,N),ALPItA(N),R(M),Y(N),PIVOT(N),Z(N) DO 10 J-I,N

GAMMAmPRODI(QR(I,J),R,J,M)/(ALPHA(J)*QR(J,J))

479

480 .~l. Lio~ and G. BORTOLUZZI

7

8 5 9 I0

10 11 12 13

14 15 15

16 17 18 20

19 20

6 7 5 8 9

I0

DO 5 I-J,M

R(I)mR(I)+GAMMA'QR(!,J) CONTINUE Z(N)-R(N)/ALPHA(N) NIT*N-I DO 15 I=I,NIT

L=N-I LA=L+I

Z(L)=-PROD2(QR,Z,M,LA,N,L,-R(L) )/ALPHA(L) DO 20 I=I,N

JU=INT(SNGL(PIVOT(I) ) ) Y(JU)=Z(I)

RETURN

END

IC----= 2 FUNCTION PRODI(A,B,M,N~ 3 IMPLICIT DOUBLE PRECISION (A-H,O-Z

4 DIMENSION A(1),B(1) 5 SUM-0.D0 6 DO 5 I=M,N 7 5 SUM=SUM+A(I)'B(I) 8 PRODI-SUM

9 RETURN 10 END IC----- 2 FUNCTION PROD2(A,B,MD,M,N,I,VAL) 3 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 4 DIMENSION A(MD,I),B(1) 5 SUM-VAL

DO 5 JmM,N

SUM~SUM+A(I,J)*B{J} PROD2-SUM RETURN END

IClmlml

2 SUBROUTINE PROCI(A,ORoM,N, IM) ] IMPLICIT DOUBLE PRECISION (A-H,O-Z) 4 DIMENSION A(IM,N) ,QR(M,N) 5 DO 5 I - I , M 6 DO 5 J-i ,N 7 5 QR(I,J)*A(I,J) 8 RETURN 9 END ICSLARGE 2C ......................................................................... C 3C DTIOLIB Double Topographic I/O LIBrary C 4C It uses ANSILIB LIBRARY C 5C .......................................................................... C

7 SUBROUTINE COOGEO (DATI,CF,CL,INPTRF) 8C ..... Geographical Coordinate Transformation Degree <-- ~ Radlans 9 IMPLICIT DOUBLE PRECISION (A-H,O-Z)

I0 REAL*8 DATI ( I ) 11 LOGICAL INPTRF 12C ..... Input-output transformation flag

13

54 55 56 57

58 59 60 61 62 63 6 4 65 66 67 68 69 70 71 72 73 74

INCLUDE 'DTCOMMON.FOR'

IF (INPTRF) THEN CF m DEGRAD (DATI(1),INDGT(1}) CL m DEGRAD (DATI(2},INDGT(1))

ELSE IF (INDCT(2).EQ.I) THEN

CFN ~ RADDEG (CF,INDGT(2)) CLN s RADDEG (CL,INDGT(2) }

ELSE IF (DATUMC) THEN

CFN a RADDEG (CF,INDGT(1} ; CLN - RADDEG (CL,INDGT{1) }

ENDIF ENDIF IF ( (INDCT(1).EQ.INDCT(2)).OR.

(DATUMC.AND.INDCT(1).EQ.1.AND.INDCT(2) .EQ.2~ ) THEN

DATI(1) ~ CFN DATI[2) ~ CLN

ELSE IF (INDCT(1).EQ.2.AND.INDCT(2).EQ.I) THEN

DATI(NUMVAR(1)+I) = CFN DATI(NUMVAR(1)+2) m CLN

ENDIF

D a t u m sh i f t a n d c o n v e r s i o n o f g e o g r a p h i c a l c o o r d i n a t e s

75 ENDIF 76 RETURN 77 END ICom--=

2 SUBROUTINE COOPR3 (DATI,CF,CL,INPTRF,KPR2) 3C ..... Projection Coordinates TransEormatlon 4 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 5 REAL*0 DATI(1) 6 LOGICAL INPTRF 7 INCLUDE 'DTCOMMON.FOR'

48 IF ( KPRJ.EQ.2.AND.INDUTM.EQ.I ) THEN 4 9 CN0 = 0 . D 0 5 0 I F ( I N P T R F ) T H E N 51 IF (DATUMC.AND.DTMACC} UTMZ = DATI(4) 52 IF (.NOT.DATUMC.OR..NOT.DTMACC) UTMZ = DATI(3) 53 ELSE 54 UTMZ m Fuse (~LaRTOD) 55 IF (CF.LT.0.D0) UTMZ = -UTMZ 56 IF (INDCT(I}.EQ.2) THEN 57 IF (DATUMC.AND.DTMACC) DATI(4) m UTMZ 58 IF (.NOT.DATUMC.OR..NOT.DTMACC) DATI(3) = UTMZ 59 ELSE 60 DATI(NUMVAR(1)+3) = UTMZ 61 ENDIF 62 ENDIF 63 IF (UTMZ.LT.0.D0) CN0 m 10000000.0D0

64 CL0 m CMER (DABS(UTMZ)) * DTOR 65 ENDIF 66 IF (INPTRF) THEN 67 CN m D A T I ( 1 } 68 CE m DATI(2) 69 S E Q m S E Q O N ( 1 )

7 0 EC2 - E C 2 O N ( 1 ) 71 CALL PRJPAR (KPRJ} 72 CALL PRJGEO (KPRJ,CN,CE,CF,CL) 73 ELSE 74 IF (INDCT(2).EQ.2.OR.DATUMC) THEN 75 SEQ m SEQON(2) 76 EC2 = E C 2 O N ( 2 ) 77 CALL P R J P A R ( K P R J )

78 CALL GEOPR3 (KPRJ,CF,CL,CN,CE) 79 ENDIF

80 IF ( (INDCT(1).EQ.INDCT(2)).OR.

81 & (DATUMC.AND.INDCT(1).EQ.2.AND.INDCT(2).EQ.I}) THEN 82 DATI(1) - CN 8 3 D A T I ( 2 ) m CE

84 ELSE IF (INDCT(I}.EQ.I.AND.INDCT(2).EQ.2) THEN 85 DATI(NUMVAR(1)+I) m CN 86 DATI(NUMVAR(1)+2) m CE 87 ENDIF 88 ENDIF 89 R E T U R N 9 0 END

1 C - m - m - 2 3 4

5 6 7

48 66 67 68 69 70 '71 "/2 73 74 '75 '76 '7"7 '78 79 80 81

SUBROUTINE DATGST(IR,IC,KPRJ,NFL,STRV,KR,KC,DATSTR,FLAG,VARCAR,

& HALT,ABORT) CHARACTER DATSTR*(*),STRV(KR,KC}*(*),INPF(255)*I,STRHLP*80,STR*80 INTEGER NUMDEC(10) LOGICAL GOODK,ENDKEY,HLP,FLAG,HALT,ABORT,VARCAR(1),LOGTMP INCLUDE 'DTCOMMON.FOR' INCLUDE 'ANSICOMM.FOR' DATA STR / ' (?) Key HELP. Use Arrows to Move C u r s o r . Press ENTER

&to Select, ESC to Abort ' / 10 ABORT m .FALSE.

JPOS m 1

MUL66H - I MUL66 m 1 MAXLEN(1) " LENGTH(DATSTR,255) + 10 IF (MAXLEN(1).GT.255) MAXLEN(1) - 255 IF (FLAG} THEN

CALL VTATTR CALL VTCSET CALL VTEARE CALL VTCSET CALL VTWRIT CALL VTATTR CALL VTCSET

0 , 0 , 0 , 0 , 0 , 0 ) I R + I O , I C + 2 ) 1 R + 1 5 , I C + 3 7 ) I R + 9 , I C + 2 ) ' V a r i a b l e s 1 , 0 , 1 , 0 , 0 , 0 ) 2 4 , 1 )

S t a r t C o l End C o 1 ' 0 3 5 )

481

482 M. LIGl and (5, BORTOLUZZ.'-

82 CALL VTWRIT(STR,791 83 ENDIF 84 DO I00 I=I,NUMVAR(NFL} 85 VPOS(NFL,I) = I 86 IF (.NOT.FLAG} THEN 87 WRITE{STRHLP, ' (80Al)') (WINDOW(WNUM,IR÷9+I,J),J=IC+20,IC+351 88 READ(STRHLP, ' (IS,6X,I5)',ERR=11) POSCOL(I,I~ ~POSCOL(I,2) 89 GOTO 12 90 ii CALL ERRMSG(15,ICODE) 91 HALT = .TRUE. 92 RETURN 93 12 CONTZNUE

94 ELSE 95 CALL VTATTR(I,I,I,0,0,0) 96 CALL VTCSET(IR+9+I,IC+2) 97 IF (I.EQ.3.AND.I.EQ.NUMVAR(NFL).AND.INDCT(NFL~.EQ.I.AND. 98 ~ KPRJ.EQ.2.AND.INDUTM.EQ.I] THEN 99 CALL VTWRIT(STRV(4,INDCT(NFL)),I3)

100 ELSE 101 CALL VTWRIT(STRV(I,INDCT(NFL)),13~ 102 ENDIF 103 DO 20 J=l,2 I04 ENDKEY = .FALSE. 105 POSCOL(I,J) = 3POS 106 CALL NUMCOL (I,IR+9+I,IC+20,J) I07C .............. Read Variable Position

108 109 110 111 112 113 114 1 1 5 I 1 6 117 118 119 120 121 122 123 124 125 126 127 125 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 1 4 5 146 147 148 1 4 9 150 1 5 l 152 153 154 155 156 15'7 158

15 GOODK m .FALSE. CALL VTCSET(IR+I9,1C+8+MOD{ (JPOS-I),66

CALL VTGETC[ICODE} IF (ICODE.EQ.-75) THEN

POSCOL(I,3) - POSCOL(I,J) - I IF (POSCOL(I,J).GE.I) THEN

GOODK m .TRUE. ELSE

POSCOL(I,J) m 1 ENDIF

ELSE IF (ICODE.EQ.-77) THEN POSCOL(I,J) m POSCOL(I,J) + i

IF (POSCOL(I,J).LE.MAXLEN(1)) THEN

GOODK = .TRUE.

ELSE POSCOL(I,J) R MAXLEN(1)

ENDIF ELSE IF (ICODE.EQ.63) THEN

CALL VTATTR(0,0,0,0,0,0) CALL HLPSUB (RECHLP(13),I,WNUM,I,IC~24,1C÷76,11LPI

CALL DRWREC(IR,IC,DATSTR,MUL66} CALL VTCSET(24,1) CALL VTATTR(I,O,I,O,O,O CALL VTWRIT(STR,79~ CALL VTATTR[I,I,I,O,O,O CALL VTCSET(IR+9+I,IC+2 CALL VTWRIT(STRV(I,INDCT(NFL}),I3) CALL NUMCOL (I,IR+9+I,IC+20,J}

ELSE IF (ICODE.EQ.13) THEN ENDKEY = .TRUE.

ELSE IF (ICODE.EQ.27) THEN ABORT m .TRUE. IF (I.EQ.I) THEN

CALL VTATTR(0,0,0,0.0,0) RETURN

ELSE GOTO i0

ENDIF ENDIF IF (GOODK) THEN

JPOS - POSCOL(I,J) MUL66 - INT((JPOS-I)/66) + 1 IF (MUL66.NE.MUL66H) THEN

CALL DRWREC(IR,IC,DATSTR,MUL66) CALL VTATTR(I,I,1,0,0,0) MUL66H = MUL66

ENDIF CALL NUMCOL (I,IR+9+I,IC+20,J) CALL VTCSET(IR+Ig,IC+8÷MOD((JPOS-I},66})

ELSE CALL VTBELL(1)

D a t u m shift and conversion of geographical coordinates 483

159 ENDIF

160 IF (.NOT.ENDKE¥) GOTO 15 161 20 CONTINUE 162 ENDIF 163 IF (POSCOL(I,I).GT.POSCOL(I,2)) THEN 164 ITENP - POSCOL(I°I) 165 POSCOL(I,I) - POSCOL(I°2) 166 POSCOL(I°2) m ITEMP 167 ENDIF 168 IF (FLAG) THEN 169 CALL VTATTR(0,0,0,0,0,0) 170 CALL VTCSET(IR+9+I,IC÷2) 1 7 1 CALL VTWRIT(STRV(I,INDCT(NFL)),I3) 172 CALL NUMCOL (I,IR+9+I°IC+20,0) 173 ENDIF 174 IF (I.GT.I) THEN 175 DO 30 J-l,I-1 176 DO 30 R - 1 0 2 177 I F (POSCOL(I,K).GE.POSCOL(Jol).AND. 1 7 8 & POSCOL(I,K).LE.POSCOL(J°2)) THEN 179 CALL ERRMSG(16,ICODE) IB0 IF (.NOT~FLAG) THEN 1 8 1 HALT • .TRUE. 182 RETURN 1 8 3 ELSE 1 8 4 GOTO 10 185 ENDIF 186 ENDIF 187 30 CONTINUE 1 8 8 E N D I F 1 8 9 1 0 0 C O N T I N U E 1 9 0 DO 3 0 0 I - I , N U M V A R ( N F L ) - 1 1 9 1 DO 3 0 0 JmI+I,NUMVAR(NFL) 1 9 2 IF (POSCOL(I,I).GE.POSCOL(J,I)) THEN 1 9 3 DO 2 0 0 K m l , 2 1 9 4 I T E N P m P O S C O L f I , K ) 1 9 5 POSCOL(I,K) m POSCOL(J,K) 196 2 0 0 P O S C O L ( J , K ) m ITEMP 1 9 7 IT~MP m VPOS(NFL,I) 298 VPOS(NFL,I)mVPOS(NFL,J) 199 VPOS(NFL,J) m ITEMP 2 0 0 LOGTMP m VARCAR(I) 201 VAHCAR(I) m VARCAR(J) 202 VARCAR(J) m LOGTMP 2 0 3 ENDIF 2 0 4 3 0 0 C O N T I N U E 205 READ (DATSTR,'(255AI) e ) INPF

206 DO 310 ImI,NUMVAR(NFL) 207 NUMDEC(I)-0 208 DO 310 JmPOSCOL(I,I),POSCOL(I,2) 209 IF (INPF(J).EQ.'.') NUMDEC(1):POSCOL(I,2)-J 210 310 CONTINUE 211 J - 1 212 I N P F ( I ) - ' ( ' 2 1 3 IFIELD - POSCOL(I,I) - 1 2 1 4 IF (IFIELD.NE.0) THEN 215 WRITE(FORMAT(NFL),°(13,AI) , ) IFIELD°'Xo ° 216 READ(FORMAT(NFL),'(5AI)' ) (INPF(K),K=J+I,J+5)

217 J m J + 5 2 1 8 ENDIF 219 DO 400 I-I,NUMVAR(NFL) 220 IFIELDmPOSCOL(I°2) - POSCOL(I°I) + 1 221 222 223 224 22.5 226 227 & 228 229 230 231 232 233 234 235

I F ( I . E Q . I ) THEN IF ( V A R C A R ( I ) ) THEN

W R I T E ( F O R M A T ( N F L ) e INC - 4 ELSE

WRITE(FORMAT(NFL),

INC - 8 ENDIF

ELSE IF (VARCAR(I)) THEN

WRITE(FORMAT(NFL), INC m 5

ELSE

WRITE(FORMAT(NFL),

f ( A $ , I 3 ) ' ) ' A ' , I F I E L D

' ( A I , I 3 , A I , I 3 ) ' ) ' F ' ° I F I E L D , ' . ° , N U H D E C ( I )

' ( A 2 , I 3 ) ' ) ' , A ' o l F I E L D

' ( A 2 , I 3 , A I , I 3 ) ' ) ° , F ° , I F I E L D , ' . ' , N U ~ D E C ( I )

48-~

236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268

M LIGI a n d G . BORTULUZZI

3 4

5 6

7

8

9 10

11 12

13

14

15 16

4

5 6

7

8

9

I0 Ii 12

13

INC - 9

ENDIF ENDIF

READ(FORMAT(NFL) , ' (9AI) ' ) [INPF(K),K=J+I,J+INC~

J = J + INC

IF (I .NE.NUMVAR(NFL) I THEN

IFIELD=POSCOL( I+l, I)-POSCOL(I, 2 J 1

IF (IFIELD.NE.0) THEN

WRITE(FORMAT(NFL),' (AI,13 AI)' ~ ' ,IFIELD° °× ~

READ(FORMAT(NFL),' (SAI)' ) (INPF(K),K=J+I,J+5) J = J + 5

ENDIF

ENDIF

400 CONTINUE IFIELD = MAXLEN(I) ROSCOL(NUMVAR NFL),2)

IF (IFIELD.NE.0) THEN

WRITE(FORMAT(NFL),'(AI,I3,AII' ) ',',IFIELD,'X' READ(FORMAT{NFL), ' (5AI) ° ) (INPF K),KmJ+I,J+5! J m J + 5

ENDIF

NF = 0

DO 500 I=l,J

IF (INPF(I) .NE. ' ' ) THEN

NF = NF + I

INPF(NF) = INPF(I 1 ENDIF

500 CONTINUE WRITE (FORMAT(NFL), ' (80AI~') (INPF I),I=I,NF), " )

CALL VTCSET(IR+I7,IC+2 ) CALL VTWRIT( 'Format : '//FORMAT(NFL) , 74

R E T U R N END

1 C , , - - ' - 2 SUBROUTINE DRWREC ( IR, IC, DATSTR, MUL66 )

CHARACTER DATSTR*(*), STRHLPt66, CHR(264)*I, CHRI'I INDI - (MUL66-1)*66+I

IND2 I MUL66*66 READ(DATSTR, ' (255AI) ' ) (CHR(J) ,J-1,255)

WRITE (STRHLP, ' (66AI)') (CHR(J),J=INDI,IND2)

CALL VTATTR(O,O,O,O,O,O)

CALL VTCSET (IR+19,IC+2)

CALL VTWRIT ('Data: ,6)

CALL VTATTR(I,0,0,0,0,0)

CALL VTCSET(IR÷Ig, IC+8 )

CALL VTWRIT(STRHLP,66)

CALL VTATTR(0,0,0,0,0,0 )

RETURN END

I C - - , , , - -

2 SUBROUTINE GETFMT (STRING,FMT)

] CHARACTER*(*) STRING, FMT

LENI - LEN(STRING)

LEN2 - LENGTH(STRING,LENI)

KFP ,, INDEX(STRING, ' . ' )

IF (KFP.EQ.0) THEN STRING - STRING(I:LEN2)//'. '

KFP - LENI

ENDIF WRITE(FMT, ' (A,I2,A,I2,A) ' I ' (F' ,LENI, ' . " ,LENI-KFP, ' 1

R E T U R N END

1 C , , , , , , , , - 2 3

4

5 6 7

8

9

10 11

12

53 71

72

SUBROUTINE GETIO (MAXPRJ,PRGSTR,FLAG,HALT,ABORT,HPRJ

IMPLICIT DOUBLE PRECISION (A-H,O-Z)

PARAMETER (INIROW - 3, INICOL -2) CHARACTER PRGSTR*(* ),DATSTR*255,STRING(3) °60,STRHLPbS0.FKSTR(3)*I0

& ,S*20,FNAME(2)*2e,STFILE(2)*7,CTSTR(3)*IS.GTSTR(7)*18,

& MAPTXT(2)*I3,STRV(4,2)*13

REAL*8 REALNB(2) INTEGER LL(4),SC(4),EC{4i,CC,SL,EL,STEPL(7),STEPC~7}~LENTXT(2)

INTEGER'2 IFM(6,2) LOGICAL FLAG,HLP,AGAIN,HALT,ERROR,ABORT,LEFT,VARCARIS~

INCLUDE 'DTCOMMON.FOR'

INCLUDE 'ANSICOMM.FOR' DATA STEPL,STEPC,LENTXT / 740, 7"i, 2413 /

DATA LL,SC,EC,CC,SL,EL / 5,19,12o14,2"2,2'40,4"78,40,3,19 /

Datum shift and conversion o f geographical coordinates 485

73 DATA IFM,VARCAR / 3,5,7,7,3,9,6*3, 5*.FALSE. / 74 DATA FKSTR,STFILE /' FILE',' KEYBOARD',' HELP','OLD','UNKNOWN' / 75 DATA STRING,FNAME,MAPTXT / 'Geographical WORK AREA Boundaries', 76 & 'I N P U T Options','O U T P U T Options',4*' ' / 77 DATA CTSTR / 'GEOGRAPHICAL','PROJECTION','HELP, /

78 DATA GTSTR / 'DegMinSec. XXX','DegMin.XXX','Deg.XXX','C_Deg.XXX', 79 & 'HourMinSec.XX','Radians.XXX','HELP' / 00 DATA STRV /'LATITUDE','LONGITUDE*,'HEIGHT',' ','NORTHING', 81 & 'EASTING','HEIGTH','UTM ZONE' / 82 ABORT m .FALSE. 83 CALL VTESCR(0) 8 4 CALL OPENW(3,.TRUE.) 85 LENSTR - 2*LENGTH(PRGSTR,255) 86 CALL VTCSET(INIROW-I,(80-LENSTR)/2÷I) 87 CALL VTDOSP (PRGSTR,LENSTR) 88 IF (DATUMC.AND.DTMACC) THEN 89 NINTL m 4 90 ELSE 91 NINTL - 2 92 ENDIF 93 CALL VTCSET(INIROW,INICOL) 9 4 CALL VTGRID(INIROW+20,INICOL+76,NINTL,LL,SC,EC,I,CC,SL,EL) 95 IF (DATUMC.AND.DTMACC} THEN 96 CALL VTCSET(INIROW+I0,INICOL+41) 97 CALL VTWRIT(STRING(1),33) 98 ENDIF 99 DO 1 1 - 1 , 2

I00 CALL VTCSET(INIROW+I,9+(I-1)*40) 1 0 1 1 CALL VTWRIT(STRING(I+I),20) 102 IF (.NOT.FLAG) THEN 103 DO 2 I - 1 , 2 3 104 2 READ(ILOG,'(80AI)',END-9) (WINDOW(3,I,J),3-INICOL,80) 105 GOTO 8 106 9 HALT - .TRUE. 107 CALL ERRMSG(34,ICODE) 108 RETURN 109 8 CALL RESTOW(3,1NIROW÷4,INICOL+IoINIROW÷Ig,INICOL+75,.TRUE. ) I 1 0 CALL WAIT ( 1 . 0 ) 111 ENDIF 112 1 0 HALT - .FALSE. 113 IF (.NOT.FLAG) THEN 1 1 4 INDFK - 0

115 WRITE (STRHLP,'(80AI)') (WINDOW(3,1,3),3-68,77) 116 DO 11 1 - 1 , 2 117 II IF (STRHLP.EQ.FKSTR(1)) INDFK m I 118 IF (INDFK.EQ.0} THEN 119 CALL ERRMSO (I,ICODE) 120 HALT - .TRUE. 121 R E T U R N 122 ENDIF 123 ELSE 124 CALL VTMENU (3,I,FKSTR,I,STEPL,68,STEPC,INDFK,ABORT,0,0,0,0,0. } 1 2 5 ENDIF 126 IF (ABORT) RETURN 127 IF (INDFK.EQ.3) THEN 128C ........ Help Request 129 CALL HLPSUB (RECHLP(9),I,3,1,INICOL,23,1NICOL÷76,HLP) 130 GOTO 10 131 ELSE IF (INDFK.EQ.1.OR.INDFK.E0.2) THEN 132C . . . . . . . . I n p u t f r o m D a t a F i l e o r K e y b o a r d I l l 133 134 135 136 137 138 139 140 141 142 143 144 145 146 14'7 148 149

20

&

DO 200 K - 1 , 2 J 3 " - I N I C O L + ( K - 1 ) * 3 8 I F ( I N D F K . N E . 2 . O R . K . N E . I ) THEN

IF (.NOT.FLAG) THEN WRITE (FNAME(K),'(80AI)')

(WINDOW(3,1NIROW+4,J),JmJJ+B,JJ+35) ELSE

INDX - I CALL VTCSET(INIROW+4,JJ+2) CALL VTWRIT('FIIe: ',6) IF (FNAME(K).EQ.' ' ) WRITE(FNAME(K),' (A,II,A)')

'FOR00',K,'.DAT' CALL VTMENR(INDX,28,1,I,INIROW+4,STEPL,JJ+8,STEPC,

FNAME(K),HLP,ABORT) ENDIF IF (ABORT) GOTO I0 IF (HLP) THEN

486 M. LIG! and G. BORrOLLZZl

150

151 152 153 154 155 156 157 158

159 160 161 162 163 164

165 166 167 168

169 170

171

CALL NLPSUB (RECHLP(10~,I,3,I,INICOL,23,INICOL+76,HLP} GOTO 20

ENDIF

OPEN|IOFILE(K),FILE=FNAME(K) ,IOSTAT=IO$,STATUS=STFILE{K) ) IF (K.EQ.I.AND.IOS.NE.0] THEN

IF (.NOT.FLAG) THEN

CALL ERRMSG(II,ICODE) HALT i .TRUE. RETURN

ELSE CALL ERRMSG(12,ICODE) GOTO 20

ENDIF ELSE IF (K.EQ.I) THEN

READ (IOFILE(1),' (A255)') DATSTR

CALL DRWREC(INIROW,INICOL,DATSTR,I~ REWIND (IOFILE(1))

ENDIF

ELSE IF (INDFK.EQ.2.AND.K.EQ.Ii THEN CALL VTCSET(INIROW~4,INICOL+2) CALL VTEARE(INIROW+5,INICOL+37)

ENDIF 172C ........... Request Coordinate types 173 30 IF (.NOT.FLAG) THEN 174 INDCT(K) w 0 175 WRITE (STRHLP, ' (80AI] ' ) 176 • (WINDOW(3,INIROW+6,J),J~JJ+20,JJ+37i 177 DO 31 Iml,2 178 31 IF (STRHLP.EQ.CTSTR{I)) INDCT(K) - 1 179 IF (INDCT(K).EQ.0) THEN 180 CALL ERRMSG (13,ICODE}

181 HALT - .TRUE. 182 RETURN 183 ENDIF

184 ELSE 185 CALL VTCSET(INIROW+6,JJ+2}

186 CALL VTWRIT('Coordinate Types:',0) 187 CALL VTMENU (3,I,CTSTR,INIROW+6,STEPL,JJ+20,STEPC,

188 ~ INDCT(K),ABORT,0,0,0,0,0. ) 189 ENDIF 190 IF (ABORT.AND.INDFK.EQ.I) GOTO 20 191 IF (ABORT.AND.INDFK.EQ.2) GOTO 10 192 IF (INDCT(K).EQ.3) THEN 193 CALL NLPSUB (RECHLP(II),I,3,I,INICOL,23,INICOL+76,HLP) 194 GOTO 30 195 ELSE IF (INDCT(K).EQ.I} THEN 196C .............. Request geographical types

197 40 IF (.NOT.FLAG) THEN 19B INDGT(K) - 0

199 WRITE (STRHLP,' {80AI) ' ) 200 ~ (WINDOW(3,INIROW+7,J) ,J-JJ+20,JJ+37)

201 DO 41 I-1,6 202 41 IF (STRHLP.EQ.GTSTR(I)) INDGT(K) ~ I 203 IF (INDGT(K).EQ.0) THEN 204 CALL ERRMSG (14,ICODE) 205 HALT m .TRUE. 206 RETURN 207 ENDIF 208 ELSE 209 CALL VTMENU (7,I,GTSTR,INIROW+7,STEPL,JJ+20,STEPC, 210 & INDGT(K),ABORT,O,O,O,O,O~ ~ 211 ENDIF 212 IF (ABORT} GOTO 30 213 IF {INDGT{K).EQ.7) THEN 214 CALL HLPSUB (RECHLP(12) ,I,3,I,INICOL,23,INICOL+76,HLP) 215 GOTO 40 216 ENDIF 217 ELSE IF (INDCT{K).EQ.2) THEN 2 1 8 C .............. Request Projection Coordinates 219 IF (K.EQ.I.OR.(K.EQ.2.AND.INDCT(I}.EQoI~ THEN 2 2 0 IF (K.EQ.I} THEN 221 LEFT = .TRUE. 222 ELSE 2 2 3 LEFT m .FALSE. 224 ENDIF 225 CALL PRJINP (MAXPRJ,LEFT,FLAG,INIROW+7,JJ+I0,

226 227 22B 229 230 231 232 233 234 235

Datum shift and conversion of geographical coordinates

INICOL+8,HALT,ABORT,KPRJ) IF (INDFK.EQ.I.AND.FLAG)

CALL DRWREC(INIROW,INICOL,DATSTR,I) ELSE

CALL VTCSET(INIROW+7,JJ+20) CALL VTEARE(INIROW+8,JJ+37)

ENDIF IF (ABORT) GOTO 30 IF (HALT) RETURN

ENDIF 236C . . . . . . . . . . . I n p u t Data F i l e Management 237 IF ( I N D C T ( K ) . E Q . I ) THEN 238 LFM = INDGT(K) 2 3 9 ELSE 240 LFM m I 241 ENDIF 242 IF (DATUMC.AND.DTMACC.AND.INDCT(K).EQ.2.AND. 2 4 3 & KPRJ.EQ.2.AND.INDUTM.EQ.I) THEN 2 4 4 NUMVAR(K) - 4

245 ELSE IF (DATUMC.AND.DTMACC.OR.(INDCT(K).EQ.2.AND. 246 & RPRJ.EQ.2.AND.I~DUTM.EQ.I) ) THEN 247 NUMVAR(K) m 3 2 4 8 ELSE 249 NUMVAR(K) m 2 2 5 0 ENDIF 251 IF (K.EQ.I) THEN

252 IF (INDFK.EQ.I) THEN 253 CALL DATGST (INIROW,INICOL,KPRJ,I,STRV,4,2,DATSTR, 254 & FLAG,VARCAR,HALT,ABORT) 255 IF (HALT) RETURN 256 IF (ABORT) GOTO 30 257 ELSE 258 MAXLEN(1) - NUMVAR(1)*12 259 WRITE (FORMAT(1),'(A,II,A,II,A)') 260 & '(',NUMVAR(1),'FI2.',IFM(LFM,INDCT(1)),')' 261 DO 4 2 ImI,NUMVAR(1) 262 VPOS(I~I) m I 263 POSCOL(I,I) m ( I - 1 ) ' 1 2 + 1 264 42 POSCOL(I,2) m 1"12 265 ENDIF 266 ELSE 267 DO 43 I-NUMVAR(1)+I,6 2 6 8 4 3 VPOS(I,I) m I 269 LENSTR m LENGTH(FORMAT(1),255)-I 270 WRITE(STRHLP,'(AB0)' ) FORMAT(l) 271 IF (INDCT(1).EQ.INDCT(2)) THEN 272 IF (INDFK.EQ.I) THEN 273 FORMAT(2) m FORMAT(1) 274 ELSE 275 WRITE (FORMAT(2),'(A,II,A,II,A)') 276 & ' (',NUMVAR(2),'FI2.',IFM(LFM,INDCT(2)),')' 277 ENDIF 2 7 8 MAXLEN(2) m MAXLEN(1) 279 ELSE IF (INDCT(1).EQ.I.AND.INDCT(2).EQ.2.AND.KPRJ.EQ.2 2 8 0 & .AND.INDUTM.EQ.I) THEN 281 FORMAT(2) m STRHLP(I:LENSTR)//',2FI2.3,F8.O)' 282 MAXLEN(2) m MAXLEN(1) + 32 2B] NUMVAR(2) m NUMVAR(1) + 3 284 ELSE 285 MAXLEN(2) m MAXLEN(1) + 2 4

286 NUMVAR(2) m NUMVAR(1) + 2 287 IF (INDFK.EQ.2) THEN 288 WRITE (S,'(A,II,A)')',2FI2.',IFM(LFM,INDCT(2)),')' 289 FORMAT(2} m STRHLP(I:LENSTR)//S ~90 ELSE 291 FORMAT(2) m STRHLP(I:LENSTR)//',2F12.3)' 292 ENDIF 293 ENDIF 294C .............. Request Geogcaphlcal Limits of Map 295 IF (DATUMC.AND.DTMACC) THEN 296 NPOLY m 0

297 MAXVX m 20 298 IF (FLAG) THEN 299 I~DX m 1 300 CALL VTCSET(INIROW+12,INICOL+42) 301 CALL VTWRIT('Latltude : ',12)

~7

488 M. LIGI and G. BORTOLUZZ|

302 303 304 305 306 307 308 309 310 311

312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 ~29 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 3.%4 355 356 357 358 359 360 361 36,2 363 364 365 366 367 368 369 370 371 372 373 374 375 376 37'7

&

49

50

&

55

h

&

59

500

56

57

CALl VTCSET(INIROW+I3,1NICOL÷42>

CALL VTWRIT{'Longitude : ' ,12)

ELSE

WRITE(STRHLP, ' {2AI)' ! (WINDOWI3,1NIROW~IS,J), J=INICOL+69,INICOL+70)

READ(STRHLP, ' (I2}' ,ERR=49) NP

IF (NP.LT,I.OR.NP.GT.MAXVX) THEN

CALL ERRMSG(17,ICODE)

HALT = .TRUE.

RETURN

ELSE

MAXVX = NP

ENDIF

ENDIF

IF (.NOT.FLAG) THEN

READ(ILOG, ' {2AI3J ' ,END=59) MAPTXT

ELSE

CALL VTCSET(INIROW+IS,INICOL+42)

WRITE {STRHLP, ' (A,I2)")

'Boundary Polygon Vertex n ,NPOLY÷I

CALL VTWRIT(STRHLP,29)

CALL VTMENR (INDX,LENTXT,2,I,INIROW~I2,STEPC,60,

STEPC,MAPTXT,HLP,ABORT)

IF {HLP) CALL HLPSUB (RECHLPII~),I.3, I,INICOL,23,

INICOL+76,HLPI

IF {HLP) GOTO 55

IF {ABORT) GOTO 30

ENDIF

AGAIN - .TRUE.

IF (MAPTXT(1) .EQ. ' '.AND.MAPTXT(2) .EQ ~ ) THEN

AGAIN ~ .FALSE.

ELSE

DO 500 INDX~I,2

CALL GETFMT(MAPTXT(INDX),STRHLP

READ(MAPTXT(INDX),STRHLP,ERR=56 REALNB(INDX)

GOTO 57

CALL ERRMSG{18,ICODE)

IF (.NOT.FLAG) THEN

HALT - .TRUE.

RETURN

ELSE

OOTO 50

ENDIF

INDX - 1

NPOLY - NPOLY + 1

CFPOLY{NPOLY) m DMSD60{REALNB(1})*DTOR

CLPOLY(NPOLY) - DMSD60{REALNB(2))*DTOR

IF {DABS(CFPOLY(NPOLY)).GE.HALFPI+EPSI.OR.

DABS(CLPOLY(NPOLY)) .GE.PIGREC+EPSI) THEN

CALL ERRMSG(19,ICODE)

NPOLY - NPOLY-I

IF ( .NOT.FLAG} THEN

HALT - .TRUE.

RETURN

ELSE

WRITE (MAPTXT(1), ' (F13.3) ~ ) REALNB(1)

WRITE (MAPTXT{2),'(F13.3)' I REALNBI2)

GOTO 50

ENDIF

ENDIF

MAPTXT(1) - ' '

MAPTXT{2) - ' '

ENDIF

IF {AGAIN.AND.NPOLY.LT.MAXVX) GOTO 50

IF (NPOLY.GT.0} THEN

IF(NPOLY.GT.I)CALL PREPLY(CLPOLY,CFPOLY,NPOLY,ERROR)

IF (.NOT.FLAG.AND.ERROR) THEN HALT J .TRUE.

RETURN

ELSE IF (ERROR.AND.FLAG) THEN

NPOLY ~ 0

GOTO 50

ENDIF

ELSE

IF { .NOT.FLAG) THEN

CALL ERRMSG{17,ICODE)

3'78 379 380 381 382 383 384 385 386 307 388 389 390 391 392 393 394 395 396 39"7 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415

58

Datum shin and conve~ion of geographical coor~nat~

HALT m .TRUE. RETURN

ELSE CALL VTEELL(1)

ENDIF ENDIF In (FLAG) THEN

CALL VTCSET(INIROW+I5,INICOL+42) WRITE (STRHLP,'(A,I2)')

'Boundary Polygon V e r t e x n. ' ,NPOLY CALL VTWRIT(STRHLP,29) DO 58 INDX=I,2

CALL VTCSET(INIROW÷II+INDX,IC+60) WRITE (STRHLP,' (F13.3)') REALNB(INDX) CALL VTWRIT(STRHLP,13)

ENDIF ENDIF

ENDIF 2 0 0 CONTINUE

ENDIF In (FLAG) THEN

CALL ERRMSG (25,ICODE) In (ICODE.EQ.27) GOTO I0 DO 61 1-I,23

61 WRITE(ILOG,'(80AI)' ) (WINDOW(3,I,J),J=INICOL,80) In (INDCT(1).EQ.2.OR.INDCT(2).EQ.2) THEN

DO 62 I-INIROW÷8,INIROW+20 62 WRITE(ILOG,' (80AI)')(WINDOW(2,I,J),J=INICOL+8,80)

ENDIF In (DATUMC.AND.DTMACC) THEN

DO 63 ImI,NPOLY 63 WRITE(ILOG,'(2FIS.3)') D60DMS(CFPOLY(1)'RTOD,3),

& D60DMS(CLPOL¥(I)*RTOD,3) ENDIF

ENDIF CALL CLOSEW RETURN END

1~lllmm

2 S U B R O U T I N E H E L P 3 C H A R A C T E R * 8 0 S T R I N G ( 2 2 ) 4 L O G I C A L J U M P 5 INCLUDE 'DTCOMMON.FOR'

46 I N C L U D E ' A N S I C O M M . F O R ' 64 DATA BLK / " ' / 6 5 I T E M P m WNUM 66 C A L L CLOSEW 67 I C O N T m 0 68 I F ( I O S H L P . E Q . O ) THEN 69 C A L L V T E S C R ( 0 ) 70 J U M P m . F A L S E . 71 DO 1 J m I , M A X R H 72 In (.NOT.2UMP) THEN 73 NREC m NRECH ÷ J - 1 74 READ (IHELP,REC-NREC,E~i) STRING 75 DO lO lol,22 76 CALL VTCSET(I,I) 77 CALL VTWRIT(STRING(1),79) 78 l 0 CONTINUE 79 CALL ERRMSG(26,KE¥) 80 In ( K E Y . N E . 1 3 ) THEN 81 J U M P m . T R U E . 82 ELSE 83 CALL VTESCR (0) 84 ENDIF 85 ENDIF 86 I CONTINUE 87 ELSE 88 CALL VTCSET(I,I) 89 CALL VTWRIT('Sorry, HELP File not Found II',0) 90 E N D I F 91 CALL OPENW(ITEMP,.FALSE. ) 92 R E T U R N 93 END

1 C - - - - - 2 SUBROUTINE HLPSUB (NREC,NW,NUMWZN,SR,SCoER,EC,HLP)

489

490 M. L~ox and G, ~ORTOLUZZ!

3 LOGICAL HLP 4 CHARACTER*80 STRING(22)

5 INTEGER NUMWIN(NW),SR(NW),SC(NW),ER(NWI,EC(NW) 6 INCLUDE 'DTCOMMON.FOR'

47 INCLUDE 'ANSICOMM.FOR' 65 ITEMP = WNUM 66 CALL CLOSEW 67 HLP m .TRUE.

68 IF (IOSHLP.EQ.0) THEN 69 CALL VTESCR (0) 70 READ (IHELP,RECmNREC) STRING 71 DO I I - 1,22 72 CALL VTCSET(I,I) 73 1 CALL VTWRIT(STRING(I),79) 74 CALL ERRMSG(27,ICODE) 75 DO 2 I - I,NW

76 2 CALL RESTOW (NUMWIN(I),SR(1) ~SC(I ),ER(I),ECII) , .TRUE. ) 77 ELSE 78 CALL VTCSET(I,I}

79 CALL VTWRIT('Sorry, HELP File not round ! ~ ' ,0~ 80 ENDIF

81 CALL OPENW (ITEMP, .FALSE. ) 82 RETURN 83 END

1 C - - - - - 2 SUBROUTINE INPPAR (MAXPRJ,PRGSTRoFLAG,HALT,KPRJ) 3C ..... Request the projection parameters, including options for the 4C 8electlon between different ellipsoids and datum change 5C ..... Initialize costant8 in COMMON /DGEODE/ 6C

7C MAXELL : max numbec of allowed ellipsoids 8C REFEPS,RFLAT : tabulated semimajor axis a n d flattening

9C of the most used reference ellipsoids 10C DELX,DELY,DELZ : tabulated shifts of the above ellipsold~

llC versus WGS72 ellipsoid 12 IMPLICIT DOUBLE PRECISION (A-H,O-Z)

13 INCLUDE 'DTCOMMON.FOR' 54 INCLUDE 'ANSICOMM.FOR' 72 PARAMETER ( INIROWm4, INICOL-2 )

73 CHARACTER PRGSTR*(*),STRING*58,STRHLF'80,EXTSTR(3)'I2,TXTELL(5)*I2 74 CHARACTER DATUM(MAXELL)*21,ACCSTR(MAXELL-I)*21,SHFSTR(4)'IS,FMT*80 75 INTEGER*4 STEPL(MAXELL),STEPC(MAXELL),LENTXT(5),INDTMP(MAXELL) 76 REAL*8 REFEPS(MAXELL),RFLAT(MAXELL) ,DELX(MAXELL),DELY(MAXELL), 77 & DELZ(MAXELL) 78 REAL*4 WARRAY(MAXELL,5)

79 LOGICAL HLP,HALT,ACCSHF(MAXELL] ,FLAG,ARORT 80 DATA STRING /

81 & 'D A T U M and P R O J E C T I O N P A R A M E T E R S'/ B2 DATA EXTSTR,TXTELL /' CONTINUE ' , ' EXIT , ' HELP ,5"' /

83 DATA SNFSTR /'ACCURATE SHIFT','NO SHIFT' SPEDITIVE SHIFT', 'IIELP'/ 84 DATA STEPL,STEPC,LENTXT / 15'0,15*1,5'12

85C ..... Solect ACCSHF to Perform Accurate Shift~ 86 DATA ACCSHF / 3*.TRUE. , II*.FALSE...TRUF 87C ..... Datum Monte MARIO

88 DATA REFEPS(1),RFLAT(1),DELX(1),DELY(1),DEI.Z(1),DATUM(1) / 89 L 6378388.D0,297.D0,-222.D0,-78.D0,~.D0. 'M.MARIO (INTERNAT.)'/ 90C ..... Datum ED50 9 i DATA REFEPS(2),RFLAT(2),DELX(2),DEt, Y(2),DELZ(2),DATUM(2) / ~2 & 6378388.D0,297.D0,-84.D0,-103.D0,-177.D0, 'ED 50 (INTERNATIONAL)'/

93C ..... Datum GENOVA (ITALIA 23)

94 DATA REFEPS(3),RFLAT(3),DELX(3),DELY(3),DELZ(3),DATUM(3) / 95 & 6377397.16D0,299.153D0,547.D0,2.D0,531.D0,'GENOVA (BESSEL)' / 96C ..... Datum NAD27

97 DATA REFEPS(4),RFLAT(4),DELX(4),DELY(4),DELZ(4),DATUM(4) / 98 & 6378206.4D0,294.979D0,-22.D0,157.D0,176.D0,'NAD27 (CLARKE 1866)'/ 99C ..... Datum NTF

I00 DATA RZFEPS(5),RFLAT(5),DELX(5),DELY(5),DELZ(5),DATUM(5) / I01 & 6378249.15D0,293.465D0,-170.D0,-66.D0,311.D0,'NTF (CLARKE IB80)'/ 102C ..... Datum Tokyo TD 1 0 3 DATA REFEPS(6),RFLAT(6),DELX(6),DELY(6),DELZ(6),DATUM(6) / 104 & 6377397.16D0,299.153D0,-140.D0,516.D0,673.D0,'TOKIO TD (BESSEL)'/ I05C ..... Datum ORDINANCE SURVEY OF GREAT BRITAIN 1936 106 DATA REFEPS(7),RFLAT(7),DELX(7),DELY(7),DELZ(7),DATUM(7) / 107 & 6377563.4DO,299.325DO,368.DO,-120.DO,425.DO,'OGSB 1936 (AIRY)'/ 108C ..... Datum SAD69 1 0 9 DATA REFEPS(B),RFLAT(B),DELX(B),DELY(B),DELZ(B},DATUM(8) /

Datum shift and conversion of geo~aphical coordinates

110 a 6378160.D0,298.25D0,-77.D0,3.D0,-45.D0,'SAD69 (REF.ZLL.1967)'/ 111C ..... Datum MERCURY 60 ED AREA 112 DATA REFEPS(9),RFLAT(9),DZLX(9),DELY(9),DELZ(9),DATUM(9} / 113 & 6378166.D0,298.30D0,-13.D0,-Oa.D0,-5.D0,'MERCURY60 ED (FISHER)'/ 114C ..... Datum MERCURY 60 NAD AREA 115 DATA REFEPS(10),RFLAT I0 ,DELX(10 ,DELY(10),DELZ(10),DATUM(10) / 116 E 6378166.D0,298.30D0,-25.D0,46.D0,-49.D0,'MERCUR¥60 MAD(FISHER)'/ 117C ..... Datum MERCURY 60 TD AREA 118 DATA REFEPS(11),RFLAT 11 ,DELX(I1 ,DELY(ll),DELZ(11),DATUM(11) / 119 & 6378166.D0,298.30D0,18.D0,-132.D0,60.D0,'MERCURY60 TD (FISHER)'/ 120C ..... Datum AUSTRALIAN NATIONAL 121 DATA REFEPS(12),RFLAT 12 ,DELX(12 ,DELY(12),DELZ(12),DATUM(12) / 122 ~ 6378160.D0,298.25D0,-12 ,-41.D0,146.D0,'AGD (REF.ELL.1967)' / 123C ..... Datum WGS 1972 124 DATA REFEPS(13),RFLAT 13 ,DELX(13 ,DELY(13),DELZ(13),DATUM(13} / 125 & 6378135.D0,298.26D0, 0.D0, 0.D0, 0.D0,'WGS 72'/ 126C ..... Datum in INPUT 127 DATA REFEPS(14),RFLAT 14 ,DELX(14 ,DELY(14),DELZ(14),DATUM(14) / 128 & 5*0.0D0, 'INPUT ELLIPSOID' / 129C . . . . . H e l p 130 DATA REFEPS(15),RFLAT 15 ,DELX(15 ,DELY(15),DELZ(15),DATUM(15) / 131 a 5*0.0D0, 'HELP' / 132C ..... 133 REWIND (ILOG) 134 ABORT m .FALSE. 135 CALL VTESCR(0) 136 CALL OPENW(I,.TRUE.) 137 CALL VTCSET (INIROW,INICOL) 138 CALL VTGRID (INIROW+18,INICOL+76,1,INIROW+2,INICOL,INICOL+76, 139 ~ 0 , 0 , 0 , 0 ) 140 LENSTR m 2*LENGTH(PRGSTR,255) 141 CALL VTCSET(INIROW-2, (80-LENSTR)/2+I) 142 CALL VTDOSP(PRGSTR,LENSTR} 143 CALL VTCSET(INIROW÷I,INICOL+10) 144 CALL VTATTR(0,0,1,0,0,0) 145 CALL VTWRIT(STRING,58) 146 CALL VTATTR(0,0,0,0,0,0) 147 IF (.NOT.FLAG) THEN 148C ........ Log Session 149 DO 1 I - 1 , 2 2 150 1 READ(ILOG,'(e0A1)',END-9) (WINDOW(1,1,J),3-INICOL,80) 151 GOTO 8 152 9 HALT m .TRUE. 153 CALL ERRMSG(34,ICODE) 154 RETURN 155 8 CALL RESTOW(I,INIROW+3,INICOL+l,INIROW+lT,INICOL+75,.TRUE.) 156 CALL WAIT (1.0) 157 ELSE 158C ........ Interactive Session 159 IF (MAXPR3.NE.0) THEN 160 CALL VTCSET(INIROW+4,INICOL+3) 161 CALL VTWRIT('Projection :',0) 162 ENDIF 163 CALL VTCSET(INIROW+8,INICOL+3) 164 CALL VTWRIT( 165 S 'Datum : Semimajoc Axis : ' , 0 ) 166 CALL VTCSET(INIROW+9,INICOL+38) 167 CALL VTWRIT ('Reciprocal Flattening : ',0) 168 CALL VTCSET(INIROW+II,INICOL+3) 169 CALL VTWRIT('Shi~t : ',0) 170 ENDIF 171C ..... Exit Menu 172 10 HLP m . F A L S E . 173 I F ( . N O T . F L A G ) THEN 174 INDXT m 0 175 W R I T E ( S T R H L P , ' ( 1 2 A I ) ' ) ( W I N D O W ( I , I , J ) , J - 6 8 , 7 9 ) 176 DO 11 I - 1 , 2 177 II IF (STRHLP.EQ.EXTSTR(1)) INDXT m I 178 IF (INDXT.EQ.0) THEN 179 CALL ERRMSG(I,ICODE) 180 HALT m .TRUE. 181 RETURN 182 ENDIF 183 ELSE 184 CALL VTMENU (3,1,EXTSTR,1,STEPL,68,STEPC,INDXT, 185 & ABORT,0,0,0,0,0.)

491

CAGEO |5:4-D

492 M Ll6~ and G. Bo~roLczzz

186 ENDIF 187 IF (ABORT.OR. (INDXT.EQ.2)) THEN 188 HALT = .TRUE. 189 RETURN 190 ELSE IF (INDXT.EQ.1} THEN 191 HALT R .FALSE.

192 ELSE IF (INDXT.EQ.3) THEN

1 9 3 HLP = .TRUE. 194 CALL HELP 195 IF (IOSHLP.EQ.0) CALL RESTOW(I,I,I,24,80,.TRUEo ~ 196 ENDIF 197 IF ( H L P ) GO TO i0 198 DO 12 I =I,MAXELL 199 WARRAY(I,I)~SNGL(REFEPS(I) ) 200 WARRAY(I,2)-SNGL(RFLAT(I))

201 12 CONTINUE

202C ..... Requtst of Projection 203 15 IF (MAXPRJ.NE.0~ THEN 2 0 4 CALL PRJINP (MAXPRJ, .TRUE, ,FLAG,INIROW+4,INICOL+I6, 205 & INICOL÷I4,HALT,ABORT,KPRJ) 206 IF (ABORT) GOTO 10 207 IF (HALT) RETURN 208 ENDIF

209C ..... Menu Datum and Ellipsoid 210 20 HLP - .FALSE. 211 I F (.NOT.FLAG) THEN 212 INDDTM - 0 213 WRITE (STRHLP, ' (80AI)') 214 & (WINDOW(I,INIROW+8,J),J-INICOL+I6,1NICOL+36) 215 DO 21 I-I,MAXELL-I 216 21 IF (STRHLP.EQ.DATUM{I)) INDDTM - I 217 IF (INDDTM.EQ.0) THEN

218 CALL ERRMSG(2,ICODE) 219 HALT = .TRUE. 220 RETURN 221 ENDIF 222 ELSE 223 CALL VTMENU (MAXELL,I,DATUM,INIROW+8,STEPL,INICOL+I6,STEPC, 224 & INDDTM,ABORT,2,MAXELL,INIROW+8,INICOL+62,WARRAY)

225 ENDIF 226 IF (ABORT.AND.MAXPRJ.EQ.0) GOTO 10 227 IF (ABORT.AND.MAXPRJ.NE.0) GOTO 15 228 I F (INDDTM.EQ.MAXELL) CALL HLPSUB (RECHLP(1),I,I,I ,I,24,80,HLP) 229 IF ( H L P ) 3OTO 20 230C ..... Uaar Input Ellipsoid

231 232 233 22

234 235 23 236 & 237 238

239 240 241

242 243 244 245 246 24" 24B 249 250 251 252 253 221 254 255 256 257

258 259 260 222 261

IF (INDDTM.EQ.(MAXELL-I)) THEN

INDX - I IF (.NOT.FLAG) THEN

DO 23 I-I,2

WRITE (TXTELL(1), ' (80AI)' } (WINDOW{I,INIROW+7+I,J),J-INICOL+62,1NICOL+73)

ELSE CALL VTMENR (INDX,LENTXT,2,I,INIROW+8,STEPC,

INICOL÷62,STEPC,TXTELL,HLP,ABORT)

ENDIF IF (ABORT) GOTO 20 IF (HLP) CALL HLPSUB (RECHLP(2),I,I,I,I,24,80,HLP) IF (HLP) GOTO 22 INDX - I CALL GETFMT(TXTELL(INDX),FMT) READ(TXTELL(INDX),FMT,ERR-221) SEQ IF (SEQ.LT.6377000.D0.OR.SEQ.GT.6379000.D0) GOTO 221

INDX - 2 CALL GETFMT(TXTELL(INDX),FMT) READ (TXTELL(INDX),FMT,ERR-221) ALFA IF (ALFA.LT.290.D0.OR.ALFA.GT.305.D0) GOTO 221 GOTO 222 CALL ERRMSG(3,ICODE) IF (.NOT.FLAG) THEN

HALT - .TRUE. RETURN

ELSE GOTO 22

ENDIF CONTINUE

ELSE

Datum shift and conversion of geographical coordinates

2 6 2 SEQ - REFEPS(INDDTM) 263 ALFA m RFLAT(INDDTM)

264 ENDIF 265 EFFE - 1.0D0/ALFA 266 E C 2 m EFFE * (2.0D0-EFFE)

267 DO 24 LL u 1,2 268 SEQON(LL) m SEQ 269 2 4 EC2ON(LL) m EC2 270C ..... Menu Datum Shift 271 IF (ACCSHF(INDDTM)) THEN 272 NF m 4 273 IADDR ~ 1 274 ELSE 275 NF ~ 3 276 IADDR m 2 277 ENDIF 278 30 IF (.NOT.FLAG) THEN 279 INDSHF m 0 280 W R I T E ( S T R H L P , ' ( 8 0 A 1 ) ' ) 281 & (WINDOW(I,INIROW+II,J),JsINICOL+I6,INICOL+30) 282 DO 31 l : I , N F - 1 2 8 3 31 I F (STRHLP.EQ.SHFSTR(IADDR+I-1)) INDSHF - I 284 IF (INDSHF.EQ.0) THEN 285 CALL ERRMSG(4,ICODE) 286 HALT m .TRUE. 287 RETURN 2 8 8 ENDIF 2 8 9 ELSE 290 CALL VTMENU (NF,I,SHFSTR(IADDR),INIROW+II,STEPL,INICOL+I6, 291 L STEPC,INDSHF,ABORT00,0,0,0,0.) 2 9 2 ENDIF 293 IF (ABORT) GOTO 20 2 9 4 H L P m .FALSE. 295 IF ( N F . E Q . 3 ) INDSHF m INDSHF + l 2 9 6 IF (INDSHF.EQ.4} CALL HLPSUB (RECHLP(3),I,I,I,X,24,80,HLP) 297 IF (HLP) GOTO 30 298 IF (INDSHF.EQ.2) THEN 299 DATUMC m .FALSE. 3 0 0 IF (FLAG) THEN 301 CALL VTCSET(INIROW+I2,INICOL+3) 3 0 2 CALL VTEARE(INIROW+IT,INICOL+75) 3 0 3 ENDIF 3 0 4 E L S E 305 DATUMC m .TRUE. 306 IF (FLAG) THEN 3 0 7 CALL VTCSET(INIROW+I2,INICOL+3) 308 CALL VTWRIT ( 309 & 'Shifted t o : SemlmaJor Axis 3 1 0 CALL VTCSET(INIROW+I3,INICOL+38) 311 CALL VTWRIT ('Reciprocal Flattening : ',0) 312 ENDIF 313C . . . . . . . . I t w r i t e s t h e Datum i h i f t s e l e c t i o n Menu 314 315 316 317 318 319 320 321 322 323 324 325 2126 327 3211 329 330 2131 332 2133 334 335 336 337

32

IF (INDSHF.EO.3) THEN DTMSPZ m .TRUE. DTMACC m .FALSE. DO 32 I m 1,MAXELL

IF (I.LE.MAXELL-2) THEN WARRAY(I,3) m SNGL(DELX(INDDTM)-DELX(I)) WARRAY(I,4) m SNGL(DELY(INDDTM)-DELY(I)) WARRAY(I,5) - SNGL(DELZ(INDDTM)-DELZ(I))

ELSE WARRA¥(I,3) - 0.0 WARRA¥(I,4) - 0.0 WARRAY(I,5) m 0.0

ENDIF CONTINUE IF (FLAG) THEN

CALL VTCSET (INIROW+I4,INICOL+57) CALL VTWRIT('dX : ',0) CALL VTCSET (INIROW+IS,INICOL+57) CALL VTWRIT('dY : ' , 0 ) CALL VTCSET (INIROW+I6,INICOL+57) CALL VTWRIT('dZ : ',0)

ENDIF IF (INDDTM.NE.MAXELL-I) THEN

NW m 5

493

: ' , 0 )

494 ,~I, L)GI and G. BORTOLL'ZZI

338 E L S E 339 NW = 2 340 E N D I F 341 .40 I F ( . N O T . F L A G ) T H E N 3 4 2 NEWDTM = 0 3 4 3 WRITE ( S T R H L P , ' ( 8 0 A 1 ) ' ) 344 & (WINDOW(I,INIROW+I2,J),J=INICOL+I6,INICOL÷36)

345 DO 41 I=I,MAXELL-I

346 41 IF (STRHLP.EQ.DATUM(1)) NEWDTM - I

347 IF (NEWDTM.EQ.0) THEN

348 CALL ERRMSG(5,ICODE)

349 HALT = .TRUE.

350 RETURN

351 ENDIF

352 ELSE 353 CALL VTMENU(MAXELL,I,DATUM,INIROW+I2,STEPL,INICOL+I6,

354 & STEPC,NEWDTM,ABORT,NW,MAXELL,INIROW+I2,INICOL+62,WARRAY)

355 ENDIF

356 IF (ABORT) GOTO 30

357 HLP = .FALSE. 358 IF(NEWDTM.EQ.MAXELL)CALL HLPSUB(RECHLP(3) ,I ~I,I,I,24,80,HLP)

359 IF (HLP) GOTO 40

360C ........... User Input Ellipsoid

361 INDX = 1 362 IF ((INDDTM.EQ.MAXELL-I) .OR. (NEWDTM.EQ.MAXELL-I)) THEN

363 IF (NEWDTM.EQ. (MAXELL-I)) THEN

364 NF = 5 365 INDI = 366 IR = INIROW + 12

367 ELSE

368 NF - 3

369 INDI - 3 370 IR - INIROW + 14

371 DO 42 I = 1,3

372 42 TXTELL(I)-'

373 ENDIF 374 43 IF (.NOT.FLAG) TIIEN

375 DO 44 IJI,NF 376 WRITE (TXTELL(I) ,' (80AI)')

377 & (WINDOW(I,IR+I-I,J),J-INICOL+62,INICOL+73)

378 44 CONTINUE

379 ELSE

380 CALL VTMENR (INDX,LENTXT,NF,I,IR,STEPC,INICOL+62,

3 B l & STEPC,TXTELL,HLP,ABORT )

3 8 2 ENDIF

3 8 3 IF (ABORT) GOTO 4 0 384 IF (HLP) CALL HLPSUB (RECHLP(4),I,I,I,I,24,80,HLP)

385 IF (HLP) GOTO 43 386 DO 45 INDX a I,NF

387 CALL GETFMT(TXTELL(INDX),FMT)

3BB READ(TXTELL(INDX),FMT,ERR=441) 389 & WARRAY(NEWDTM,INDX-I+INDI)

390 45 CONTINUE

391 INDX s 1 392 IF ((NF.EQ.5) .AND. (WARRAY(NEWDTM,I) .LT.6377000.DO 393 & .OR.WARRAY(NEWDTM,I) .GT.6379000.D0) ) GOTO 441

394 INDX = 2 395 IF ((NF.EQ.5).AND. (WARRAY(NEWDTM,2).LT.290.0D0.OR.

396 & WARRAY(NEWDTM,2).GT.305.D0) ) GOTO 441

397 GOTO 442 398 441 CALL ERRMSG(6,ICODE) 399 IF (.NOT.FLAG) THEN

400 HALT = . T R U E . 401 RETURN 402 ELSE

403 GOTO 4~

404 ENDIF 405 442 CONTINUE

406 ENDIF 407 SEQN = DBLE(WARRAY(NEWDTM,I) )

408 ALFA - DBLE(WARRAY(NEWDTM,2))

409 DDX - DBLE(WARRAY(NEWDTM,3)) 410 DDY - DBLE(WARRAY(NEWDTM,4)) 411 DDZ - DBLE(WARRAY(NEWDTM,5) )

412 EFFEN - 1.0D0/ALFA

4 1 3 DSEQ - SEQN - SEQ

Datum shift and conversion of geographical coordinates

414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 47 ' t 474 475 476 477 478

49 50

51

46 50

&

51

52

DEFFE m EFFEN - EFFE ELSE

DTMSPE - .FALSE.

DTMACC ~ .TRUE. K - 0 DO 46 I = I,MAXELL

IF (ACCSHF(I) .AND.I.NE.INDDTM) THEN K = K + 1 INDTMP(K) = I READ(DATUM(I) , ' (A21) ' ) ACCSTR(K) WARRAY(K,I) - SNGL(REFEPS(I))

WARRAY(K,2) = SNGL(RFLAT(I)) ENDIF

CONTINUE

IF ( .NOT.FLAG) THEN NEWDTM m 0

WRITE (STRHLP, ' (80AI) ' ) (WINDOW(I,INIROW+I2,J) ,J=INICOL+16, INICOL+36)

DO 51 I=I,K-I

IF (STRHLP.EQ.ACCSTR(1)) NEWDTM = I IF (NEWDTM.EQ.0) THEN

CALL ERRMSG(5, ICODE) HALT = .TRUE.

RETURN ENDIF

ELSE

CALL VTMENU(K,I,ACCSTR,INIROW÷I2,STEPL,INICOL+I6,STEPC

, NEWDTM, ABORT, 2, MAXELL, INIROW+ 12 , INICOL+62, WARRAY ) ENDIF IF (ABORT) GOTO 30 HLP m .FALSE.

IF (NEWDTM.EQ.K) CALL HLPSUS (RECHLP(5),I01,1,1,24,80,HLP) IF (HLP) GOTO 50 NEWDTM m INDTMP(NEWDTM) S E Q O N ( 1 ) - SEQ SEQON(2) - REFEPS(NEWDTM) DSEQ m REFEPS(NEWDTM) - SEQ DEFFE m 1.0D0/RFLAT(NEWDTM) - EFFE

EC2ON(1) - EC2 ALFA m 1.0D0/RFLAT(NEWDTM) EC2ON(2) m ALFA*(2.0D0-ALFA) SEQ m SEQON(2) EC2 m E C 2 O N ( 2 )

K " 0 DO 52 1-1,MAXELL-I

IF (ACCSHF(I)) THEN K - K + 1 INDASD(K) - I

ENDIF CONTINUE

ENDIF ENDIF IF (FLAG) THEN

CALL ERRMSG(25,ICODE) IF (ICODE.EQ.27) GOTO I0 DO 61 ImI,22

61 WRITE(ILOG,'(80AI)') (WINDOW(I,I,J),J-INICOL,80) IF (MAXPRJ.NE.0) THEN

DO 62 ImINIROW+5,INIROW+I7 62 WRITE(ILOG,' (80A1)')(WINDOW(2,I,2),JmINICOL+I4,80)

ENDIF ENDIF CALL CLOSEW RETURN

END

2 SUBROUTINE KBDRD(DATI,HALT,ABORT) 3C ..... It eccepts date Erom keyboard 4 CHARACTER STR*5, KBDINP(4)*I5 , FMT*80 5 REAL*8 DATI(1), REALNB(2), DEGRAD 6 INTEGERt4 LENTXT(4),STEPL(4),STEPC,STARTL,STARTC 7 LOGICAL HALT,HLP,ABORT 8 INCLUDE 'DTCOMMON.FOR'

DATA KBDINP,APP / 4'' ',' '/

DATA INPNUM,LENTXT,STEPL,STEPC,STARTL,STARTC /0,4"15,4"1,1,8,25/ INDX m 1

495

-I~;~ M, LJol and O. I~)~rOLt ZZX

52 5] 54 55 56 57

58

59 60 61 62 63 64 65 66

67 68 69 70

71 72 73 74

75 76 77 78

79 80 81

82

83 84

85 86

87 88

INPNUM m INPNUM ÷ 1

CALL VTCSET(6,23) WRITE (STR,' (I5)') INPNUM CALL VTWRIT(STR,5)

1 CALL VTMENR (INDX,LENTXT,NUMVAR(I} & KBDINP,HLP,ABORT) IF (ABORT) THEN

CALL CLOSEW RETURN

ELSE IF (HLP) THEN CALL HLPSUB (RECHLP(15),I,4,1,1

ELSE IF (KBDINP(I) .EQ. ' ' .AND.KBDINP

& KBDINP(3) .EQ. ' ' .AND.KBDINP HALT - .TRUE.

ELSE HALT = .FALSE.

DO 2 INDX=I,NUMVAR(1)

CALL GETFMT(KBDINP(INDX) ,FMT) 2 READ (KBDINP(INDX),FMT,ERR=I) DATI(INDX:

IF (INDCT(1).EQ.I) THEN

REALNB(1) = DEGRAD(DATI(1),INDGT(1) REALNB(2) = DEGRAD(DATI(2) ,INDGT(I ) IF (DABS(REALNB(1)) .GE. (HALFPI+~PSI

DABS(REALNB(2) ).GE. (PIGREC+EPSI CALL ERRMSG(19,ICODE) INDX - 1

GOTO i ENDIF

ENDIF ENDIF

ENDIF

IF (HLP) GOTO 1 DO ] INDX - 1,4

3 KBDINP(INDX) - '

RETURN END

I,STARTL,STEPL,STARTC,STEPC,

. (9 [!

20,80,HLP)

2) .EQ.' '.AND 4) .EQ. ' ' ) THE~

ICmmmtm

2 SUBROUTINE MSKDTM (PRGSTR) 3C ..... It writes the Datum shift mask 4

5 46 47 48

49

50 51 52 53 54

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

72 73

74 75 76 77 78 79

CALL VTESCR CALL VTCSET CALL VTDOSP CALL VTCSET CALL VTGRID CALL VTCSET DO 1 I-I,3

CHARACTER PRGSTR*(*), STRH(2)'28, STRS(3)*I8 INCLUDE 'DTCOMMON.FOR' DATA STRH,STRS / 'ACCURATE SHIFT Parameters' ~

& 'SPEDITIVE SHIFT Parameters', 'Shift & ' Dy:',' Dz~ ~

IF (DTMACC) THEN IROW - 6 IROWG - 18

ELSE IROW ~ 5

IROWG - 10

ENDIF 0) I, (80-LENGTH(PRGSTR,255)*2)/2) PRGSTR,LENGTH(PRGSTR,255))

2,2) IROWG,78,1,4,2,78,0,O,O,O) 3,12)

CALL VTCSET(IROW+I,4) CALL VTWRIT(STRS(I),18)

IF (DTMACC) THEN CALL VTCSET(3,12) CALL VTDOSP(STRH(1) ,28) CALL VTCSET(5,4) CALL VTWRIT (

'Number of Points Selected to Compute STATISTICS:

CALL VTATTR (i,I,1,0,0,0)

CALL VTCSET(22,35) CALL VTWRIT(' Working ',11) CALL VTATTR(0,0,0,0,0,0) CALL VTCSET (5,54)

E L S E CALL CALL

ENDIF

VTCSET(3,12) VTDOSP(STRH(2),28)

DK:',

',49)

Datum shift and conversion of geographical coordinates

4 5 6

47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 '76

80C ..... 81 RETURN 82 END IC----m 2 SUBROUTINE MSKINI (PRGSTR,PRGTXT) 3C ..... It writes the Welcome mask 4 CHARACTER PRGSTR i(*) ,PRGTXT(I ]* (* ] ,TXT(8)*55 5 INTEGER TXTR( 8 ] ,LL( 4 ) ,SC( 4 ) ,EC( 4 ) ,CC( 4 ] 0SL(4 } ,EL(4 ] 6 DATA TXT/3 t' ' 7 & ,'X N S T I T U T E O F M A R I N E G E O L O G Y' 8 a ,' National Research Council of Italy ' 9 & ,' B o l o g n a (Italy] '

I0 & ,'Version ".0 May 1987' II • , 'Authors : Giovanni BORTOLUZZI • Marco LIGI'/ 12 DATA TXTR / 8,9,10,15,16,17,19,20/ 13 DATA LL,SC,EC / 4,11,13,21,4"Ii,4"69 / 14 DATA C C , S L , E L / 2 " 1 1 , 2 " 6 9 , 4 , 1 3 , 4 , 1 3 , 1 1 , 2 1 , 1 1 , 2 1 / 15C . . . . . Z n i t i e l Henu 16 CALL VTESCR(0 ) 17 CALL VTCSET( 3 , 1 0 ) 18 CALL VTGRID (22,70,4,LL,SC,EC,4,CC,SL,EL) 19 LENSTR m LENGTH(PRGSTR,255) 20 CALL VTCSET{6, (80-2*LENSTR)/2+I) 21 CALL VTDOSP(PRGSTR,LENSTR] 22 DO 1 - I = 1 , 3 23 I WRITE(TXT(I),'(A55]' ] PRGTXT(I) 24 DO 2 Z - l , 8 25 CALL V T C S E T ( T X T R ( I ) , 1 3 ) 26 2 CALL VTWRIT(TXT(I ], 55 ) 27 RETURN

28 EN?) ICmmmmm 2 SUBROUTINE MSKKBD (PRGSTR,KPRJ) 3C ..... It writes the mask for keyboard input of data to be processed

CHARACTER PRGSTR*(*) ,STRV(4,2) ' 1 3 INTEGER* 4 LL(3),SC(3),EC(3) INCLUDE 'DTCOMMON.FOR' DATA STRV /'LATITUDE','LONGITUDE','HEIGTH',' ',

& 'NORTHIHG','EASTING','HEIGTH','UTM ZONE' / DATA LL,SC,EC / 4,14,16,3"2,3"78 / CALL OPENW(4, .TRUE. ) CALL VTESCR 0) CALL VTCSET 1,32) CALL VTDOSP PRGSTR,18 ) CALL VTCSET 2,2) CALL VTGRID 20,78,3,LL,SC,EC,0,0,0,0) CALL VTCSET 3,27) CALL VTDOSP 'Input Record' ,13) CALL VTCSET(15,27} CALL VTDOSP( 'Output Record' ,13) CALL VTCSET(6,4 } CALL VTWRIT ('Record Number :',18) IROW - 7 DO I ImI,NUMVAR(1)

CALL VTCSET(I+IROW,4) IF (NUMVAR(1) .EQ.3.AND.I.EQ.3.AND.INDCT(1).EQ.2.AND.

• KPR3. EQ. 2. AND. INDUTM. EQ. 1 ) THEN CALL VTWRIT(STRV(4,INDCT(I]]//' :',15)

ELSE CALL VTWRIT(STRV(I,INDCT(1))//' :',15)

ENDIF I CONTINUE

CALL VTCSET(13,4) CALL VTWRIT(

&'Press Twice (F1) RETURN END

IC----- 2 3 4

45 46 47 48 I 49

Key to Stop l ESC Kay to Main Menu 1',80)

SUBROUTINE NUMCOL (NUM,IROW, ICOL,ISEL) CHARACTER*5 STRING(2) INCLUDE 'DTCOMMON.FOR' CALL VTCSET(IROW,ICOL] IF (NUM.EQ.0) THEN

DO I I-I,2 STRING(1)m'

ELSE

497

498

50

51 52 53 54 55 56 57

81 82 83 84 B5 86 87 88 B9 90 91 92 93 94 95 96 97 98 99

100 101 102 103 104 105 106 107 lOB 109 110 l l l

112 113 114 115 116 117 118 119 120 1;21 122 123 124 125

M. Lzo and G. BoaroLuzz l

DO 2 1-1,2 2 WRITE(STRING(I),' (I5)') POSCOL[NUM,I ~

ENDIF DO 3 I-1,2

CALL VTCSET(IROW,ICOL+(I-I)*II) 3 IF (ISEL.EQ.0.OR.I.EQ.ISEL) CALL VTWRIT(STRING{I) ,5

RETURN END

2 SUBROUTINE PRJINP (MAXPRJ,LEFT.FLAG,IROW,ICOL,ICI,HALT ABORT,KPRJ) 3C ..... Main input routine for projection parameter selection 4 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 5 REAL*8 WY(14) 6 INTEGER NW(2),SR(2),SC(2),ER(2),EC(2),STEPL(10},STEPC(10}, 7 & LENTXT(9) 8 INTEGER'2 TYPPRJ(9),PARCNT(10,2,9)

9 CHARACTER PRJSTR(10)*IB,PRJSIZ(9)*25,STRHLP*80,PRJTYP(3,9)*IB, lO & PARSTR(21)'54, STRTXT(9)*I3, STRING*80. FMT'80 II LOGICAL HALT,FLAG,ABORT,HLP,ERROR,LEFT 12 INCLUDE 'DTCOMMON.FOR' 53 INCLUDE 'ANSICOMM.~OR' 71 DATA STEPL,STEPC,SR,~C,EB,EC /10"0,I0"i,4'I,2"24,2"80 / 72 DATA TYPPRJ,LENTXT / 1,2J2,1,2,2"I,2"2 ,9"13/ 73 DATA PARCNT / 5,7,10,12,13,14,14"0, 7,15,16,17,18,19,20,21,2"0. 74 & 4,10,12,13,14,5"0,8,I,3,4,5,6,12,13,14,0,6,1,2,11,12,13,14,3"0, 75 ~ 5,1,2,12,13,14,14"0,5,7,10,12,13,14,4"0,7,1,2,8,9,12,13,14,2"0, 76 & 7,1,2,8,9,12,13,14,12~0, 5,1,2,12,13,14,14"0, 5,7,10,12,13,14, 77 ~ 4"0,5,1,2,12,13,14,4"0, 5,1,2,12,13,14,4"0,5,1,2,12,13,14,4"0 / 78 DATA PRJSTR / 'UTM (GAUSS-KRUGER)', 'DIRECT MERCATOR', 79 & 'OBLIQUE MERCATOR','CASSINI-SOLDNER','LAMBERT CONFORMAL', 80 & 'ALBERS','POLYCONIC','STEREOGRAPHIC' , 'LAMBERT AZIMUTHAL' , 'RELP'/

DATA PRJSIZ / 3*'Cylindrical and Conformal' , 'cylindrical' , & 'Conic a n d Conformal','Conlc and Equal-Area','Conic',

& 'Azimuthal end Conformal','Azimuthal and Equal-Area' /

DATA PRJTYP /3'' ','STANDARD','NON STANDARD', 'HELP', & 'INPUT METHOD (a)' , 'INPUT METHOD (b)' ,'HELP' ,3'' ' ,

& 'FRENCH METHOD','ANGLOSAXON METHOD','HELP',6*' ' ~ & 'POLAR ASPECT','OBLIQUE ASPECT','HELP', 'POLAR ASPECT',

& 'OBLIQUE ASPECT','HELP' / DATA PARSTR / 'Latitude o f Center of the Map

&

& & & & &

&

& &

& & & &

&

& &

& &

DATA STRING /' & Key to Abort. NW(1) - WNUM N w ( 2 ) - 2 SR(2) - IROW + 1 Sc(2) - ICI ER(2) - IROW + 13 EC(2} - ICI + 59 ABORT - .FALSE.

I0 HLP m .FALSE. IF (.NOT.FLAG) THEN

INDPRJ - 0

II

'Longitude of Center of the Map 'Latitude of First Point of Central Line 'Longitude of First Point of Central Line 'Latitude of Second Point of Central Line 'Longitude of Second Point of Central Line 'Standard Parallel

'Standard Parallel (i) 'Standard Parallel (2)

'Central Meridian 'Angle Of Azimuth of Central Line

'Reduction Scale Factor 'False Easting 'False Northing

'Central Meridian computed by UTM Zone in Data Input

'Reduction Scale Factor : 0.9996 'False Eastlng : 500000, 'False Northing : 0. North or I0000000. South Emisphece', ' ','Note: Positive UTN Zone means North Emisphere' ,

' Negative UTM Zone means South Emishpere' / Press Any Key To Continue. Press ESC

WRITE(STRHLP,' (80AI)' ~ (WINDOW(NW(1),IROW,J},J=ICOL,ICOL+I7)

DO II I~I,MAXPRJ IF (STRHLP.EQ.PRJSTR(I)) INDPRJ - I

IF (INDPRJ.EQ.0} THEN CALL ERRMSG(7,ICODE)

1 2 6 1 2 7 1 2 8 1 2 9 1 3 0 1 3 1 1 3 2 1 3 3 1 3 4 1 3 5 1 3 6 1 3 7 1 3 8 1 3 9 1 4 0 1 4 1 1 4 2 1 4 3 1 4 4 1 4 5 1 4 6 1 4 7 1 4 8 1 4 9 1 5 0 1 5 1 1 5 2 1 5 3 1 5 4 1 5 5 1 5 6 1 5 7 1 5 8 1 5 9 1 6 0 1 6 1 1 6 2 1 6 3 1 6 4 1 6 5 1 6 6 1 6 7 1 6 8 1 6 9 1 7 0 1 7 1 1 7 2 1 7 3 1 7 4 1 7 5 1 7 6 1 7 7 1 7 8 1 7 9 1 8 0 1 8 1 1 8 2 1 8 3 1 8 4 1 8 5 1 8 6 1 8 7 l S 8 1 8 9 1 9 0 1 9 1 1 9 2 1 9 3 1 9 4 1 9 5 1 9 6 1 9 7 1 9 8 1 9 9 2 0 0 2 0 1

D a t u m shift a n d c o n v e r s i o n o f g e o g r a p h i c a l c o o r d i n a t e s

1 2

1 9

18

2O

2 1

HALT m .TRUE. RETURN

ENDIF ELSE

CALL VTNENU (MAXPRJ+I,I,PRJSTR,IROW,STEPL,ICOL,STEPC,INDPRJ, & ABORT,0,0,0,0,0.) ENDZF IF (ABORT) THEN

CALL OPENW(NW(1),.FALSE. ) RETURN

ENDIF IF (INDPRJ.EQ.MAXPRJ+I)

& CALL HLPSUB(RECHLP(6),I,NW,SR,SC,ER,EC,HLP) IF (HLP) GO TO I0 KPRJ m INDPRJ IF (INDPRJ.EQ.I) KPRJ-2 IF (INDPRJ.EQ.2) KPRJ=I CALL OPENW (NW(2),.TRUE.) CALL VTCSET(SR(2),SC(2)) CALL VTGRID(ER(2),EC(2),I,SR(2)+2,SC(2),EC(2),0,0,0,0) IF (.NOT.FLAG) THEN

DO 1 2 I m S R ( 2 ) , E R ( 2 ) R E A D ( I L O G , ' ( 8 0 A I ) ' , E N D - l g ) ( W I N D O W ( N W ( 2 ) , I , J ) , J m S C ( 2 ) , E C ( 2 ) )

GOTO 1 8 HALT m , T R U E , CALL ERRMSG(34,ICODE) RETURN CALL RESTOW(NW(2),SR(2),SC(2),ER(2),EC(2),.TRUE.) CALL WAIT (I.0)

ELSE LENSTR m LENGTH(PRJSIZ(KPRJ),255) IF (LEFT) THEN

CALL VTCSEF(SR(2)+I,EC(2)-(LENSTR÷3)) E L S E

CALL VTCSET(SR(2)+I,SC(2)+2) ENDIF WRITE(STRHLP,'(A25)') PRJSIZ(KPRJ) CALL VTWRIT('('//STRHLP(I:LENSTR)//' }',LENSTR+2)

ENDIF INDTYP m 1 IF (TYPPRJ(KPRJ).GT.I) THEN

IF (LEFT) THEN J J m S C ( 2 ) + 2

ELSE J J m E C ( 2 ) - 1 8

ENDIF HLP m .FALSE. IF (.NOT.FLAG) THEN

INDTYP m 0 WRITE(STRHLP,'(80AI)') (WINDOW(2,SR(2)+I,J),JmJJ,JJ÷I6) DO 21 I m I,TYPPRJ(KPRJ)

IF (STRHLP.EQ.PRJTYP(I,KPRJ)) INDTYP - I IF (INDTYP.EQ.0) THEN

CALL ERRMSG(8,ICODE) HALT m .TRUE. RETURN

ENDIF ELSE

CALL VTMENU (3,I,PRJTYP(I,KPRJ),SR(2)+I,STEPL,JJ,STEPC, & INDTYP,ABORT,0,0,0,0,0.)

ENDIF IF (ABORT) THEN

CALL RESTOW(NW(1),SR(2),SC(2),ER(2),EC(2),.FALSE.) CALL OPENW(NW(1),.FALSE.) GOTO I 0

ENDIF IF INDTYP.EQ.3)CALL HLPSUB(RECHLP(7),2,NW,SR,SC,ER,EC,HLP) IF HLP) GO TO 20 IF KPRJ.EQ.2) INDUTM m INDTYP IF KPRJ.BQ.3) INDOBM m INDTYP IF KPRJ.EQ.5) INDLAM m INDTYP IF KPRJ.EQ.8) INDSTR m INDTYP IF (KPRJ.EQ.9) INDLAZ m INDTYP

ENDIF INDX m 1 DO 2 2 1 m 1 , 1 4

499

500

202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 25"7 258 259 260 261 262 263 264 265 266 267 268 26g 270 271 272 2"/3 274 275 276 277

M. LIG~ and G I~)RI 'oLLZZI

22 WY(I) - 0.0 WY(12) - 1.0D0

IF (KPRJ.EQ.8.AND.INDSTR.EQ.I WY(7) - 900000.0D0 IF (KPRJ.EQ.9.AND.INDLAZ.EQ.I WY(1) - 900000.0D0 ERROR = .FALSE. NL = PARCNT(I,INDTYP,KPRJ)

30 IF (.NOT.FLAG) THEN DO 31 I=I,NL

31 WRITE(STRTXT(1), ' (80AI) ;

& (WINDOW(2,SR(2)+3+I,J) ,J=EC(2)-14,EC(/)-2) ELSE

DO 32 I=I,NL

KK - PARCNT(I+I,INDTYP,KPRJ} CALL VTCSET(I+SR(2)+3,SC(2)+2)

32 CALL VTWRIT(PARSTR(KK),LENGTH(PARSTR(KK},54) ) IF (KPRJ.EQ.2.AND.INDUTM.EQ.I) THEN

CALL VTATTR(I,0,1,0,0,0) CALL VTCSET(24,1)

CALL VTWRIT(STRING,79) CALL VTATTR(0,0,0,0,0,0)

CALL VTGETC(ICODE) IF (ICODE.EQ.27) ABORT = .TRUE.

ELSE IF (.NOT.ERROR) THEN

DO 33 I=I,NL 33 WRITE(STRTXT(I), ' (F13.4)") WY(FARCNT{ I+I,INDTYP,KPRJ) )

ENDIF 34 CALL VTMENR (INDX,LENTXT,NL,I,SR(2)+4,STEPC,EC(2)-I4,STEPC

& ,STRTXT,HLP,ABORT) IF (HLP) CALL HLPSUB(RECHLP(8) ,2,NW,SR,SC,ER,EC,HLP) IF (HLP) GOTO 34

ENDIF ENDIF

IF (ABORT.AND.TYPPRJ(KPRJ).GT.I) THEN

CALL VTCSET(SR(2)+4,SC(2)+I) CALL VTEARE(ER(2)-I,EC(2)-I) GOTO 20

ELSE IF (ABORT.AND.TYPPRJ(KPRJ) .EQ,I) THEN

CALL RESTOW(NW(1),SR(2)oSC(2),ER(2),EC(2),.FALSE. ) CALL OPENW(NW(1), .FALSE. ) GOTO l0

ENDIF ERROR - .FALSE.

IF (KPRJ.EQ.2.AND.INDUTM.EQ.I) THEN CL0 - 0.0P0 K0 - 0.99960D0

CE0 ~ 500000.0D0 CN0 - 0.0D0

ELSE

DO 36 I-I,NL CALL GETFMT(STRTXT(I),FMT)

READ(STRTXT(I),FMT,ERR~35) WY(PARCNT(I+I,INDTYP,KPRJ)) GOTO 36

35 ERROR - .TRUE. INDX - I

36 CONTINUE IF (.NOT.ERROR) THEN

DO 37 I-I,NL

IPCNT ~ PARCNT I+i,INDTYP,KPRJ) IF IPCNT.EQ.I CF0sDMSD60(WY(I "DTOR IF IPCNT.EQ.2 CL0-DMSD60(WY(2 *DTOR IF IPCNT.EQ.5 CFI-DMSD60[WY(3 *DTOR IF IRCNT.EQ.4 CLIsDMSD60(WY(4 °DTOR IF IPCNT.EQ.5 CF2~DMSD60(WY(5 *DTOR IF IPCNT.EQ.6 CL2-DMSD60(WY(6 *DTOR IF IPCNT.EQ.7 CF0~DMSD60(WY(7 *DTOR

IPCNT.EQ.8 CFI-DMSD60(WY(8 *DTOR IPCNT.EQ.9 CF2~DMSD60(WY(9 *DTOR

IPCNT.EQ.10) CL0-DMSD60(WY(10))*DTOR IPCNT.EQ.II) OMAZIM-DMSD60(WY(II) )'DTOR IPCNT.EQ.12) K0 - Wy(12) IPCNT.EQ.13) CE0 - Wy(13)

37 IPCNT.EQ.14) CN0 u WY(14)

IF IF IF IF IF IF IF

ENDIF

ENDIF

IF (KPRJ.EQ.3.AND.INDOBM.EQ.2) CLI m CL0

Datum shift and conversion of geographical coordinates

2 7 8 C F S U P m N A L F P I + E P S I 279 C L S U P m P I G R E C + E P S I 280 IF ( (DABS(CFO).GE.CFSUP.OR.DABS(CFI).GE.CFSUP.OR. 2 8 1 & DABS(CF2).GE.CFSUP) . O R . (DABS(CL0).GE.CLSUP.OR. 2 8 2 & DABS(CLI).GE.CLSUP.OR.DABS(CL2).GZ.CLSUP) ) ERROR-.TRUE. 283 IF (KPRJ.EQ.I) THEN 2 8 4 I F (DABS(CF0).GE. (HALFPI-EPSI)) ERROR : .TRUE. 285 ELSE IF (KPRJ.EQ.3) THEN 286 IF (INDOBM.EQ.I) THEN 287 I F (CFI.EQ.0.D0.OR.CFI.EQ.CF2.OR.DABS(CF0).GE.HALFPI.OR. 2 8 8 & DABS(CFI).GE.HALFPI.OR.DABS(CF2).GE.HALFPI) ERROR=.TRUE. 2 8 9 ELSE 2 9 0 IF (CF0.EQ.0.0D0.OR.DABS(CF0).GE.HALFPI.OR. (DABS(OMAZIM).GT. 2 9 1 & (HALFPI-EPSI).AND.DABS(OMAZIMJ.LT.(HALFPI+EPSI)).OR. 292 & (DABS(OMAZIM).GT.(PIGREC+HALFPI-EPSI).AND. 2 9 3 & DABS(OMAZIM).LT.(PIGREC+HALFPI+EPSI)) ) ERROR=.TRUE. 2 9 4 E N D I F 295 ELSE IF ((KPRJ.EQ.5.AND.INDLAM.EQ.2).OR.KPRJ.EQ.6) THEN 296 IF ((DSIGN(I.D0,CFI).NE.DSIGN(I.D0,CF2)) .OR. (CF0.NE.0.D0 297 & .AND.DSIGN(I.D0,CF0).NE.DSIGN(I.D0,CFI)) ) ERROR m .TRUE. 2 9 8 ELSE IF (KPRJ.EQ.9.AND.INDLAZ.EQ.1) THEN 299 IF (DABS(CF0).LT.(HALFPI-EPSI)) ERROR m .TRUE. 3 0 0 ENDIF 301 IF (ERROR.AND.(.NOT.FLAG)) THEN 3 0 2 CALL ERRMSG(9,ICODE) 3 0 3 HALT m .TRUE. 3 0 4 RETURN 305 ELSE IF tERROR.AND.FLAG) THEN 306 CALL ERRMSG(10,ICODE) 307 GOTO 30 3 0 8 ELSE IF (FLAG) THEN 3 0 9 CALL RESTOW(NW(1),SR(2),SC(2),ER(2),EC(2),.FALSE. ) 3 1 0 CALL OPENW(NW(1),.FALSE. ) 3 1 1 E N D I F 312 RETURN 3 1 3 END

I C n m e a e 2 S U B R O U T I N E PUTSHF (NUMP,DX,DY,DZ,DSDX,DSDY,DSDZ) 3 IMPLICIT DOUBLE PRECISION (A-H,O-Z) 4 REAL*8 D ( 3 ) , D S ( 3 ) 5 CHARACTER S T R H L P * 8 0 6 D ( I ) m DX 7 D ( 2 ) m DY 8 D ( 3 ) - DZ 9 D S ( 1 ) m DSDX

10 11 12 13 14 15 16 17 10 19 2O 21 22 23 24 25 26 2'7 28 29 3O 31

D S ( 2 ) - DSDY D S ( 3 ) m DSDZ I F ( N U M P . N E . 0 ) THEN

IROW m 6 CALL VTCSET(5,54) WRITE (STRHLP,'(15)') NUMP CALL VTWRIT(STRHLP,5)

ELSE IROW m 5

ENDIF DO I Iml,3 CALL VTCSET(IROW+I,25)

IF ( N U M P . N E . 0 ) THEN WRITE (STRHLP,'(FI2.3,A,FI2.3)') D(I),

& ' Standard Deviation: ',DS(I) ELSE

WRITE (STRHLP,'(F12.3)') D ( I ) ENDIF CALL VTWRIT(STRHLP,49)

I CONTINUE RETURN END

2 3 4 S 6

4 7 48 49

S U B R O U T I N E S T A R T D ( P R G S T R , P R G T X T , H A L T , F L A G ) CHARACTER P R G S T R * ( t ) , P R G T X T ( 1 ) ° ( * ) , T E X T ( 4 ) t 1 9 I N T E G E R S T E P L ( 4 ) , S T E P C ( 4 ) L O G I C A L H A L T , F L A G , H L P , A B O R T I N C L U D E ' D T C O M M O N . F O R ' DATA T E X T / ' I N T E R A C T I V E S E S S I O N ' , ' L O G S E S S I O N ' , ' E X I T ' , ' H E L P ' / DATA S T E P L , S T E P C / 4 * 0 , 4 " 1 / HALT m .FALSE.

501

502 M. LJoK and G. BORTOLIdZZI

58 59 6O 61 62 63 64 65 66

1 67 68

50 FLAG - .TRUE. 51 CALL MSKINI (PRGSTR,PRGTXT) 52 1 CALL VTMENU(4,I,TEXT,I,STEPL,61,STEPC,INDEX,ABORT,O,O 0,0,0. 1 53 IF (ABORT) THEN 54 HALT - .TRUE. 55 RETURN 56 ENDIF 57 HLP - .FALSE.

IF (INDEX.EQ.2) THEN FLAG - .FALSE.

ELSE IF (INDEX.EQ.3) THEN HALT m .TRUE.

ELSE IF (INDEX,EQ.4) THEN NLP = .TRUE, CALL HELP IF (IOSHLP.EQ.0) CALL MSKINI (PRGSTR,PRGTXT)

ENDIF I F (HLP) GOTO I RETURN

69 END IC-ww-- 2 SUBROUTINE ERRMSG (NUMERR,ICODE) 3 PARAMETER (MAXERR-47) 4 CHARACTER*80 STRERR(MAXERR) 5 INCLUDE 'ANSICOMM.FOR'

23 DATA STRERR / ' Error in Log File: Command not Available If', E 24 trror in Log File: Required Datum not Available II',' Error in val 25 &us of Semi-major Axis or Reciprocal Flattening 11',' Error in Log 26 ~ File: Shift Command not Available El',' Error in Log File: Regu 27 &ired New Datum not Available If',' Error in value of Semi-major A 28 &xis or Reciprocal Flattening or in shift param. If' , Error i 29 an Log File: Required Projection not Available If',' Error in Log 30 &File: Projection Size not Available II',' Error in Log File: Mist 31 taken Projection Parameters If',' Error in Values of Projection Pa 32 Lrameters I[',' Error in Log File: File not Found It',' File Not 33 tFound II'," Error in Log File: Coordinate Type Not Available II', 34 t ' Error in Log File: Geographical Type Not Available II' ,' Err 35 tar in Log File: Mistaken Variable Position 1 1 ' , ' Variable Fields 36 &Overlap I I',' Error in Log File: Mistaken Number of Polygonal Ver 37 ttexesIl',' Error in Data Input I I',' Latitude or Longitude are O 38 rut of Permitted Range I I',' No Tresformetion Required I I',' Prep 39 &aretlon of Polygon: No Interval were Constructed II' ' Preparatlo 40 &n of Polygon: Less than Two or odd segments If',' Least Square Pr 41 tocedura: Error in DECAMP Routine I I',' Least Square Procedure: Ca 42 &nnot Converge l I',' Frees any Key to Continue or (ESC) Key to 43 & Repeat Input',' Press (RETURN> Key to Continue or any Key to Ou 44 &it',' Press any Key to Continue' , ' Fatal error in map frame I ! ' 45 t,' Error: Minimum greater then Maximum Latitude or Longitude I 1 ' , 46 t ' Error: Plottable Space requires Longitude Range less then 180 47 &Degrees I I', ' Error: Map Latitudes and/or Standard Parallels must 48 & be in the same Emisphere II' ,' Error: Scale Map cannot be Zero 49 & i I',' Error: Value Out of Permitted Range If' , ' Error in Log F 50 ~ile: End of File During Read I!',' Error in Log File: Metafile Op 51 &tion not Available ~I',' Error in Log File: Line Type Option not 52 &Available If',' Press any Key to STOP Program',' Error in Format 53 & I I ',' Error in Log File: Variable Position not Allowed i t ', 54 ~ ' Error: Control Points Data File "PTI,BIN" not Found !l',' Err 55 &or in Log File: Spatial Analysis File Type not Available',' Error ~6 t in Log File: Marker Type Option not Available I I ' ' Error in Log 57 ~ File: Selected Variable not Available if',' Error in Log File: T 58 text Position not Available II',' Error in Log File: Number of Gri 59 &d not Available I',' Error in Log File: Fill Area Interior Style 60 & not Available ! ', ' GKS Error, see "GKS.ERR" ~ ~ ' / 61C .... 62 ITEMP ~ WNUM 63 CALL CLOSEW 64 CALL VTBELL(1) 65 CALL VTCSET(24,1 66 CALL VTATTR(I,0,1,0,0,0) 67 CALL VTWRIT(STRERR(NUMERR},LEN(STRERR(NUMERR) )) 68 CALL VTATTR(0,0,0,0,0,0) 69 CALL VTGETC(ICODE) 70 CALL OPENW (ITEMP,.FALSE.) 71 RETURN 72 END

1 C . . . . . . . . .

Datum sh i f t and conversion of geographical coordinates 503

C 2C ANSILIB U t i l i t y - LIBrary - Terminal Management Library C 3C C 4C Language : FORTRAN 77 MICROSOFT RELEASE 4.0 and C 5C FORTRAN VAX-VMS C 6C Operative System : MS-DOS 8nd VAX-VMS C 7C C

SC For MS-DOS the Library is made up by ANSILIB.OBJ+INT21.OBJ 9C ........

C .C

10C

llC ..... Comment out the appropriate pieces of code for proper intallatlon 12C 13cSLARGE 1 4 C = = = = = 15 SUBROUTINE VTATTR (REVERS,BLINK,BOLD,UNDERL,FORECO,BACKCO} 16 INTEGER REVERS,BLINK,BOLD,UNDERL,FORECO,BACKCO 17 CHARACTER STROUT(B0)*I, STRTMP*2, STRHLP*80 18C It Turn ON or OFF the character Attributes : 19C ~ REVERS - 0 Off ~ BLINK - 0 Off ~ BOLD - 0 Off ~ UNDERL - 0 Off [ 2 o c I = I o n I = 1 o n I - 1 o n I = I o n I 21C ..... RSDOS Version 22C FORECO = 0 Default 23C = I Black 24C = 2 Red 25C = 3 Green 26C = 4 Y e l l o w 27C = 5 B l u e

F o r e g r o u n d F o r e g r o u n d F o r e g r o u n d F o r e g r o u n d F o r e g r o u n d

28C 29C 30C 31 32 33 34 35 36 37 38 3% 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

= 6 M a g e n t a F o r e g r o u n d = 7 C y e n F o r e g r o u n d = 8 W h i t e F o r e g r o u n d

S T R O U T ( 1 ) = C H A R ( 2 7 ) STROUT(2)=CHAR(91) STROUT(3)-CHAR(48) LAST ~ 4 IF (REVERS.EQ.I) THEN

STROUT(LAST}-CHAR(59) STROUT(LAST÷I)=CHAR(55} LAST-LAST÷2

ENDIF IF (BLINK.EQ.I) THEN

STROUT(LAST}-CHAR(59) STROUT(LAST÷I)=CHAR(53) LASTmLAST÷2

ENDIF IF (BOLD.EO.I) THEN

STROUT(LAST)-CHAR(59} STROUT(LAST+I)-CHAR(49) LAST~LAST+2

ENDIF IF (UNDERL.EQ.I} THEN

BTROUT(LAST)-CHAR(59) STROUT(LAST+I)-CHAR{52) LASTaLABT÷2

ENDIF 55C*****MS-DOS 56c 57C 58c 59c 60c 61c 62c 63c 64c 65C 66c 67c 6Bc 69c 70C*'''" 71 72 73 74 75

IF (FORECO.NE.0) THEN IVALUE = FORECO + 29 WRITE(STRTMP,'(12)') IVALUE READ(STRTMP,'(2AI) ° ) STROUT(LAST+I),STROUT(LAST+2) STROUT(LAST)-CHAR(59) LASTmLAST+3

ENDIF IF (BACKCO.NE.0} THEN

IVALUE - BACKCO + 39 WRITE(STRTMP,'(I2}' ) IVALUE READ(STRTMP,'(2AI)' ) STROUT(LAST+I},STROUT(LAST+2) STROUT{LAST)mCHAR(59) LAST~LAST÷3

ENDIF

STROUT(LAST)-CHAR(109} WRITE(STRHLP,' (80Al),) {STROUT(1),I-I,LAST) CALL VTWRIT (STRHLP,LAST) RETURN END

BACKCO - 0 D e f a u l t = 1 B l a c k B a c k g r o u n d

2 R e d B a c k g r o u n d = 3 G r e o n B a c k g r o u n d u 4 Y e l l o w B a c k g r o u n d = 5 B l u e B a c k g r o u n d = 6 M a g e n t a B a c k g r o u n d - 7 C y e n B a c k g r a u n d - 8 W h i t e B a c k g r o u n d

504 M. LIGZ and G. BORTOLUZZI

ICulmm~ 2 S U B R O U T I N E V T B E L L (NUN) 3 IF ( N U M . L E . 0 ) Num m 1 4 DO I I-I,NUM 5 1 CALL VTWRIT(CHAR(7),I)

6 RETURN 7 ~ND

2 SUBROUTINE VTCHTM (NUM) 3C It Moves the alphanumeric cursor along a line by Num chacscters

4 CHARACTER STROUT*5, STRHLP*2 , STR(5)*I

5 I = IABS(NUM) 6 IF (I.LT.I) I=l 7 IF (I.GT.79} I=79

8 STR(1)nCHAR(27) 9 S T R ( 2 ) = C H A R ( 9 1 )

I0 WRITE(STRHLP,'(I2)') I 11 IF (I.GE.10) THEN

12 LASTs5 13 READ(STRHLP,' (2AI)') (STR(J),J=3,4)

14 ELSE 15 LASTm4 16 READ(STRHLP,' (1X,AI)') STR(3)

17 ENDIF 18 IF (NUM.GT.0) THEN 19 STR(LAST)m'C' 20 ELSE 21 STR(LAST)m'D' 22 ENDIF 23 WRITE(STROUT, ' (5AI)') (STR(J},J~I,LAST)

24 CALL VTWRIT (STROUT,LAST)

25 RETURN 26 END

2 SUBROUTINE VTCRST 3C ..... It restores the cursor position and the Character attributes

4 CHARACTER*3 STROUT 5 WRITE(STROUT,' (3AI)') CHAR(27), ' [" . 'u"

6 CALL VTWRIT (STROUT,3) 7 RETURN 8 END

IC----- 2 SUBROUTINE VTCSAV 3C ..... It saves the cursor position and the Character attributes

4 CHARACTER*3 STROUT 5 WRITE(STROUT, ' (3Al)') CHAR(27),' {' ,'s' 6 CALL VTWRIT(STROUT,3)

7 RETURN 8 END

2 SUBROUTINE VTCSET ( IR,IC ) 3C ..... It MOVES the alphanumerlc cursor to the specified posltlon

4 CHARACTER STROUT~I0, STRHLP'3 , STR(10)*I

5c$INCLUDE: 'ANSICOMM.FOR' 6 INCLUDE 'ANSICOMM.FOR'

24 IROW - IR 25 ICOL 1 IC 26 CALL TESTRC {IROW,ICOL) 27 STR{I)lCHAR(27)

28 STR(2)'CHAR(gl) 29 WINCOL a ICOL 30 WINROW a IROW 31 WRITE(STRHLP,' (I3) ° ) IROW 32 IF (IROW.GE.10) THEN 33 LAST-5 34 READ(STRHLP,'(IX,2AI)') (STR(1),Im3,4)

35 ELSE 36 LASTm4 37 READ(STRHLP,' (2X,A1)') STR(3)

38 ENDIF 39 STR(LAST)~CHAR(59) 40 WRITE(STRHLP, ' (I3)') ICOL 41 IF (ICOL.OE.10) THEN 42 LASTILAST+2 43 READ(STRHLP, ' (IX,2AI)') (STR(I),IILAST-I,LAST)

44 ELSE

XVAX

Datum shift and conversion of geographical coordinates

45 LAST~LAST÷$ 46 READ(STRHLP,' (2X,AI)') STR(LAST) 47 ZNDIF 4 8 LAST-LAST+I 4 9 STR(LAST)-CHAR(72) 5 0 WRITE(STROUT,'(10AI)') (STR(I),I-I,LAST) 51 CALL VTWRIT (STROUT,LAST) 52 RETURN 53 END IC----- 2 SUBROUTINE VTCVTM (NUM) 3C ..... It Hovaa the alphanumeric cursor along a Column by Num Lines 4 CHARACTER STROUT*5, STRHLP'2 , STR(5)*I 5 I m IABS(NUM) 6 IF (I.LT.I) I=I 7 IF (I.GT.25) 1-25 B STR(1)mCHAR(27) 9 STR(2)-CHAR(gl)

l0 WRITE(STRHLP,'(I2)' ) I 1 1 I F (I.GE.10) THEN 1 2 LASTm5 1 3 READ(STRHLP,*(2AI)') (STR(J),J-3,4) 14 ELSE 15 LASTs4 16 READ(STRHLP,' (IX,A1)') STR(3) 17 ENDIF IB IF (NUN.GT.0) THEN 19 STR(LAST)m'B' 2 0 ELSE 21 STR(LAST)m'A' 22 ENDIF 23 WRITE(STROUT,'(SAI)') (STR(J),JmI,LAST) 24 CALL VTWRIT (STROUT,LAST) 25 RETURN 2 6 END

2 SUBROUTINE VTDOSP (TEXT,NUM) 3 CHARACTER TEXT*(*), STR(40)*I, STROUT*80 4 LENSTR m LEN(TEXT) 5 I F (NUM.LT.LENSTR) LENSTRnNUM 6 IF (LENSTR.GT.40) LENSTR m 4 0 7 READ(TEXT,* (40AI)') (STR(I),I-I,LENSTR) 8 WRITE(STROUT,'(80AI)' ) (STR(1),' ',I=I,LENSTR) 9 CALL VTATTR(0,0,1,0,2,0)

I0 CALL VTWRIT(STROUT,2*LENSTR) I I CALL VTATTR(0,0,0,0,0,0) 1 2 RETURN 13 END ICa--mm 2 SUBROUTINE VTELIN (IFLAG) 3C ..... It erases Line - If Iflag m 0 Entire Line 4C ) 0 From Cursor Position to End 5C ( 0 F r o m S t a r t t o C u r s o r P o s i t i o n 6 CHARACTER STROUT*80, BLANK*I 7c$INCLUDE:'ANSICOMM.FOR' 8 INCLUDE 'ANSICOMM.FOR'

26 DATA BLANK / ' ~ / 27 IF (IFLAG.LE.0) CALL VTCSET (WINROW,I) 28 IF (IFLAG.GE.0) THEN 2 9 WRITE(STROUT,*(AI,A)' ) CHAR(27),'|K' 30 N U M - ] 31 ELSE 32 WRITE(STROUT,'(80AI),) (BLANK,ImI,WINCOL) 33 NUMmWINCOL 34 ENDIF 35 CALL VTWRIT(STROUT,NUM) 36 RETURN 37 END ICa--m- 2 SUBROUTINE VTEARE (IROW,ICOL) 3C ..... It erases a ractangu~sr Area of Screen begin Cursor 4C Position to the specified position indicated by IROW, ICOL 5 CHARACTER STROUT*80, BLANK*I 6c$INCLUDE:'ANSICOMM.FOR, 7 INCLUDE 'ANSICOMM.FOR'

25 DATA BLANK / , , /

IVAX

IVAX

505

506 M, LIol and G. BORTOLUZZI

26 L - IROW

27 K - ICOL

28 CALL TESTRC[L,K)

29 IF (K.GE.WINCOL) THEN

]0 NUMC = K-WINCOL+I 31 K - WINCOL

32 ELSE

33 NUMC = WINCOL-K+I

34 ENDIF

35 WRITE(STROUT, ' (80Al)') (BLANK,I=1,89 ~ 36 IF (L.LT.WINROW) THEN

37 DO I I=WINROW,L,-I

38 CALL VTCSET(I,K)

39 I CALL VTWRIT(STROUT,NUMC) 40 ELSE

41 DO 2 I=WINROW,L

42 CALL VTCSET(I,K)

43 2 CALL VTWRIT(STROUT,NUMC) 44 ENDIF

45 CALL VTCSET (WINROW,WINCOL)

46 RETURN 47 END

IC=====

2 SUBROUTINE VTESCR (IFLAG)

3C . . . . . I t e r a s e s t h e S c r e e n - I f I f l a g = 0 E n t i r e S c r e e n

4C > 0 From Cursor Position to End

5C < 0 From Start to Cursor Position 4 C H A R A C T E R * 4 STROUT

7c$INCLUDE:'ANSICOMM.FOR'

8 INCLUDE 'ANSICOMM.FOR' IVAX

2~ WRITE(STROUT,' (AI,A)') CHAR(27), ' I2J ~

27 IF (IFLAG.NE.0) THEN

28 IF (IFLAG.LT.0) THEN

29 DO 1 I=I,WINROW-I

30 CALL VTCSET (I,l)

31 l CALL VTELIN (0)

32 CALL VTCSET (WINROW,WINCOL)

33 CALL VTELIN ( - 1 )

34 ELSE

]5 CALL VTELIN ( 1 ) 36 DO 2 I-WINROW+Z,25

37 CALL VTCSET(I,I)

38 2 CALL VTELIN (0)

39 ENDIF

40 ELSE

41 CALL VTWRIT (STROUT,4)

42 ENDIF

43 RETURN

44 END

IC~----

2 SUBROUTINE VTMENU(NL,NC,TEXT,STARTL,STEPL,STARTC,STEPC,INDEX,

3 & ABORT,WFIELD,WLIN,WROWoWCOL,WARRAY)

4C...Input Parameters:

5C NL - Number of fleld~ for column (number of l~n~}

6C NC - Number of fields for llnes (number of columns) 7C TEXT(NL,NC) 1 array containing strlngs for each field

8C STARTL 1 Starting line of Menu

9C STEPL(NL,NC) - step (expressed in number of lines) to e~tablish lOC t h e vertical distance among menu f ~ e l d ~ l l C STARTC - S t a r t co lumn o f Menu 12C STEPC - step ( e x p r e s s e d in number of columns) to extabllsh 13C the horizontel distance among menu f~elds

14C...Output: 15C INDEX - Number of s e l e c t e d f~eld

16C ABORT - Abort Menu 17 IMPLICIT INTEGER (A-Z)

18 CHARACTER TEXT(l)*[*), STRING*79. WARR~24,24 !*12 19 REAL*4 WARRAY(1) 20 INTEGER STEPL(1),STEPC(1)

21 LOGICAL POSEND,GOODK,ABORT 22c$INCLUDE: 'ANSICOMM.FOR' 23 INCLUDE 'ANSICOMM.FOR' IVAX

41 DATA STRING /' Use Arrows to HlghLlght deslred Sectlon Press ENT 42 &ER to Select. ESC to Abort / 43 POSEND - .FALSE. 44 ABORT m .FALSE.

Datum slut't and conversionof f~'ographical coordinates

4 5 I n ( I N D E X . L T . 1 . O R . Z N D E X . G T . N L * N C ) INDEX • 1 46 I N D E E F m I N D E X 47 COLBEF m I N T ( I N D B E F / N L ) 40 I F ( M O D ( I N D B E F , N L ) . N E . 0 ) C O L B E F - C O L B E F ÷ I 49 ROWEEF n I N D B E F - N L * ( C O L B E F - 1 ) 50 DO I I u 1 , N L 51 DO 1 J = 1 , N C 52 IND = N L * ( J - 1 ) + I

53 CALL POS ( I , J , S T A R T L , S T A R T C , S T E P L , S T E P C , P O S R O W , P O S C O L ) 54 CALL V T C S E T ( P O S R O W , P O S C O L ) 55 CALL V T W R I T ( T E X T ( I N D ) , L E N ( T E X T ( I N D ) ~ ) 56 2 C O N T I N U E 57 CALL V T A T T R ( I , 0 , 1 , 0 , 0 , 0 ) 58 CALL V T C S E T ( 2 4 ° l ) 59 CALL VTWRIT(STRINO,79) 60 CALL POS(ROWBEF,COLBEF,STARTL,STARTC,STEPLoSTEPC,POIROW,POSCOL) 61 CALL VTCSET(POSROW,POSCOL) 62 CALL VTWRIT(TEXT(INDBEF),LEN(TEXT(INDBEF)~ 63 CALL VTATTR (0,0,0,0,0,0) 64 IF (WFIELD.NE.0) THEN 65 DO 2 I-I,NL 66 DO 2 JuI,WFIELD 67 INDlmWLIN*(J-I)÷I 68 WARR(I,J) . ' 69 WRITE (WARR(I,J),' (FII.2)') WARRAY(INDI ~ 70 2 CONTINUE 71 DO 3 JmI,WFIELD 72 CALL VTCSET(WROW-I+J,WCOL) 73 CALL VTWRIT(WARR(I,J),LEN(WAR~qI.J' '' 74 3 CONTINUE 75 ENDI? 76 CALL VTCSET(POSROW,POSCOL-I) 77 ROW m ROWBEF 78 COL m COLBEF 79 10 CALL VTOETC (COD) 80 CALL ARROWN (COD,NL,NC,ROW,COL,GOODK) 81 I r (OOODK) THEN 82 INDEX m NL*(COL-I)+ROW 83 CALL MENREV (TEXT,ROW,COL,INDEX,STARTLoSTARTC, 84 i STEPL,STEPC , 0) 85 I F (WFIELD.NE.0) THEN 86 CALL VTATTR(0,0,0,0,0,0) 87 DO 4 JnI,WFIELD 88 CALL VTCBET(WROW-I+J,WCOL) 89 CALL VTWRIT(WARR(INDEX,J),LEN(WARR(INDEX,J))) 90 4 CONTINUE 91 ENDIF 92 CALL POD (ROWBEF,COLBEF,STARTL,STARTC,STEPL,STEPC,JR,JC) 93 CALL VTCSET(JR,JC-I) 94 ELSE 95 IF ( COD.EQ.13 ) THEN 96 POSEND m .TRUE. 97 ELSE IF ( COD.EQ.27 ) THEN 98 POSEND o .TRUE. 99 ABORT ~ .TRUE.

' 1 0 0 E L S E I01 CALL VTBELL(1) 1 0 2 ENDIF 1 0 3 ENDIr 204 IF (.NOT.POSEND) GOTO I0 205 CALL V T A T T R ( 0 , 0 , 0 , 0 , 0 , 0 ) 1 0 6 CALL POD (ROWBEF,COLBEFpSTARTL,STARTC,STEPL,STEPC,PR,PC) 1 0 7 CALL VTCSET(PR,PC) 108 CALL VTWRIT(TEXT(INDEX),LEN(TEXT(INDEX))) 1 0 9 RETURN l l 0 END

1C=---m 2 SUBROUTINE VTMENR (FIELD,LZNTXT,NL,NC,STARTL,STEPL,STARTC, 3 & STEPC,TZXT,HELP,ABORT) 4 C . . . I n p u t P a r a m e t e r s : 5C WIELD u Starting READ field 6C LENTXT - a r r a y c o n t a i n i n g n u m b e r o f c h a r a c t e r s f o r ?C e a c h i n p u t s t r i n g 8C NL ~ N u m b e r o f f i e l d s p e r c o l u m n ( n u m b e r o f l i n e s ) 9C N C - N u m b e r o f f i e l d a p e r l i n e ( n u m b e r o f c o l u m n s )

10C ITARTL m Start llne of Menu

CAGEO 25:4-E

.~08 M . LIG! and G. BORTO-UZ~

lIE STEPL(NL,NC) 12C

13C STARTC ~4C STEPC 15C I6C...Output: 27C TEXT(NL,NC) I S C HELP 19C ABORT 20C . . . . .

- s t o p ( e x p r e s s e d a s number of lines~ to exteblish the vertical distance among menu fields

- Start column of Menu

stop (expressed as number of columns) to extablilh the horizontal distance among menu fields

= array containing the strings read in each field = Logical to Request HELP - Abort Menu

21 IMPLICIT INTEGER (A-Z) 22 CHARACTER TEXT(I)*(*), STRING*79, STRHLP(80~'! 23 INTEGER STEPL(1).STEPC(1),LENTXT(1) 24 LOGICAL POSEND,HELP,GOODK,ABORT 25c$INCLUDE:'ANSICOMM.FOR' 26 INCLUDE 'ANSICOMM.FOR' [VAX

44 DATA STRING /' Use Arrow Keys to Move Cursor, FI to Complete INPUT 45 &, ESC to Abort, ~?> HELP ' / 46 H E L P - .FALSE. 47 POSEND - .FALSE. 48 ABORT - .FALSE.

49 IF (FIELD.LT.I.OR.FIELD.GT.NL*NC) FIELD - l 50 INDBEF m FIELD 51 COLBEF m INDBEF/NL 52 IF (MOD(INDBEF,NL).NE.0) COLBEF " COLBEF + i 53 ROWBEF - INDBEF - NL*(COLBEF-I) 54 DO I I-I,NL 55 DO I Sml,NC

56 IND l NL*(J-I) + I

57 CALL POS (I,J,STARTL,STARTC,STEPL,STEPC,POSROW,POSCOL) 58 CALL VTCSET(POSROW,POSCOL)

59 CALL VTWRIT(TEXT(IND),LENTXT(IND)) 60 1 CONTINUE 61 CALL VTATTR(I,0,1,0,0,0} 62 CALL VTCSET(24,1)

63 CALL VTWRIT(STRING,79) 64 CALL POS (ROWBEF,COLBEF,STARTL,STARTC,STEPL,STEPC,POSROW,POSCOL) 65 CALL VTCSET(POSROW,POSCOL)

66 CALL VTWRIT(TEXT(INDBEF) oLENTXT(INDBEF)) 67 CALL VTCSET(POSROW,POSCOL) 68 INDEX - INDBEF 69 ROW ~ ROWBEF 70 COL s COLBEF

71 20 CALL POS (ROWBEF,COLBEF,STARTL,STARTC,STEPL,$TEPC,PR,PC~

72 CALL MREAD(TEXT(INDEX), LENTXT(INDEX), COD, PR,PC,KL)

73 CALL ARROWM (COD,NL,NC,ROW,COL,GOODK) 74 IF ( COD.EQ. 13) THEN 75 IF (KL.GT.0) THEN 76 DO 21 K-I,80

77 11 STRHLP(K) - ' ' 78 READ(TEXT(INDEX),'(80AI)' ) (STRHLP(K),K-I,KL~ 79 WRITE(TEXT(INDEX),'(80AI)') (STRHLP(K),KmI,LENTXT(INDEX)) 80 ENDIF

81 INDEX - INDEX + i

82 IF (INDEX.GT.NL*NC) THEN

83 POSEND -.TRUE. 84 INDEX m NL*NC 85 ELSE 86 GOODK - TRUE. 87 COL - INT(INDEX/NL) 88 IF (MOD(INDEX,NL).NE.0) COL - COL ÷ l 89 ROW m INDEX - NL*(COL-I) 90 ENDIF 91 ENDIF 92 IF (GOODK) THEN 93 INDEX - NL*(COL-I)+ROW 94 CALL MENREV (TEXT,ROW,COL,INDEX,STARTL,STARTC, 95 & STEPL,STEPC,LENTXT ) 96 ELSE 97 IF ( COD.EQ.-59 ) THEN 98 POSEND m .TRUE.

g9 ELSE IF ( COD.EQ. 63) THEN I00 POSEND • .TRUE. 101 H E L P m .TRUE. 1 0 2 ELSE IF ( COD.EQ. 2 7 ) THEN 103 POSEND - .TRUE.

Datum shift and conversion of geographical coordinates

1 0 4 ABORT m . T R U E . 1 0 5 E L S E 1 0 6 CALL V T B E L L ( 1 ) 1 0 7 E N D I F 1 0 8 E N D I F 1 0 9 I F ( . N O T . P O S E N D ) GOTO 10 1 1 0 CALL V T A T T R ( 0 , 0 , 0 , 0 , 0 , 0 ) 1 1 1 CALL POS ( ' R O W B E F , C O L B E F , S T A R T L ° S T A R T C o S T E P L , S T E P C , P O S R O W , P O S C O L ) 1 1 2 CALL V T C S E T ( P O S R O W , P O S C O L ) 1 1 3 CALL VTWRIT(TEXT(INDEX),LENTXT(INDEX)) 114 FIELD 8 INDEX 1 1 5 RETURN 1 1 6 END

1 C m m - - - 2 SUBROUTINE ARROWM (COD,NL,NC,ROW,COL,GOODK) ] C . . . . . I t m a n a g e s t h e a r r o w k e y s 11 4 IMPLICIT INTEGER (A-Z) 5 LOGICAL GOODK 6 GOODK m .TRUE. 7 IF ( COD.EQ.-72 ) THEN 8 ROW m ROW - 1 9 IF (ROW.LT.I) ROW m NL

I0 ELSE IF ( COD.EQ.-80 ) THEN 11 ROW m ROW + 1 12 IF (ROW.GT.NL) ROW m I 13 ELSE IF ( COD.EQ.-75 ) THEN 14 COL m COL - 1 15 IF (COL.LT.I) COL l NC 16 ELSE IF ( COD.EQ.-77 ) THEN 17 COL m COL + i 18 IF ( C O L . G T . N C ) COL m 1 19 ELSE 20 GOODK m .FALSE. 21 E N D I F 22 RETURN 23 END I¢----- 2 SUBROUTINE MENREV (TEXT,ROW,COL,INDEX,STARTL,STARTC,STEPL,STEPC, 3 & LENTXT ) 4 IMPLICIT INTEGER (A-Z) 5 CHARACTER*( t ) TEXT(1) 6 INTEGER STEPL(1),STEPC(1), LENTXT(1) 7¢$INCLUDE: *ANSICOMM.POR' 8 I N C L U D E 'ANSICOMM.FOR' IVAX

26 IF (LENTXT(1).EQ.0) THEN 27 LISTR m LEN (TEXT(INDBEF)) 28 L2STR m LEN (TEXT(INDEX)) 29 ELSE 30 LISTR m LENTXT (INDBEF) 31 L2STR m LENTXT (INDEX ) 32 ENDIF 33 CALL VTATTR (0,0,0,0,0,0) 34 CALL POS (ROWBEF,COLBEF,STARTL,STARTC,STEPL,STEPC,POSROW,POSCOL) 35 CALL VTCSET (POSROW,POgCOL) 36 CALL VTWR~T (TEXT(INDBEF),LISTR) 37 CALL VTATTR (1,0,1,0,0,0) 38 COLBEF m COL 39 ROWBEF m ROW 40 I N D B E F m INDEX 41 CALL POS (ROW,COL,STARTL,STARTC,STEPL,STZPC,POSROW,POSCOL) 42 CALL VTCSET (POSROW,POSCOL) 43 CALL VTWRIT (TEXT(INDEX),L2STR) 44 CALL VTCSET (POSROW,POSCOL) 45 RETURN 46 END

2 SUBROUTINE MREAD (STRING,LENGT,ZCODE,ROW,COL.K) 3 IMPLICIT INTEGER (A-Z) 4 CHARACTER*(*) STRING 5 LOGICAL AGAIN 6 K m 0 7 AGAIN m . T R U E . 8 1 CALL V T G E T C ( I C O D E ) 9 I F (ICODE.LT.32.OR.ICODE.EQ.63) THEN

10 AGAIN m .FALSE. 11 ELSE IF (ICODE.EQ.127) THEN

5[0 M. L~o~ and G. BOmTOLCZZ~

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

IF (K.LE.0) THEN

CALL VTBELL(1)

ELSE

K - K - i

CALL VTCSET(ROW,COL+K)

ENDIF

ELSE IF (ICODE.GE.32~ THEN

IF (K.LT.LENGT) THEN K - K + I

STRING(K:K) = CHAR(ICODE)

CALL VTWRIT(CHAR(ICODE),I)

E L S E

C A L L V T B E L L ( 1

ENDIF

ENDIF

IF (AGAIN) GOTO 1 CALL VTCSET(ROW,COL

RETURN

END

IC---,- 2 SUBROUTINE POS (INDR,INDC,STARTL,STARTC,STEPL,STEPC,

3 & POSROW,POSCOL 4 IMPLICIT INTEGER (A-Z) 5 INTEGER STEPC(1),STEPL(1) 6 POSCOL - STARTC 7 POSROW m STARTL

8 DO I K m 2,INDC

9 POSCOL - POSCOL + STEPC(K-I)

I0 I CONTINUE I! DO 2 K m 2,INDR

12 POSROW - POSROW + STEPL(K-I)

13 2 CONTINUE

14 R E T U R N

15 END

IC-----

2 FUNCTION LENGTH (STRING,LENSTR} 3 CHARACTER STRING*(*}, STRHLP(255}*I

4 MAXLEN o LEN (STRING}

5 IF (LENSTR.LT.MAXLEN} MAXLEN m LENSTR

6 READ(STRING,' (255AI)') (STRHLP(I),ImI,MAXLEN} 7 IBLANK • 0

8 DO 1 I - I,MAXLEN

9 IF (STRHLP(1).NE.' ' ) THEN

10 IBLANK m 0

11 ELSE

12 IBLANK m IBLANK + 1

13 ENDIF

X4 I CONTINUE

15 LENGTH w MAXLEN - IBLANK

16 RETURN

17 END

ICmmmmm 2 SUBROUTINE OPENW (NUMWIN,RESET)

3 IMPLICIT INTEGER (A-Z) 4 LOGICAL RESET

5c$INCLUDE: 'ANSICOMM.FOR' 6 INCLUDE 'ANSICOMM.FOR'

24 IF (NUMWIN.NE.0) THEN 25 IF (NUMWIN.LE.MAXWIN) THEN

26 WNUM • NUMWIN

27 ELSE

28 WNUM • MAXWIN

29 ENDIr

30 Ir (RESET} THEN

31 DO 1 I-i025 32 DO 1 J-l,80

33 1 WINDOW(WNUM,I,J) - ' '

34 ENDIF 35 ENDIF

36 RETURN 37 END

2 SUBROUTINE CLOSEW

3c$INCLODE: 'ANSICOMM.FOR' 4 INCLUDE *ANSICOMM.FOR'

22 WNUM - 0

23 RETURN

~VAX

[VAX

D a t u m shift a n d c o n v e r s i o n o f g e o g r a p h i c a l c o o r d i n a t e s

2 4 END I C a m e u u 2 S U B R O U T I N E RESTOW ( N U M W I N , S R , S C , E R , E C , T O P ) 3 IMPLICIT INTEGER (AoZ) 4 INTEGER SNOG(40),ENOG(40) 5 LOGICAL TOP 6c$INCLUDE:'ANSICOMM.FOR' 7 INCLUDE 'ANSICOM/q. FOR' IVAX

25 WTEMP m WNUM 2 6 WNUM m 0 27 STARTR m SR 28 STARTC - SC 2 9 ENDR m ER 30 ENDC m EC 3 1 CALL TESTRC (STARTR,STARTC) 32 CALL TESTRC (ENDR,ENDC) 3 3 IF ( T O P ) THEN 3 4 I N D I m STARTR 35 IND2 m ENDR 36 ISTEP m 1 37 ELSE 38 INDI m ENDR 3 9 IND2 m STARTR 40 ISTEP m -1 41 ENDIF 4 2 C a a * * * M S - D O S V e r s i o n 4 3 c DO 1 I m l N D I , I N D 2 , I S T E P 44C I CALL STREST(0,NUMWIN,I,STARTC,ENDC) 45C***** 46C ..... VAX VMS Version 47 DO 10 ImINDI,ZND2,1STEP 4 0 K - 1 4 9 DO I J - l , 4 0 50 S N O G ( 3 ) u 0 51 1 S M O G ( J ) -- ENDC 52 DO 2 JmSTARTC,ENDC 53 IF (WG(NUMWIN,I,J).EQ.0) THEN 54 IF (SNOG(K).EQ.0) SMOG(K) m 3 55 ELSE 56 IF (SNOG(K).NE.0) THEN 57 SMOG(K) m 3 - I 5 8 K m K + I 5 9 ENDIF 60 ENDIF 61 2 CONTINUE 62 IF (SNOG(K).EQ.0) K m K - 1 63 IF (K.EQ.0.OR.SNOG(1).NE.STARTC) THEN 64 IF (K.EQ.0) SMOG(1) m ENDC+I 65 CALL STREST(I,NUMWIN,I,STARTC,SNOG(1)-I) 66 ENDIF 67 IF ( K . N E . 0 ) THEN 68 DO 3 3ml,K 69 CALL STREST(0,NUMWIN,I,SNOG(J),ENOG(3) ) 70 IF (3.LT.K) CALL STREST(I,NUMWIN,I,ENOG(J)+I,SNOG(3+I)-I) 71 3 CONTINUE 72 IF (ENOG(K).NE.ENDC) CALL STREST(I,NUMWIN,I,ENOG(K)+I,ENDC) 7 3 ENDIF 74 10 CONTINUE 75C ..... 76 WNUM m WTEMP 77 RETURN 78 END 1C----m 2 SUBROUTINE STREST (IFLAG,NUMWIN,IROW,ICOLI,ICOL2) 3 CHARACTER*80 STRING 4c$INCLUDE:'ANSICOMM.FOR' 5 INCLUDE 'ANSICOMN.FOR' IVAX

23 IF (IFLAG.NE.0) CALL VTGRAF(1) 24 CALL VTCSET(IROW,ICOLI) 25 WRITE(STRING,'(80AI)') (WINDOW(NUMWIN,IROW,L),LmICOLI,ICOL2) 26 CALL VTWRIT (STRING,ICOL2-ICOLI÷I) 27 IF (IFLAG.NE.0) CALL VTGRAF(0) 28 RETURN 29 END

2 SUBROUTINE TESTRC (IROW,ZCOL) 3 IF (IROW.LT. 1 ) IROWm 1

511

512 M. LIGI and G. BOaTOLUZZl

4 IF (IROW.GT.25) IROW=25

5 IF (ICOL.LT. 1) ICOL- I 6 IF (ICOL.GT.79} ICOL=79 7 RETURN

8 END

2 SUBROUTINE VTWRIT (STROUT,LENSTRI

3C It Writes a Text String of LenStr characters on the Direct I/O Con

42c

43c 44c

45c

46c 47c

48c

4 9 C * * * * "

4 CHARACTER STROUT*(*), STRHLP*80

5 INTEGER*4 STRADR 6 INTEGER*2 ADRSTR(2)

7 EQUIVALENCE (STRADRoADRSTR(1)) 8 PARAMETER ( MAXLEN = 79 )

9C*****MS-DOS

10c$INCLUDE: 'ANSICOMM.FOR' 1 1 C ' * * * * 12C ..... VAX VMS 13 INCLUDE 'ANSICOMM.FOR' 31 EXTERNAL IO$ WRITEVBLK 32C . . . . . 33 LTHSTR~LENiSTROUT) 34 IF (LTHSTR.GT.MAXLEN) LTHSTR=MAXLEN 35 IF (LENSTR.GT.0.AND.LENSTR.LT.LTHSTR 36 I F (STROUT(I:l).GE.CHAR(32)) THEN 37 I F (WNUM.NE.0) READ(STROUT,' (80A1 38 & (WINDOW(WNUH,WINROW,J 39 WINCOL - WINCOL+LTHSTR-I 40 ENDIF

41C*****MS-DOS LI m LTHSTR + 1

STRHLP(I:LI) - STROUT(I:LTHSTR)//'$ AX - 9*256 STRADR n LOC (STRHLP)

DS a ADRSTR(2) DX m ADRSTR(1) CALL INT21

L T H S T R = L E N S T R

, )

,J=WINCOL,WINCOL+LTHSTR-I)

5 0 C . . . . . VAX VMS 51 I F { I N F L A G . E Q . 0 ) THEN 52 C A L L S Y S S A S S I G N ( ' T T ' , C H A N N , , ] 53 INFLAG - I ~4 ENDIF 55 CALL SYS$QIOW (,%VAL(CHANN),IO$ WRITEVBLK, , , ,%REF(STROUT),

~6 & %VAL(LTHSTR) .... ) 57C ..... 58 RETURN ~9 END

2 S U B R O U T I N E V T G E T C (COD) 3C ..... It reads one character from Standard Input 4c On Return Code >s0 Ascii Code of Character in Input 5C ( 0 Code of Function Key in Input

6 IMPLICIT INTEGER (A-Z) 7C*****MSDOS Version 8c LOGICAL REPEAT 9c$INCLUDE:'ANSICOMM.FOR'

10c I REPEAT - .FALSE. 1 1 c AX ~ 11"256 1 2 c DX - 2 5 5 13c CALL INT21 14c IF (MOD(AX,256).EQ.255) THEN 15c REPEAT - .TRUE. 16c AXmBt256 I?c CALL INT21 1 8 c ENDIF 19c IF (REPEAT) GOTO 1 20C AX - 8*256 21c CALL INT21 22c COD ~ MOD(AX,256) 2 3 c IF ( C O D . E Q . 0 ) THEN 2 4 c CALL INT21 2~c COD t - MOD(AX,256) 26c ENDIF 2 7 C * * * * * 28C . . . . . V A X - V M S V e r s i o n 29 BYTE BUF(80),MMA(16)

D a t u m shif t and convers ion o f geos r aph i ca l coord ina tes

30 31 32 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 03 84 85 86 87 88 89 90 91 92 93 94 95 96 97

INTEGER*2 1 0 ( 4 ) I N T E G E R N A ( 2 ) INCLUDE 'ANSICOMM.FOR' EXTERNAL IO$ READVBLKoIOSM_ESCAPEoIOSM_NOFILTR,IO$M NOZCHO DATA MMA / 16"-I / I F (INFLAG.EQ.0) THEN

CALL SYSSASSIGN('TT°,CHANN,,) INFLAG = 1

ENDIF M A ( 1 ) = 1 6 M A ( 2 ) - %LOC(MMA) REAF m %LOC(IO$ READVBLK) .OR. %LOC(IOSM ESCAPE) .OR.

& %LOC(IoSM NOFILTR) .OR. %LOC(IOSM~NOECHO) CALL SYS$QIOW(,~AL(CHANN),%VAL(REAF),IO,,,BUF,qVAL(80),,MA,,) IF ( IO(4).EQ.I ) THEN

COD m B U F ( I ) E L S E I F ( B U F ( 2 ) . E Q . 9 1 ) THEN

IF (BUF(3).GE.65.AND.BUF(3).LE.68) THEN I F ( BUF(3).EQ.65 ) THEN

COD m -72 ELSE IF ( BUF(3).EQ.66 ) THEN

COD - - 8 0 E L S E I F ( B U F ( 3 ) . E Q . 6 7 ) THEN

COD - -77 ELSE

COD - -75 ENDIF

ELSE IF (BUF(3).EQ.50.AND.BUF(4).EQ.51) THEN COD m 27

E L S E COD m 0

ENDIF ELSE I F ( BUF(2).EQ.79 ) THEN

I F ( B U F ( 3 ) . G E . 8 0 . AND. B U F ( 3 ) . L E . 8 3 ) THEN COD - 21 - B U Y ( 3 )

ELSE I F ( B U F ( 3 ) . E Q . 6 5 ) THEN COD - - 7 2

ELSE IF ( B U F ( 3 ) . E Q . 6 6 ) THEN COD - - 8 0

ELSE IF ( BUF(3).EQ.67 ) THEN COD • -77

E L S E IF ( B U F ( 3 ) . E Q . 6 8 ) THEN COD - - T 5

ELSE COD m 0

ENDIF ELSE IF (BUF(1).EQ.27.AND.BUF(2).EQ.27) THEN

COD m 27 ELSE

COD m 0 ENDIF

9 5 C . . . . . 9 9 RETURN

1 0 0 END I C - = - = - 2 S U B R O U T I N E V T G R I D ( I R O W , I C O L , N I N T L , L L , S C , E C , N I N T C , C C , S L , E L ) $C It D r a w s a r e c t a n g u l a r B o x with I n t e r n a l L i n e a n d C o l u m n 4C f r o m C u r s o r P o s i t i o n t o t h e s p e c i f i e d p o s i t i o n I R O W , I C O L 5C N I N T L - N u m b e r o f I n t e r n a l L l n q d 6C LL - A r r a y o f I n t e r n a l L i n e s TC SC - A r r a y o f I n t e r n a l l i n e S t a r t C o l u m n s e c E c - A r r a y o f I n t e r n a l l i n e E n d C o l u m n s 9C NZNTC m N u m b e r o f I n t e r n a l C o l u m n s

I 0 C CC - A r r a y o f I n t e r n a l C o l u m n s I I C S L a A r r a y o f I n t e r n a l C o l u m n S t a r t L i n e s 1 2 C EL . A r r a y o t I n t e r n a l C o l u m n E n d L i n e s 13 I M P L I C I T I N T E G E R ( A - Z ) 24 D I M E N S I O N L L ( I ) , S L ( I ) , E L ( I ) , C C ( 1 ) , S C ( 1 ) , E C ( I ) 15 CHARACTER V I E W ( 2 5 , 8 0 ) * I , S T R I N G * S 0 1 6 C ' * * ' ' M S D O S V e r s i o n 1 7 c $ I N C L U D E : * A N S Z C O M M . F O R ' 1 8 c I N T E G E R * I W L ( I S , 8 0 ) , W c ( l s , 8 0 ) l S C I N T E G E R * I L R C , U R C , U L C , L L C , L T I , R T I , B T I , T T I , X L S o H O L , V E E , 2 0 c t LRCD,URCD,LLCD,ULCD,VESD,HOLD,LTID,RTID,BTID,TTID 21C D A T A L R C , U R C , L L C , U L C / 2 1 7 , 1 9 1 , 1 9 2 , 2 1 8 / 2 2 c DATA LTI,RTI,BTI,TTI / 1 9 5 , 1 8 0 , 1 9 3 , 1 9 4 /

513

1514 M. LIGJ and G. BoaToit 'zzl

23c DATA XLS,MOL,VEB,VEBD,HOLD / 197,196,179,186,205 / 24c DATA LRCD,URCD,LLCD,ULCD / 188,187,200,201 / 25c DATA LTID,RTID,BTID,TTID / 199,182,207,209 / 26C.***~ 27C ..... VAX-VMS version 28 INCLUDE 'ANSICOMM.FOR' 46 BYTE WL(25,80), WC(25,80) 47 BYTE LRC,URC,ULC,LLC,LTI,RTI,BTI,TTI,XLS,HOL,VER, 48 LRCD,URCD,LLCD,ULCD,VEBD,HOLD,LTID,RTID,BTID,TTID 49 LRC,URC,LLC,ULC / 106,107,109,108 / 50 LTI,RTI,BTI,TTI / 116,117,118,119 / 51 XLS,HOL,VEBoVEBD,HOLD / II0,i13,120,120,ii~ / 52 LRCD,URCD,LLCD,ULCD / 106,107,109,108 / 53 LTID,RTID,BTID,TTID / 116,117,118,119 /

VTGRAF(1)

&

DATA DATA DATA DATA DATA

54 CALL 55C ...... 56 57 5e 59 60 61 62 63 64 65 66 67 68 69 70 71

72 73 74 75 76 77 78 79 a0 el 82 83

84 85 a6 a7 88 89 90 91 92 93 94 95 96 97 98 99

100 101 102 103 104 105 106 107 I08 109 110 111 112 113 114 115

IROWC = WINROW ICOLC ~ WINCOL IF (IROW.LT.1.OR.IROW.GT.25.OR.ICOL.LT.I.OR.ICOL GT 80) IF (IROW.EQ.IROWC.OR.ICOL.EQ.ICOLC) RETURN DO 1 Kwl,80

DO 1 J-I,25 VIEW(J,K) ~ ' WL(J,K)-0

1 WC(J,K)s0 ZNDL~IROW ENDC-ICOL IF (ENDL.LT.IROWC) THEN

ZNDLwIROWC IROWC-IROW

ZNDIF IF (ENDC.LT.ICOLC) THE~

ENDCmICOLC ICOLC~ICOL

ENDIF II m ICOLC+I I2 m ENDC -i L1 m IROWC+I L2 - ENDL -1 WRITE (VIEW(IROWC,ICOL¢),' (AI)') CHAR(ULCD) WL(IROWC,ICOLC)ul WC(IROWC,ICOLC)~I DO 2 K~II,I2

WRITE (VIEW(IROWC,K),' (AI)') CHAR(MOLD) 2 WL(IROWC,K)-I

WRITE (VIEW(IROWC,ENDC),' (AI)') CHAR(URCD) WL(IROWC,ENDC)~I WC(IROWC,ENDC)~I DO 3 M~L1,L2

WRITE (VIEW(K,ICOLC), ' (AI) ' ) CHAR(VEBD) WC(K,ICOLC)-I WRITE (VIEW(K,ENDC),'(AI)') CHAR(VEBD)

3 WC(K,ENDC)ml WRITE (VIEW(ENDL,ICOLC),' (AI)') CHAR(LLCD) WL(ENDL,ICOLC)-I WC(ENDL,ICOLC)-I DO 4 K~II,I2

WRITE (VIEW(ENDL,K),' (A1)') CHAR(HOLD) 4 WL(ENDL,K)II

WRITE (VIEW(ENDL,ENDC),' (AI)') CHAR(LRCD) WL(ENDL,ENDC)~I WC(ENDL,ZNDC)~I IF (NINTL.GT.0) THEN

DO 6 Jal,NINTL TSC~SC(J) TECoEC(J) IF (TSC.GT.TEC) THEN

TSC-EC(J) TECmSC(J)

ENDIF IF ( LL(J).GT.IROWC .AND. LL(J).LT.ENDL .AND.

& TSC .GE.ICOLC .AND. TEC.LE.ENDC ) THEN DO 5 ImTSC,TEC

5 WL(LL(J),I)-I ENDIF

6 CONTINUE

RETURN

Datum shift and conversion of geographical coordinates

116 117 118 119 120 121 122 123 124 125 226 127 228 7 129 130 8 131 132 133 134 135 136 137 138 139 140 9 141 142 143 144 145 146 147 148 10 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 20 181 182 183 184 185 30

ENDIF I F ( N I N T C . G T . 0 ) THEN

DO 8 J m l , N I N T C T S L m S L ( J ) TELmEL(J) IF (TSL.GT.TEL) THEN

TSLmEL(J) TELmSL(J)

ENDIF IF (CC(J).GT.ICOLC .AND. CC(J).LT.ENDC .AND.

TSL .GE.IROWC .AND. TEL .LE.ENDL ) THEN DO 7 ImTSL,TEL

W C ( I , C C ( 3 ) ) - I ENDIF

CONTINUE ENDIF IF ( (NINTL.GT.0) .OR. (NINTC.GT.0) ) THEN

DO 9 ImIl,I2 IF (WC(IROWC,I).GT.0) THEN

WRITE (VIEW(IROWC,I),'(AI)') CHAR(TTID) ENDIF IF (WC(ENDL,I).GT.O) THEN

WRITE (VIEW(ENDL,I),'(AI)') CHAR(ETID) ENDIF

CONTINUE DO 10 ImLI,L2

IF (WL(I,ICOLC).GT.0) THEN WRITE (VIEW(X,ICOLC),'(AI)') CHAR(LTID)

ENDIF IF (WL(I,ENDC).GT.0) THEN

WRITE (VIEW(I,ENDC),'(AI)') CHAR(RTID) ENDIF

CONTINUE CALL VTCSET(I,1) DO 20 ZmI1,I2

DO 20 LmLI,L2 IF (WL(L,Z).GT.0 .OR. WC(L,I).GT.0) THEN

I F ( W C ( L , I ) . E Q . 0 ) THEN WRITE (VIEW(L,I),'(AI),) CHAR(HOL)

ELSE IF (WL(L,Z).EQ.0) THEN WRITE (VIEW(L,I),'(AI)') CHAR(VEB)

ELSE W m W L ( L , I - 1 ) * 8 + W C ( L + I , I ) * 4 + W L ( L , I + I ) * 2 + W C ( L - I , I ) I F ( W . E Q . 2 .OR. W . E Q . I 1 ) THEN

WRITE (VIEW(L,I), AI ' CHAR(BTI) ELSE IF (W.EQ.2 .OR. W.EQ.?) THEN

WRITE (VIEW(L,I) A1 ' CHAR(LTZ) ELSE IF (W.EQ.3) THEN

WRITE (VIEW(L,I) AI ' CHAR(LLC) ELSE IF (W.EQ.4 .OR. W.EQ.14) THEN

WRITE (VIEW(L,I),' A1 ' CHAR(TTI) ELSE IF (W.EQ.6) THEN

WRITE (VIEW(L,I),' A1 ' CHAR(ULC) ELSE IF (W.EQ.8 .OR. W.EQ.13) THEN

WRITE (VIEW(L,I) AI ' CHAR(RTI) ELSE IF (W.EQ.9) THEN

WRITE (VIEW(L,I) A1 ' CHAR(LRC) ELSE I F ( W . E Q . 2 2 ) THEN

WRITE (VIEW(L,I) A1 ' CHAR(URC) ELSE

WRITE (VIEW(L,I) AI ' CHAR(XLS) ENDIF

ENDIF ENDIF

CONTINUE ENDIF DO 30 ImIROWC,ENDL

WRITE (STRING,'(80AI)') (VIEW(I,J),JmICOLC,ENDC) CALL VTCSET(I,ICOLC) CALL VTWRIT(STRING,ENDC-ZCOLC÷I)

186C . . . . . VAX-VMS V o r a £ o n 187 I F (WNUM.NE.0) THEN 188 DO 40 I - 1 , 2 5 1 8 9 DO 4 0 J m 1 , 8 0 190 I F ( W L ( I , J ) . N E . 0 . O R . W C ( I , J ) . N E . 0 ) THEN 191 WG(WNUM,I,J) m I

515

516 M. L~o~ a n d G . B o a r o L u z z ~

1 9 2 E L S E 1 9 3 W G ( W N U M , I , J ) - 0 1 9 4 E N D I F 1 9 5 40 C O N T I N U E 196 ENDIF 197 CALL VTGRAF(01

1 9 8 C ..... 199 RETURN 2 0 0 END

IC----i

2 SUBROUTINE VTGRAF (IFLAG)

3 IF (IFLAG.EO.I) THEN

4 CALL VTWRIT (CHAR(27)//' (0' ,3 5 CALL VTWRIT (CHAR(27)//')0' ,3

6 ELSE

7 CALL VTWRIT (CHAR(27)~/' (B',3 8 CALL VTWRIT (CHAR(27)~~")B',3 9 ENDIF

10 RETURN Ii END

1C-----

2 SUBROUTINE SCROLL (STRING,LS,LE) 3 CHARACTER STRING*(*),TEXT(25)*80, STRINI*17~ S T R H L P ' 8 4 DATA STRINI / 'INITIALIZE SCROLL' /

5 IF (STRING.EQ.STRINI) THEN

6 LSTART - LS

7 LEND = LE

8 IF (LSTART.LT.I ) LSTART - 1

9 IF (LSTART.GT.24) LSTART = 24

I0 IF (LEND.LT.I ) LEND - 1 Ii IF (LEND.GT.24) LEND ~ 24

12 IROW - LSTART - 1

13C ...... VAX-VMS Version

14 WRITE(STRHLP,' (2AI,12,AI,I2,AI 15 & CHAR(27

16 CALL VTWRIT(STRHLP,8)

17 CALL VTCSET(IROW,I)

1 8 C . . . . . . 19 ELSE 2 0 C * * * * * * M S D O S V e r s i o n 21c LENSTR - LENGTH(STRING,255)

2 2 c IF (LENSTR.GT.79) LENSTR - 79

2 3 c IROW - IROW + l

24C WRITE (TEXT(IROW),'(AS0}') STRING

25C IF (IROW.GT.LEND) THEN

26c IROW m IROW - 1

27C DO I I=LSTART,LEND

28c 1 TEXT(I) - TEXT(I+1|

29c DO 2 IuLEND,LSTART,-I

30c CALL VTCSET(I,I)

31¢ CALL VTWRIT(TEXT(1),LENSTR

3 2 c 2 CONTINUE

33c ELSE 3 4 c CALL VTCSET(IROW,I)

35c CALL VTWRIT(TEXT(IROW),LENSTR

36c E N D I F 3 7 C * * * ' *

,}

, ' [ ' ,LSTART, ' : ' ,LEND, ' r

38C ..... VAX-VMS Version

39 WRITE(°, * ) STRING 40C ..... 41 ZNDIF

42 RETURN 43 END ICE-----

2 SUBROUTINE WAIT (SEC)

3C*****MS-DOS Version 4c INTEGER'2 HOUR,MINUTE,SECOND,SECIO0 5c LOGICAL NEWDAY 6C .....

Uc CALL GETTIM (HOUR,MINUTE,SECOND,SECI00)

8c TSTART - FLOAT(HOUR)*3600.0+FLOAT(MINUTE)*60.0+

9c & FLOAT(SECOND}+FLOAT(SECI00)/100.0 10c 1 CALL GETTIM(HOUR,NINUTE,SECOND,SECI00)

llc 2 TIMSEC - FLOAT(HOUR)*3600.0+FLOAT{MINUTE}*60.0+ 1 2 c & FLOAT(SECOND)+FLOAT(SECI00)/100.0 13c NEWDAY i .FALSE.

Datum shift and conversion of geographical coordinates 517

1 4 c 1 5 c 1 6 c 1 7 c 1 8 c 1 9 c 2 0 c 2 1 c * * * o *

IF (TZMSEC.LT.TSTART) THEN NEWDAY m .TRUE. HOUR m 2 4 + HOUR

ENDIF IF (NEWDAY) GOTO 2

DELAY m (TIMSEC-TSTART) IF (DELAY.LT.SEC) GOTO I

22C ..... VAX-VMS Version 23 T m SECNDS (0.0) 24 I TIMER - SECNDS(T) 25 IF (TIMER.LE.SEC) GOTO 1 26C ..... 27 RETURN 28 END 1C~m--m 2 SUBROUTINE VTREAD (STRINP,LENSTR) 3C It Reads Text String untll ~cr> it reeds on the Direct I/O C o n s o l e 4 CHARACTER°( * ) STRINP 5C*****MS-DOS Version 6c CHARACTER*I STRNLP(80) 7c LOGICAL STOPRD 8c PARAMETER ( MAXLEN=79) 9 c L E N S T R ~ O

1 0 c i CALL VTGETC (ICODE) llc IF (ICODE.LE.0) GOTO 1 1 2 c LENSTR~LENSTR+I 13c STRHLP(LENSTR) m CHAR(ICODE) 14c IF (STRHLP(LENSTR).NE.CHAR(13)) THEN 15c CALL VTWRIT (STRHLP(LENSTR),I) 1 6 C S T O P R D m . F A L S E . 17c ELSE 18c LENSTRmLENSTR-I 1 9 c STOPRDm.TRUE. 2 0 c E N D I F 21c IF (.NOT.STOPRD.AND.LENSTR.LT.MAXLEN) GOTO 1 2 2 c WRITE(STRINP,'(80AI)' ) (STRIILP(1),ImI,LENSTR) 2 3 C * * * e * 24C . . . . . . VAX-VMS V e r s i o n 25 INTEGER"2 IO(4) 26 CHARACTER*255 INP 27 INCLUDE 'ANSICOMM.FOR' 45 EXTERNAL IO$_READVBLKoIO$M_TRMNOECHO 46 IF (INFLAG.EO.0) THEN 47 CALL SYSSASSIGN('TT',CHANN,,) 48 ZNFLAG m 1 49 ENDIF 50 IREAF - %LOC(IO$ READVBLK).OR.tLOC(IOSM TRMNOECHO) 51 CALL SYS$QIOW (,~VAL(CHANN),qVAL(IREAF}TIO° o, 52 ~ %REF(INP),%VAL(255) .... ) 53 L m LEN(STRINP) 54 LENSTR m IO(2) 55 IF (LENSTR.GT.L) LENSTR o L 56 STRINP(I:LENSTR) " INP(I:LENSTR) 57C ..... 58 RETURN 59 END 1C ...... 2C INTERRUPT CALL FOR MS-DOS COMPUTERS 3C 4CINT21 TEXT 5CINT21--TEXT ~CDATA-- 7C DATA SC~ONST 9 C C O N S T

10C BBS IIC--BSS 1 2 C R E G B S A 13CREGS$A 14CDGROUP 15C ASSUME 16C 17C 18CREG$$A 19C

SEGMENT BYTE P U B L I C ' C O D E ' ENDS

SEGMENT WORD P U B L I C ' D A T A ' ENDS SEGMENT WORD P U B L I C ' C O N S T ' ENDS SEGMENT WORD P U B L I C ' B S S ' ENDS SEGMENT PARA COMMON ' $ R E G S '

ENDS GROUP CONST, BSS, DATA

CB: INT21 TEXT, DS: DGROUP~ SS: DGROUP, ES: DGROUP PUBLIC RUGS REGS EQU SEG REGS$A SEGMENT DB 18 D U P ( ? )

518

20CREGSSA 21C SSS 22C--BSS 23C~ONST 24CCOMJ4REGS 25CCONST 26CINT21 TEXT 27C 2SCINT21 29C 30C 31C 32C 33C 34C 35C 36C 37C 38C 39C 40C 41C 42C 43C 44C 45C 46C 47C 48C 49C 50C 51C 52C 53C 54C 55C 56C 57C 58CINT21 59CINT21 TEXT 60CEND --

M. LIGl and O. BOaTOLUZZl

ENDS SEGMENT ENDS SEGMENT DW SEG REG~ ENDS S E G H E N T

P U B L I C I N T 2 1 PROC FAR PUSH BP MOV B P , S P PUSH SI PUSH DI PUSH DS MOV ES,COMMR~GS NOV AX,WORD PTR ES:0 NOV BX,WORD PTR ES:2 NOV CX,WORD PTR ES:4 MOV DX,WORD PTR ES:6 NOV SI,WORD PTR ES:8 NOV DI,WORD PTR ES:I0 MOV DS,WORD PTR ES:12 INT 21H NOV WORD PTR ES:0,AX NOV WORD PTR ES:Z,BX NOV WORD PTR ES:4,CX NOV WORD PTR ES:6,DX NOV WORD PTR ES:$,SI NOV WORD PTR ES:I0~DI NOV WORD PTR ES:I2,DS PUSHF POP AX NOV WORD PTR E S : 1 6 , A X POP DS POP DI POP SI POP 8P RET

ENDP ENDS