Geocoder
GoLang package that provides an easy way to use the Google Geocoding API.
See more information about the Google Geocoding API at the following link: https://developers.google.com/maps/documentation/geocoding/start
You can use go get:
go get github.com/kelvins/geocoder
Usage
Example of usage:
package main
import (
"fmt"
"github.com/kelvins/geocoder"
)
func main() {
address := geocoder.Address{
Street: "Central Park West",
Number: 115,
City: "New York",
State: "New York",
Country: "United States",
}
location, err := geocoder.Geocoding(address)
if err != nil {
fmt.Println("Could not get the location: ", err)
} else {
fmt.Println("Latitude: ", location.Latitude)
fmt.Println("Longitude: ", location.Longitude)
}
location = geocoder.Location{
Latitude: 40.775807,
Longitude: -73.97632,
}
addresses, err := geocoder.GeocodingReverse(location)
if err != nil {
fmt.Println("Could not get the addresses: ", err)
} else {
address = addresses[0]
fmt.Println(address.FormatAddress())
fmt.Println(address.FormattedAddress)
fmt.Println(address.Types)
}
}
Results:
Latitude: 40.7758882
Longitude: -73.9764703
115, Central Park West, Manhattan, 10023, New York, New York County, New York, United States
115 Central Park West, New York, NY 10023, USA
street_address
General
Geocoder
Geocoder (noun): A piece of software or a (web) service that implements a geocoding process i.e. a set of interrelated components in the form of operations, algorithms, and data sources that work together to produce a spatial representation for descriptive locational references.
Geocoding
Geocoding is the process of converting addresses (like a street address) into geographic coordinates (like latitude and longitude), which you can use to place markers on a map, or position the map.
Reverse Geocoding
Reverse geocoding is the process of converting geographic coordinates into a human-readable address. The Google Maps Geocoding API's reverse geocoding service also lets you find the address for a given place ID.
Application Programming Interface (API)
Application Programming Interface (API) is a set of subroutine definitions, protocols, and tools for building application software. In general terms, it is a set of clearly defined methods of communication between various software components. A good API makes it easier to develop a computer program by providing all the building blocks, which are then put together by the programmer.
Documentation
You can access the full documentation here:
License
This project was created under the MIT license. You can read the license here:
Feel free to contribute by commenting, suggesting, creating issues or sending pull requests. Any help is welcome.
Contributing
- Create an issue (optional)
- Fork the repo
- Make your changes
- Commit your changes (
git commit -am 'Some cool feature'
) - Push to the branch (
git push origin master
) - Create a new Pull Request
Using Goroutines
With a little more effort you can use goroutines with channels:
package main
import (
"fmt"
"time"
"github.com/kelvins/geocoder"
)
func geocodingChannel(address geocoder.Address, locationChan chan geocoder.Location, errChan chan error) {
fmt.Println("Entering geocodingChannel function...")
defer fmt.Println("Exiting geocodingChannel function...")
defer close(locationChan)
defer close(errChan)
location, err := geocoder.Geocoding(address)
locationChan <- location
errChan <- err
}
func geocodingReverseChannel(location geocoder.Location, addressesChan chan []geocoder.Address, errChan chan error) {
fmt.Println("Entering geocodingReverseChannel function...")
defer fmt.Println("Exiting geocodingReverseChannel function...")
defer close(addressesChan)
defer close(errChan)
addresses, err := geocoder.GeocodingReverse(location)
addressesChan <- addresses
errChan <- err
}
func main() {
address := geocoder.Address{
Street: "Central Park West",
Number: 115,
City: "New York",
State: "New York",
Country: "United States",
}
locationChan := make(chan geocoder.Location)
errChan := make(chan error)
go geocodingChannel(address, locationChan, errChan)
for index := 0; index < 5; index++ {
fmt.Println(index)
time.Sleep(50 * time.Millisecond)
}
location := <-locationChan
err := <-errChan
if err != nil {
fmt.Println("Could not get the location: ", err)
} else {
fmt.Println("Latitude: ", location.Latitude)
fmt.Println("Longitude: ", location.Longitude)
}
location = geocoder.Location{
Latitude: 40.775807,
Longitude: -73.97632,
}
addressesChan := make(chan []geocoder.Address)
errChan = make(chan error)
go geocodingReverseChannel(location, addressesChan, errChan)
for index := 0; index < 5; index++ {
fmt.Println(index)
time.Sleep(50 * time.Millisecond)
}
addresses := <-addressesChan
err = <-errChan
if err != nil {
fmt.Println("Could not get the addresses: ", err)
} else {
fmt.Println(addresses[0].FormattedAddress)
}
}