diff options
author | Kali Kaneko <kali@leap.se> | 2018-12-13 08:45:27 -0500 |
---|---|---|
committer | Kali Kaneko (leap communications) <kali@leap.se> | 2018-12-13 15:13:44 +0100 |
commit | 1223039a813fa836b3a7616225fc2d488b396249 (patch) | |
tree | 08395d9428163a9680afae8496ae2c88c9208468 /geo.go | |
parent | 5540bc0f605f3d318a0b773861dcf26d21f9ef56 (diff) |
geolocate gateways and kd-tree
during initialization, we fetch the eip-config.json file from the
configured provider. we geolocate the gateways (using a golang package
that has some cities missing, hence the workaround) and
initialize a KD-Tree with the gateways.
using the KD-Tree, it is very cheap to calculate the nearest gateway for
every request, which is provider as a filed in the json to the client -
as a suggestion to be used or not in the gateway selection process.
Diffstat (limited to 'geo.go')
-rw-r--r-- | geo.go | 40 |
1 files changed, 40 insertions, 0 deletions
@@ -0,0 +1,40 @@ +package main + +import ( + "github.com/hongshibao/go-kdtree" +) + +type EuclideanPoint struct { + kdtree.Point + Vec []float64 +} + +func (p EuclideanPoint) Dim() int { + return len(p.Vec) +} + +func (p EuclideanPoint) GetValue(dim int) float64 { + return p.Vec[dim] +} + +func (p EuclideanPoint) Distance(other kdtree.Point) float64 { + var ret float64 + for i := 0; i < p.Dim(); i++ { + tmp := p.GetValue(i) - other.GetValue(i) + ret += tmp * tmp + } + return ret +} + +func (p EuclideanPoint) PlaneDistance(val float64, dim int) float64 { + tmp := p.GetValue(dim) - val + return tmp * tmp +} + +func NewEuclideanPoint(vals ...float64) *EuclideanPoint { + ret := &EuclideanPoint{} + for _, val := range vals { + ret.Vec = append(ret.Vec, val) + } + return ret +} |