Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/kelvins/geocoder
:earth_americas: GoLang package that provides an easy way to use the Google Geocoding API
https://github.com/kelvins/geocoder
api geocoder geocoding geocoding-api go golang google google-api
Last synced: 4 days ago
JSON representation
:earth_americas: GoLang package that provides an easy way to use the Google Geocoding API
- Host: GitHub
- URL: https://github.com/kelvins/geocoder
- Owner: kelvins
- License: mit
- Created: 2017-05-06T03:48:16.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2023-11-12T13:08:12.000Z (about 1 year ago)
- Last Synced: 2024-10-30T23:43:16.300Z (14 days ago)
- Topics: api, geocoder, geocoding, geocoding-api, go, golang, google, google-api
- Language: Go
- Homepage: https://developers.google.com/maps/
- Size: 33.2 KB
- Stars: 53
- Watchers: 3
- Forks: 25
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Geocoder
[![Build Status](https://travis-ci.org/kelvins/geocoder.svg?branch=master)](https://travis-ci.org/kelvins/geocoder)
[![Coverage Status](https://coveralls.io/repos/github/kelvins/geocoder/badge.svg?branch=master)](https://coveralls.io/github/kelvins/geocoder?branch=master)
[![Go Report Card](https://goreportcard.com/badge/github.com/kelvins/geocoder)](https://goreportcard.com/report/github.com/kelvins/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:
``` go
package mainimport (
"fmt""github.com/kelvins/geocoder"
)func main() {
// This example should work without need of an API Key,
// but when you will use the API in your project you need
// to set your API KEY as explained here:
// https://developers.google.com/maps/documentation/geocoding/get-api-key
// geocoder.ApiKey = "YOUR_API_KEY"// See all Address fields in the documentation
address := geocoder.Address{
Street: "Central Park West",
Number: 115,
City: "New York",
State: "New York",
Country: "United States",
}// Convert address to location (latitude, longitude)
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)
}// Set the latitude and longitude
location = geocoder.Location{
Latitude: 40.775807,
Longitude: -73.97632,
}// Convert location (latitude, longitude) to a slice of addresses
addresses, err := geocoder.GeocodingReverse(location)if err != nil {
fmt.Println("Could not get the addresses: ", err)
} else {
// Usually, the first address returned from the API
// is more detailed, so let's work with it
address = addresses[0]// Print the address formatted by the geocoder package
fmt.Println(address.FormatAddress())
// Print the formatted address from the API
fmt.Println(address.FormattedAddress)
// Print the type of the address
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.](https://en.wikipedia.org/wiki/Geocoding)
#### 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.](https://developers.google.com/maps/documentation/geocoding/start)
#### 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.](https://developers.google.com/maps/documentation/geocoding/start)
#### 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.](https://en.wikipedia.org/wiki/Application_programming_interface)
## Documentation
You can access the full documentation here: [![GoDoc](https://godoc.org/github.com/kelvins/geocoder?status.svg)](https://godoc.org/github.com/kelvins/geocoder)
## License
This project was created under the **MIT license**. You can read the license here: [![License: MIT](https://img.shields.io/badge/License-MIT-brightgreen.svg)](LICENSE)
Feel free to contribute by commenting, suggesting, creating issues or sending pull requests. Any help is welcome.
## Contributing
1. Create an issue (optional)
2. Fork the repo
3. Make your changes
4. Commit your changes (`git commit -am 'Some cool feature'`)
5. Push to the branch (`git push origin master`)
6. Create a new Pull Request## Using Goroutines
With a little more effort you can use **goroutines** with **channels**:
``` go
package mainimport (
"fmt"
"time""github.com/kelvins/geocoder"
)// Use the channels system to call the Geocoding function
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
}// Use the channels system to call the GeocodingReverse function
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() {
// See all Address fields in the documentation
address := geocoder.Address{
Street: "Central Park West",
Number: 115,
City: "New York",
State: "New York",
Country: "United States",
}// Make the channels
locationChan := make(chan geocoder.Location)
errChan := make(chan error)// Call the go routine
go geocodingChannel(address, locationChan, errChan)// Do whatever you need to do
for index := 0; index < 5; index++ {
fmt.Println(index)
time.Sleep(50 * time.Millisecond)
}// Get the results
location := <-locationChan
err := <-errChan// Check if the results are valid
if err != nil {
fmt.Println("Could not get the location: ", err)
} else {
fmt.Println("Latitude: ", location.Latitude)
fmt.Println("Longitude: ", location.Longitude)
}// Set the latitude and longitude
location = geocoder.Location{
Latitude: 40.775807,
Longitude: -73.97632,
}// Make the channels
addressesChan := make(chan []geocoder.Address)
errChan = make(chan error)// Call the go routine
go geocodingReverseChannel(location, addressesChan, errChan)// Do whatever you need to do
for index := 0; index < 5; index++ {
fmt.Println(index)
time.Sleep(50 * time.Millisecond)
}// Get the results
addresses := <-addressesChan
err = <-errChan// Check if the results are valid
if err != nil {
fmt.Println("Could not get the addresses: ", err)
} else {
fmt.Println(addresses[0].FormattedAddress)
}
}
```