mirror of
https://github.com/Luzifer/go_helpers.git
synced 2024-12-24 13:01: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