/
geocoder.go
38 lines (33 loc) · 1.15 KB
/
geocoder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package chained
import (
"github.com/codingsince1985/geo-golang"
)
type chainedGeocoder struct{ Geocoders []geo.Geocoder }
// Geocoder creates a chain of Geocoders to lookup address and fallback on
func Geocoder(geocoders ...geo.Geocoder) geo.Geocoder { return chainedGeocoder{Geocoders: geocoders} }
// Geocode returns location for address
func (c chainedGeocoder) Geocode(address string) (*geo.Location, error) {
// Geocode address by each geocoder until we get a real location response
for i := range c.Geocoders {
if l, err := c.Geocoders[i].Geocode(address); err == nil && l != nil {
return l, nil
}
// skip error and try the next geocoder
continue
}
// No geocoders found a result
return nil, nil
}
// ReverseGeocode returns address for location
func (c chainedGeocoder) ReverseGeocode(lat, lng float64) (*geo.Address, error) {
// Geocode address by each geocoder until we get a real location response
for i := range c.Geocoders {
if addr, err := c.Geocoders[i].ReverseGeocode(lat, lng); err == nil && addr != nil {
return addr, nil
}
// skip error and try the next geocoder
continue
}
// No geocoders found a result
return nil, nil
}