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

<pre>

<b>SQL</b>

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

<b>C functions</b>

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

</pre>

Kevin C. Ketzler – <a href=”http://www.aresgrp.com”>Affiliated</a>

## Discuss This Question: 11 Replies

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