geocoder-php/mapquest-provider
MapQuest provider for the Geocoder PHP library. Adds forward and reverse geocoding via MapQuest’s API so you can convert addresses to coordinates (and back) in a consistent Geocoder interface, using your MapQuest API key and configuration options.
Installation
composer require geocoder-php/mapquest-provider
Ensure geocoder-php/geocoder is also installed (required dependency).
Basic Usage
use Geocoder\Geocoder;
use Geocoder\Provider\MapQuest\MapQuest;
$geocoder = new Geocoder();
$geocoder->registerProvider(new MapQuest('YOUR_MAPQUEST_API_KEY'));
// Geocode an address
$results = $geocoder->geocode('1600 Amphitheatre Parkway, Mountain View, CA');
foreach ($results as $result) {
echo $result->getCoordinates(); // Output: [37.422, -122.084]
}
First Use Case
$coordinates = [37.422, -122.084];
$results = $geocoder->reverse($coordinates);
MapQuest class in src/Provider/MapQuest/MapQuest.php for API specifics.config/geocoder.php if using Laravel’s geocoder package.Batch Geocoding
$addresses = ['Address 1', 'Address 2'];
$results = $geocoder->geocodeBatch($addresses);
Error Handling
try {
$results = $geocoder->geocode('Invalid Address');
} catch (\Geocoder\Exception\UnsupportedProviderException $e) {
// Fallback to another provider
}
Laravel Integration
php artisan vendor:publish --provider="Geocoder\Laravel\GeocoderServiceProvider"
.env:
GEOCODER_MAPQUEST_KEY=your_api_key_here
Caching Responses Use Laravel’s cache or Geocoder’s built-in caching:
$geocoder->registerProvider(new MapQuest('key', ['cache' => true]));
$geocoder->registerProvider(new MapQuest('key'));
$geocoder->registerProvider(new \Geocoder\Provider\GoogleMaps\GoogleMaps('google_key'));
Result class to parse MapQuest-specific fields (e.g., adminArea5 for county).API Key Exposure
.env or a secrets manager.Rate Limits
429 Too Many Requests. Implement exponential backoff:
use Symfony\Component\HttpClient\RetryableHttpClient;
$client = new RetryableHttpClient(null, [
'max_retries' => 3,
'delay' => 1000,
]);
Deprecated Endpoints
Coordinate Precision
$lat = round($result->getLatitude(), 4);
Enable Debugging
$geocoder->registerProvider(new MapQuest('key', ['debug' => true]));
Logs HTTP requests/responses to storage/logs/geocoder.log.
Check HTTP Status Codes MapQuest returns:
200: Success.400: Invalid request (e.g., malformed address).401: Invalid API key.500: Server error.Custom Provider Logic
Override the MapQuest class to modify request/response handling:
class CustomMapQuest extends \Geocoder\Provider\MapQuest\MapQuest {
protected function createClient() {
return new \GuzzleHttp\Client(['timeout' => 30]);
}
}
Add New Fields
Extend the Result class to include MapQuest-specific data:
class MapQuestResult extends \Geocoder\Model\Result {
public function getAdminArea5() {
return $this->getExtraProperties()['adminArea5'] ?? null;
}
}
Mocking for Tests
Use Geocoder\Provider\MockProvider to simulate responses:
$geocoder->registerProvider(new \Geocoder\Provider\MockProvider([
'1600 Amphitheatre Parkway' => [[37.422, -122.084]]
]));
[
'key' => null, // Required
'host' => 'www.mapquestapi.com',
'timeout' => 10,
'locale' => 'en-US',
'cache' => false,
]
Override via constructor or registerProvider():
$geocoder->registerProvider(new MapQuest('key', ['locale' => 'es-ES']));
How can I help you explore Laravel packages today?