mirror of
https://github.com/Luzifer/go_helpers.git
synced 2024-12-25 13:31:21 +00:00
Added Haversine helper functions
This commit is contained in:
parent
e7ac9d43bc
commit
e13a3146b1
3 changed files with 68 additions and 0 deletions
21
position/haversine.go
Normal file
21
position/haversine.go
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
package position
|
||||||
|
|
||||||
|
import "math"
|
||||||
|
|
||||||
|
const (
|
||||||
|
earthRadius = float64(6371)
|
||||||
|
)
|
||||||
|
|
||||||
|
func Haversine(lonFrom float64, latFrom float64, lonTo float64, latTo float64) (distance float64) {
|
||||||
|
var deltaLat = (latTo - latFrom) * (math.Pi / 180)
|
||||||
|
var deltaLon = (lonTo - lonFrom) * (math.Pi / 180)
|
||||||
|
|
||||||
|
var a = math.Sin(deltaLat/2)*math.Sin(deltaLat/2) +
|
||||||
|
math.Cos(latFrom*(math.Pi/180))*math.Cos(latTo*(math.Pi/180))*
|
||||||
|
math.Sin(deltaLon/2)*math.Sin(deltaLon/2)
|
||||||
|
var c = 2 * math.Atan2(math.Sqrt(a), math.Sqrt(1-a))
|
||||||
|
|
||||||
|
distance = earthRadius * c
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
34
position/haversine_test.go
Normal file
34
position/haversine_test.go
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
package position_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
. "github.com/Luzifer/go_helpers/position"
|
||||||
|
|
||||||
|
. "github.com/onsi/ginkgo"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = Describe("Haversine", func() {
|
||||||
|
|
||||||
|
var testCases = []struct {
|
||||||
|
SourceLat float64
|
||||||
|
SourceLon float64
|
||||||
|
DestLat float64
|
||||||
|
DestLon float64
|
||||||
|
Distance float64
|
||||||
|
}{
|
||||||
|
{50.066389, -5.714722, 58.643889, -3.070000, 968.8535441168448},
|
||||||
|
{50.063995, -5.609464, 53.553027, 9.993782, 1137.894906816002},
|
||||||
|
{53.553027, 9.993782, 53.554528, 9.991357, 0.23133816528015647},
|
||||||
|
{50, 9, 51, 9, 111.19492664455873},
|
||||||
|
{0, 9, 0, 10, 111.19492664455873},
|
||||||
|
{1, 0, -1, 0, 222.38985328911747},
|
||||||
|
}
|
||||||
|
|
||||||
|
It("should have the documented distance", func() {
|
||||||
|
for i := range testCases {
|
||||||
|
tc := testCases[i]
|
||||||
|
Expect(Haversine(tc.SourceLon, tc.SourceLat, tc.DestLon, tc.DestLat)).To(Equal(tc.Distance))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
13
position/position_suite_test.go
Normal file
13
position/position_suite_test.go
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
package position_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
. "github.com/onsi/ginkgo"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPosition(t *testing.T) {
|
||||||
|
RegisterFailHandler(Fail)
|
||||||
|
RunSpecs(t, "Position Suite")
|
||||||
|
}
|
Loading…
Reference in a new issue