# Android Code Snippet[B4X] Find distance between two points (Lat/Lon)

Here is a function that could be useful if you want to determine the distance between two coordinates. The distance is returned in Miles.

B4X:
``````'
' Return Distance between two points
'
Sub distance(lat1 As Double, lon1 As Double, lat2 As Double, lon2 As Double) As Double
Dim theta As Double
Dim dist As Double

theta = lon1 - lon2
dist = ACos(dist)
Return dist * 60 * 1.1515
End Sub

'
'  This function converts decimal degrees to radians
'
Sub deg2rad(Deg As Double) As Double
Dim pi As Double= 3.14159265358979
Return Deg * pi / 180
End Sub

'
'  This function converts radians to decimal degrees
'
Dim pi As Double= 3.14159265358979
Return Rad * 180 / pi
End Sub``````

#### derez

##### Expert
Longtime User
Can be done with GPS library :
Location
A Location object holds various information about a specific GPS fix.
In most cases you will work with locations that are passed to the GPS LocationChanged event.
The location object can also be used to calculate distance and bearing to other locations.

#### klaus

##### Expert
Longtime User
It seems that you don't know that B4A has trigonometic functions for degrees!
No need to tranform degrees to radians!
SinD, CosD, TanD, ACosD, ASinD, ATanD.
Insted of Sin(deg2rad(lat1)) use simply SinD(lat1)

It seems that you don't know either that B4A has an internal constant for Pi: cPi

#### aminoacid

##### Active Member
Longtime User
Yes... I'm learning new things every day. Thanks for the feedback. I ported this over from a old VB6 Application to my B4X application since I needed this capability with the GoogleMaps library already loaded and did not want to have to load another Library (GPS) just for one simple calculation.

#### aminoacid

##### Active Member
Longtime User
Much more compact ......

B4X:
``````'
' Return Distance between two points in miles
'
Sub distance(lat1 As Double, lon1 As Double, lat2 As Double, lon2 As Double) As Double
Dim theta As Double
Dim dist As Double
Dim dist2 As Double
theta = lon1 - lon2
dist = SinD(lat1) * SinD(lat2) + CosD(lat1) * CosD(lat2) * CosD(theta)
dist = ACosD(dist)
Return dist * 60 * 1.1515
End Sub``````

• Martin Fdez

#### LucaMs

##### Expert
Longtime User
Where do you establish that they are miles?

What 60 and 1.1515 are?

• AbdurRahman

#### BillMeyer

##### Well-Known Member
Longtime User
• DonManfred

#### klaus

##### Expert
Longtime User
You may also have a look at THIS about accuracy.
The DistanceTo function from the GPS library is more accurate than the equation in your code.

#### mw71

##### Active Member
Longtime User
Distance and direction between 2 Maidenhead Locator, but uses internal Lat / Lon information

B4X:
``````Sub Loc2Dis (LocVStr As String, LocZStr As String) As Map

Dim r As Int = 6371.137
Dim rad2deg As Double = 180.0 / cPI

Dim LocV, LocZ As Map

LocV.Initialize
LocZ.Initialize

LocV=Loc2LatLon(LocVStr)
LocZ=Loc2LatLon(LocZStr)

Dim B1 As Double = LocV.Get("b")
Dim B2 As Double = LocZ.Get("b")
Dim L1 As Double = LocV.Get("l")
Dim L2 As Double = LocZ.Get("l")

Dim ew As Double             = ACos(SinD(B1) * SinD(B2) + CosD(B1) * CosD(B2) * CosD(L1-L2))    'entfernung in Winkelangabe
Dim Entfernung As Double    = r * ew                                                        'Umrechnung in Längenangabe

Dim tc As Double
If Sin(L2-L1)>=0 Then
tc=ACos((SinD(B2) - SinD(B1) * Cos(ew)) / (Sin(ew) * CosD(B1)))
Else
tc=(2*cPI) - ACos((SinD(B2) - SinD(B1) * Cos(ew)) / (Sin(ew) * CosD(B1)))
End If

Dim Richtung1 As Double = (tc * rad2deg * 10) / 10

Log("Entfernung  " & NumberFormat(Entfernung,1,1))
Log("Richtung1   " & NumberFormat(Richtung1,1,1))

Dim MapR As Map
MapR.Initialize
MapR.Put("E",NumberFormat(Entfernung,1,0))  'Dist
MapR.Put("R",NumberFormat(Richtung1,1,0))   'Dir
Return MapR
End Sub

Sub Loc2LatLon(locator As String) As Map

Dim l1, l2, l3 As Double
Dim b1, b2, b3 As Double
Dim LocTrenn(locator.Length) As String

For i=0 To locator.Length-1
LocTrenn(i)=locator.ToUpperCase.SubString2(i,i+1)
Next

For i=0 To 17
If LocTrenn(0)= Chr(65+i) Then l1=-180 + (i*20)
Next

For i=0 To 17
If LocTrenn(1)= Chr(65+i) Then b1=-90 + (i*10)
Next

For i=0 To 9
If LocTrenn(2)= i Then l2= i*2
Next

For I=0 To 9
If LocTrenn(3)= I Then b2=i
Next

For i=0 To 23
If LocTrenn(4)= Chr(65+i) Then l3= (i*2)/24
Next

For i=0 To 23
If LocTrenn(5)= Chr(65+i) Then b3= i/24
Next

Dim l As Double = l1+l2+l3
Dim b As Double = b1+b2+b3

Dim retM As Map
retM.Initialize
retM.Put("l",l)
retM.Put("b",b)

Return retM
End Sub``````

Replies
1
Views
2K
Replies
11
Views
5K
Replies
1
Views
3K
Android Code Snippet [B4X] GPS Antipode
Replies
4
Views
2K