Installation
composer require antwebes/geocoder
Add the service provider in config/app.php:
'providers' => [
// ...
Antwebes\Geocoder\GeocoderServiceProvider::class,
],
Basic Usage
Locate the package’s config file at config/geocoder.php and set your preferred provider (e.g., OpenStreetMap or GoogleMaps). Example:
'providers' => [
'openstreetmap' => [
'enabled' => true,
'host' => 'nominatim.openstreetmap.org',
],
],
First Use Case Resolve an address to coordinates in a controller:
use Antwebes\Geocoder\Facades\Geocoder;
public function getCoordinates()
{
$result = Geocoder::geocode('1600 Amphitheatre Parkway, Mountain View, CA');
return $result->getCoordinates(); // Returns [lat, lng]
}
Geocoding (Address → Coordinates)
$coordinates = Geocoder::geocode('Paris, France')->getCoordinates();
Reverse Geocoding (Coordinates → Address)
$address = Geocoder::reverse('48.8566', '2.3522')->getAddress();
Batch Processing
Use collect() to process multiple addresses efficiently:
$addresses = ['New York', 'London', 'Tokyo'];
$results = collect($addresses)->map(fn($addr) => Geocoder::geocode($addr));
Fallback Providers
Configure multiple providers in config/geocoder.php and let the package auto-fallback:
'providers' => [
'openstreetmap' => ['enabled' => true],
'googlemaps' => ['enabled' => true, 'api_key' => env('GOOGLE_MAPS_API_KEY')],
],
Laravel Models Add accessors/mutators to models for seamless geocoding:
class Location extends Model
{
public function getCoordinatesAttribute()
{
return Geocoder::geocode($this->address)->getCoordinates();
}
}
Caching Cache geocoding results to avoid rate limits (e.g., OpenStreetMap’s 1 request/sec):
$coordinates = Cache::remember("geo_{$address}", now()->addHours(1), function() use ($address) {
return Geocoder::geocode($address)->getCoordinates();
});
Queue Jobs Offload geocoding to a queue for long-running tasks:
GeocodeJob::dispatch($address)->onQueue('geocoding');
class GeocodeJob implements ShouldQueue
{
public function handle()
{
$this->coordinates = Geocoder::geocode($this->address)->getCoordinates();
}
}
Rate Limits
Provider-Specific Quirks
user_agent in requests. Configure in config/geocoder.php:
'openstreetmap' => [
'user_agent' => 'my-app/1.0 (your-email@example.com)',
],
api_key and billing setup. Avoid hardcoding keys in config.Data Inconsistencies
getConfidence()):
if (Geocoder::geocode($address)->getConfidence() < 80) {
throw new \Exception('Low-confidence result');
}
Timeouts
max_execution_time or use async processing.Enable Logging
Add to config/geocoder.php:
'log' => true,
Check storage/logs/laravel.log for API responses/errors.
Mock Providers for Testing
Use the MockProvider in tests:
Geocoder::setProvider('mock');
Geocoder::mockResponse(['lat' => 40.7128, 'lng' => -74.0060]);
Custom Providers
Extend Antwebes\Geocoder\Providers\ProviderInterface to add new geocoding services (e.g., Mapbox, HERE Maps).
Response Parsing
Override default response handling by binding a custom ResponseParser:
Geocoder::setResponseParser(new CustomParser());
Middleware Add middleware to validate/transform requests/responses globally:
Geocoder::extend(function ($geocoder) {
$geocoder->getProvider()->addMiddleware(new ValidateAddressMiddleware());
});
How can I help you explore Laravel packages today?