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)
You must be logged in to post a comment.