50 lines
1.4 KiB
Go
50 lines
1.4 KiB
Go
|
|
package geocode
|
||
|
|
|
||
|
|
import (
|
||
|
|
"github.com/Gleipnir-Technology/nidus-sync/platform/types"
|
||
|
|
"github.com/Gleipnir-Technology/nidus-sync/stadia"
|
||
|
|
)
|
||
|
|
|
||
|
|
type SortAddressByDistance struct {
|
||
|
|
Addresses []types.Address
|
||
|
|
Location types.Location
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s SortAddressByDistance) Len() int { return len(s.Addresses) }
|
||
|
|
func (s SortAddressByDistance) Swap(i, j int) {
|
||
|
|
s.Addresses[i], s.Addresses[j] = s.Addresses[j], s.Addresses[i]
|
||
|
|
}
|
||
|
|
func (s SortAddressByDistance) Less(i, j int) bool {
|
||
|
|
ai := s.Addresses[i]
|
||
|
|
aj := s.Addresses[j]
|
||
|
|
if ai.Location == nil || (ai.Location.Latitude == 0 && ai.Location.Longitude == 0) {
|
||
|
|
if aj.Location == nil || (aj.Location.Latitude == 0 && aj.Location.Longitude == 0) {
|
||
|
|
return ai.Raw > aj.Raw
|
||
|
|
}
|
||
|
|
return false
|
||
|
|
} else if aj.Location == nil || (aj.Location.Latitude == 0 && aj.Location.Longitude == 0) {
|
||
|
|
return true
|
||
|
|
}
|
||
|
|
di := types.LocationDistance(s.Location, *ai.Location)
|
||
|
|
dj := types.LocationDistance(s.Location, *ai.Location)
|
||
|
|
return di < dj
|
||
|
|
}
|
||
|
|
|
||
|
|
type SortFeaturesByDistance []stadia.GeocodeFeature
|
||
|
|
|
||
|
|
func (s SortFeaturesByDistance) Len() int { return len(s) }
|
||
|
|
func (s SortFeaturesByDistance) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||
|
|
func (s SortFeaturesByDistance) Less(i, j int) bool {
|
||
|
|
fi := s[i].Properties.Distance
|
||
|
|
fj := s[j].Properties.Distance
|
||
|
|
if fi == nil {
|
||
|
|
if fj == nil {
|
||
|
|
return s[i].Properties.GID < s[j].Properties.GID
|
||
|
|
}
|
||
|
|
return false
|
||
|
|
} else if fj == nil {
|
||
|
|
return true
|
||
|
|
}
|
||
|
|
return *fi < *fj
|
||
|
|
}
|