|
Thanks for all your help on this. What I found you do have to have the
arcosin routine defined with all the inputs but not for sin and cos. I
placed the acs routine into another service program we use here for geo
functions. Here is a working copy of the The Great Circle calc that works
in free format on the AS400.
H Option(*SrcStmt : *NoDebugIO)
H Dftactgrp( *No )
H Actgrp( *Caller )
H Bnddir( 'QC2LE')
*Assumptions
*The circumference of the earth in miles = 3954
*
*This program is based on The Great Circle Formula
*d=acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2))
*
*The as400 math functions work using Raidans so you have to convert
*decimal to raidans.
*The formula for converting decimal to raidans is
* rad = dec * (pi/180)
*
dpi c 3.14159265
dradius c 3954
*Point A
dlat1 s 8f
dlong1 s 8f
*Point B
dlat2 s 8f
dlong2 s 8f
* Result cosin Float long Point A & B
dtheta s 8f
* Work Fields
ddist s 8f
dmiles s 10s 5
dfc s 12a
*Point A
d In_1latDeg s 2s 0 inz(34)
d In_1latMin s 2s 0 inz(59)
d In_1latSec s 2s 0 inz(43)
d In_1lonDeg s 3s 0 inz(-085)
d In_1lonMin s 2s 0 inz(-12)
d In_1lonSec s 2s 0 inz(-26)
*Point B
d In_2latDeg s 2s 0 inz(33)
d In_2latMin s 2s 0 inz(59)
d In_2latSec s 2s 0 inz(11)
d In_2lonDeg s 3s 0 inz(-118)
d In_2lonMin s 2s 0 inz(-09)
d In_2lonSec s 2s 0 inz(-27)
*Prototypes for math functions
dsin PR 8f Extproc('sin')
din 8f value
dcos PR 8f Extproc('cos')
din 8f value
dacs PR 8f Extproc('acs')
din 8f value
dfc 12a value
/free
//Convert Degrees, Minutes, Seconds to Decimal Degrees
// Point A
lat1 = %float(In_1latdeg+(In_1latmin/60)+(In_1latsec/3600));
long1 = %float(In_1londeg+(In_1lonmin/60)+(In_1lonsec/3600));
// Point B
lat2 = %float(In_2latdeg+(In_2latmin/60)+(In_2latsec/3600));
long2 = %float(In_2londeg+(In_2lonmin/60)+(In_2lonsec/3600));
//Convert Decimal Degrees To Raidans
// Point A
lat1 = lat1 * (pi/180);
long1 = long1 * (pi/180);
// Point B
lat2 = lat2 * (pi/180);
long2 = long2 * (pi/180);
//Convert Raidans To Miles
theta = long1 - long2;
dist = (sin(lat1)*sin(lat2))+
(cos(lat1)*cos(lat2)*cos(theta));
dist = radius * acs(dist:fc);
//Convert Float To Decimal
miles = %dec(dist:10:5);
*inlr = *on;
/end-free
**********************************************************************
* Prototype for acs Arccosine
**********************************************************************
P ACS B EXPORT
D ACS PI 8F
D IN 8F Value
D FC 12A Value
D
D OUT S 8F
C CallB 'CEESDACS'
C PARM IN
C PARM OUT
C PARM FC
C return OUT
P ACS E
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.