go-geographic-attractor is a new project that indexes world city and population data and can match a given coordinate to either the nearest major city or the nearest city (if no major city is near) in near-instantaneous time.
From the example:
// Load countries.
countryDataFilepath := path.Join(appPath, "test", "asset", "countryInfo.txt")
f, err := os.Open(countryDataFilepath)
log.PanicIf(err)
defer f.Close()
countries, err := geoattractorparse.BuildGeonamesCountryMapping(f)
log.PanicIf(err)
// Load cities.
gp := geoattractorparse.NewGeonamesParser(countries)
cityDataFilepath := path.Join(appPath, "index", "test", "asset", "allCountries.txt.detroit_area_handpicked")
g, err := os.Open(cityDataFilepath)
log.PanicIf(err)
defer g.Close()
ci := NewCityIndex()
err = ci.Load(gp, g)
log.PanicIf(err)
// Do the query.
clawsonCoordinates := []float64{42.53667, -83.15041}
sourceName, visits, cr, err := ci.Nearest(clawsonCoordinates[0], clawsonCoordinates[1])
log.PanicIf(err)
// Print the results.
for _, vhi := range visits {
fmt.Printf("%s: %s\n", vhi.Token, vhi.City)
}
fmt.Printf("\n")
fmt.Printf("Source: %s\n", sourceName)
fmt.Printf("ID: %s\n", cr.Id)
fmt.Printf("Country: %s\n", cr.Country)
fmt.Printf("City: %s\n", cr.City)
fmt.Printf("Population: %d\n", cr.Population)
fmt.Printf("Latitude: %.10f\n", cr.Latitude)
fmt.Printf("Longitude: %.10f\n", cr.Longitude)
Like this:
Like Loading...
You must be logged in to post a comment.