geocoder-php/open-cage-provider
OpenCage provider for Geocoder PHP. Adds forward and reverse geocoding via the OpenCage Geocoding API, with address lookups by text or coordinates and results normalized to Geocoder’s model for easy integration in PHP apps.
composer require geocoder-php/open-cage-provider willdurand/geocoder
.env:
OPENCAGE_API_KEY=your_api_key_here
use Geocoder\Geocoder;
use Geocoder\ProviderManager;
public function geocodeAddress()
{
$geocoder = new ProviderManager();
$geocoder->registerProvider('opencage', new \Geocoder\Provider\OpenCage\OpenCageProvider(env('OPENCAGE_API_KEY')));
$results = $geocoder->geocode('1600 Amphitheatre Parkway, Mountain View');
$coordinates = $results->first()->getCoordinates();
return response()->json(['coordinates' => $coordinates]);
}
$results = $geocoder->reverse($coordinates);
$address = $results->first()->getFormattedAddress();
OpenCageProvider class).geocode(), reverse(), and address().bounded, language, confidence).Validate user input during form submission (e.g., signup or checkout):
public function validateAddress(Request $request)
{
$geocoder = app(ProviderManager::class);
$results = $geocoder->geocode($request->address);
if ($results->count() === 0) {
return back()->withErrors(['address' => 'Invalid address']);
}
return back()->with('success', 'Address validated');
}
Geocoding Workflow:
"123 Main St, Boston").geocode() with the address.Result objects with coordinates, formatted addresses, and confidence scores.$results = $geocoder->geocode('123 Main St, Boston', [
'parameters' => ['bounded' => 1, 'language' => 'en']
]);
Reverse Geocoding Workflow:
[42.3601, -71.0589]).reverse() with coordinates.Result objects with structured address components (street, city, country, etc.).$coordinates = [42.3601, -71.0589];
$results = $geocoder->reverse($coordinates);
$address = $results->first()->getAddress();
Ambiguity Handling:
parameters array to reduce ambiguous results (e.g., duplicate street names).$results = $geocoder->geocode('Main St', [
'parameters' => ['countrycode' => 'US', 'city' => 'Boston']
]);
Laravel Service Provider: Bind the provider to the container for reuse:
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->singleton(ProviderManager::class, function ($app) {
$manager = new ProviderManager();
$manager->registerProvider('opencage', new \Geocoder\Provider\OpenCage\OpenCageProvider(env('OPENCAGE_API_KEY')));
return $manager;
});
}
Now inject ProviderManager anywhere:
use Geocoder\ProviderManager;
public function __construct(private ProviderManager $geocoder) {}
Caching Responses: Cache geocoding results to reduce API calls (e.g., for static addresses like business locations):
public function getCachedGeocode(string $address)
{
return Cache::remember("geocode_{$address}", now()->addHours(1), function () use ($address) {
return $this->geocoder->geocode($address);
});
}
Batch Processing: Use Laravel queues to process bulk geocoding (e.g., importing a CSV of addresses):
// Dispatch a job
GeocodeAddressJob::dispatch($address)->onQueue('geocoding');
// Job class
public function handle()
{
$results = $this->geocoder->geocode($this->address);
// Store results in DB
}
Structured Address Access:
Extract components from OpenCageAddress (e.g., for database storage):
$address = $results->first()->getAddress();
$structured = [
'street' => $address->getStreetName(),
'city' => $address->getLocality(),
'country' => $address->getCountry(),
'geohash' => $address->getGeohash(),
'what3words' => $address->getWhat3Words(),
];
Confidence Filtering: Filter results by confidence score (added in v4.7.0):
$highConfidenceResults = $results->filter(function ($result) {
return $result->getConfidence() >= 7; // OpenCage confidence score (0-10)
});
| Use Case | Implementation Pattern | Example |
|---|---|---|
| User Onboarding | Validate address during signup. | Check geocode() results before saving user data. |
| Delivery Services | Geocode pickup/drop-off addresses. | Use geocode() + reverse() for real-time tracking. |
| Local Search | Find nearby locations (e.g., restaurants). | Combine with Laravel Scout or a spatial database (e.g., PostGIS). |
| Analytics | Enrich user data with geospatial metadata. | Store geohash or what3words in user profiles for regional analysis. |
| Compliance | Ensure accurate address data for shipping/tax. | Validate with geocode() and log confidence scores. |
API Key Management:
.env and restrict access to the file.env() helper.Rate Limiting:
Ambiguous Results:
parameters array to narrow results:
$results = $geocoder->geocode('Main St', [
'parameters' => ['countrycode' => 'US', 'city' => 'Boston']
]);
PHP Version Mismatch:
Caching Stale Data:
address_updated) to clear cache.Provider Registration:
How can I help you explore Laravel packages today?