Here’s the formula in java:

———————————————————————-

var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) *
Math.sin(dLon/2) * Math.sin(dLon/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;

——————————————————————-

Not RPG or SQL (I think) need to use C math stuff in RPG

This is one for a C math – RPG dud/dudette

well, based on the JAVA code, then this should work

**SQL**
h option(*nodebugio:*srcstmt) dftactgrp(*no) actgrp(*caller) indent('|')
d test s 8f
d Haversine pr 8f
d lat1 8f const
d lon1 8f const
d lat2 8f const
d lon2 8f const
c eval test = haversine(1:1:2:2)
c dump(a)
c eval *inlr = *on
p Haversine b
d Haversine pi 8f
d lat1 8f const
d lon1 8f const
d lat2 8f const
d lon2 8f const
d dLat s 8f
d dLon s 8f
d a s 8f .
d c s 8f
c/exec sql
c+ set :dLat = radians(:lat2 - :lat1)
c/end-exec
c/exec sql
c+ set :dLon = radians(:lon2 - :lon1)
c/end-exec
c/exec sql
c+ set :a = sin(:dLat/2) * sin(:dLat/2) +
c+ cos(radians(:lat1)) * cos(radians(:lat2)) *
c+ sin(:dLon/2) * sin(:dLon/2)
c/end-exec
c/exec sql
c+ set :c = 2 * atan2(sqrt(:a), sqrt(1 - :a))
c/end-exec
c return 6371 * c
p Haversine e
**C functions**
h option(*nodebugio:*srcstmt) dftactgrp(*no) actgrp(*caller) indent('|')
h bnddir('QC2LE') expropts(*maxdigits) fltdiv
d test s 8f
d sin pr 8f extproc('sin')
d parm1 8f const
d cos pr 8f extproc('cos')
d parm1 8f const
d atan2 pr 8f extproc('atan2')
d parm1 8f const
d parm2 8f const
d sqrt pr 8f extproc('sqrt')
d parm1 8f const
d Haversine pr 8f
d lat1 8f const
d lon1 8f const
d lat2 8f const
d lon2 8f const
c eval test = haversine(1:1:2:2)
c dump(a)
c eval *inlr = *on
p Haversine b
d Haversine pi 8f
d lat1 8f const
d lon1 8f const
d lat2 8f const
d lon2 8f const
d dlat s 8f
d dlon s 8f
d a s 8f
d c s 8f
d pi c const(3.1415926)
/free
dlat = (lat2 - lat1) * pi / 180;
dlon = (lon2 - lon1) * pi / 180;
a = sin(dlat / 2)**2
+ cos(lat1 * pi / 180) * cos(lat2 * pi / 180)
* sin(dlon / 2)**2;
c = 2 * atan2(sqrt(a):sqrt(1 - a));
return 6371 * c;
/end-free
p Haversine e

Kevin C. Ketzler -

## Discuss This Question: 11 Replies

c = 2 * arcsin(min(1,sqrt(a)))d = R * c where R is the radius of the Earth.