nidus-sync/platform/geocode/sort.go

50 lines
1.4 KiB
Go
Raw Permalink Normal View History

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
}