# Geocoder
[](https://github.com/arferreira/geocoder/actions/workflows/ci.yml)
[](https://coveralls.io/github/arferreira/geocoder?branch=main)
Rust crate that provides an easy way to use the Google Geocoding API.
See more information about the **Google Geocoding API** at the following link: [Google Geocoding API](https://developers.google.com/maps/documentation/geocoding/start)
## Installation
Add this to your `Cargo.toml`:
```toml
[dependencies]
geocoder = "0.1.0"
```
## Usage
Example of usage:
```rust
use geocoder::Geocoder;
use std::env;
#[tokio::main]
async fn main() {
// Set your API key as an environment variable.
let api_key = env::var("GEOCODER_API_KEY").expect("GEOCODER_API_KEY must be set");
// Create a new Geocoder instance.
let geocoder = Geocoder::new(&api_key);
// Geocode an address to a location (latitude, longitude).
match geocoder.geocode("1600 Amphitheatre Parkway, Mountain View, CA").await {
Ok(address) => {
println!("Formatted address: {}", address.formatted_address);
}
Err(e) => eprintln!("Error: {}", e),
}
}
```
## Examples
Convert an address to a latitude and longitude:
```rust
use geocoder::Geocoder;
use std::env;
#[tokio::main]
async fn main() {
let api_key = env::var("GEOCODER_API_KEY").expect("GEOCODER_API_KEY must be set");
let geocoder = Geocoder::new(&api_key);
match geocoder.geocode("1600 Amphitheatre Parkway, Mountain View, CA").await {
Ok(address) => {
println!("Formatted address: {}", address.formatted_address);
println!("Latitude: {}", address.geometry.location.lat);
println!("Longitude: {}", address.geometry.location.lng);
}
Err(e) => eprintln!("Error: {}", e),
}
}
```
Reverse Geocoding
Convert a latitude and longitude to an address:
```rust
use geocoder::{Geocoder, structs::LatLng};
use std::env;
#[tokio::main]
async fn main() {
let api_key = env::var("GEOCODER_API_KEY").expect("GEOCODER_API_KEY must be set");
let geocoder = Geocoder::new(&api_key);
let location = LatLng { lat: 37.4224764, lng: -122.0842499 };
match geocoder.reverse_geocode(location).await {
Ok(addresses) => {
if let Some(address) = addresses.first() {
println!("Formatted address: {}", address.formatted_address);
}
}
Err(e) => eprintln!("Error: {}", e),
}
}
```
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## 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 async functions
With a little more effort you can use **async** functions with **tokio**:
```rust
use geocoder::Geocoder;
use std::env;
use tokio::task;
async fn geocode_address(geocoder: Geocoder, address: &str) {
match geocoder.geocode(address).await {
Ok(result) => {
println!("Formatted address: {}", result.formatted_address);
}
Err(e) => eprintln!("Error: {}", e),
}
}
#[tokio::main]
async fn main() {
let api_key = env::var("GEOCODER_API_KEY").expect("GEOCODER_API_KEY must be set");
let geocoder = Geocoder::new(&api_key);
let address = "1600 Amphitheatre Parkway, Mountain View, CA";
let handle = task::spawn(async move {
geocode_address(geocoder, address).await;
});
handle.await.unwrap();
}
```