geocoder-php/mapbox-provider
Mapbox geocoding provider for Geocoder PHP. Forward and reverse geocoding via Mapbox APIs to turn addresses into coordinates and coordinates into places, for easy integration with the Geocoder framework in PHP projects.
Installation
composer require geocoder-php/mapbox-provider
Requires geocoder-php/geocoder (≥v3.0) as a dependency.
Basic Usage
use Geocoder\Geocoder;
use Geocoder\Provider\MapBoxProvider;
$geocoder = new Geocoder();
$geocoder->registerProvider(new MapBoxProvider('YOUR_MAPBOX_ACCESS_TOKEN'));
// Geocode an address
$results = $geocoder->geocode('1600 Pennsylvania Ave NW, Washington, DC');
foreach ($results as $hit) {
echo $hit->getCoordinates(); // Output: [lat, lng]
}
First Use Case
$results = $geocoder->reverse('38.9072', '-77.0369');
MapBoxProvider class in src/Provider/MapBoxProvider.php (for customization hooks).Batch Geocoding
$addresses = ['Address 1', 'Address 2'];
$results = $geocoder->geocodeBatch($addresses);
Customizing HTTP Client (for retries, middleware):
$client = new \GuzzleHttp\Client(['timeout' => 10]);
$provider = new MapBoxProvider('TOKEN', [], $client);
$geocoder->registerProvider($provider);
Caching Responses (avoid rate limits):
use Geocoder\Cache\DoctrineCache;
$cache = new DoctrineCache();
$geocoder->registerCache($cache);
Handling Pagination (for large datasets):
$provider->setOptions(['limit' => 50]); // MapBox API limit per request
public function register()
{
$this->app->singleton(Geocoder::class, function ($app) {
$geocoder = new Geocoder();
$geocoder->registerProvider(new MapBoxProvider(config('services.mapbox.token')));
return $geocoder;
});
}
// Dispatch a job to process addresses in bulk
GeocodeAddresses::dispatch($addresses)->onQueue('geocoding');
$geocoder->registerProvider(new \Geocoder\Provider\GoogleMapsProvider('GOOGLE_KEY'));
Rate Limits
X-RateLimit-Limit and X-RateLimit-Remaining headers.Token Leaks
.env:
MAPBOX_TOKEN=your_token_here
config('services.mapbox.token').Response Parsing
{
"type": "FeatureCollection",
"features": [...]
}
null or an empty FeatureCollection.Coordinate Order
[lng, lat] by default. Convert to [lat, lng]:
[$lat, $lng] = [$hit->getCoordinates()[1], $hit->getCoordinates()[0]];
Enable Debug Mode:
$provider->setOptions(['debug' => true]);
Logs raw HTTP requests/responses to storage/logs/geocoder.log.
Common HTTP Errors:
| Error | Cause | Fix |
|---|---|---|
401 Unauthorized |
Invalid token | Verify MAPBOX_TOKEN |
400 Bad Request |
Malformed query | URL-encode addresses |
429 Too Many Requests |
Rate limit exceeded | Implement caching/retries |
Custom Response Handling
Override MapBoxProvider::createResultFromData() to transform responses:
protected function createResultFromData($data)
{
// Add custom fields (e.g., MapBox's `place_name`)
$result = parent::createResultFromData($data);
$result->setAdditionalData($data['features'][0]['properties']);
return $result;
}
Mocking for Tests
$provider = new MapBoxProvider('TOKEN');
$provider->setClient(new \GuzzleHttp\HandlerStack());
$provider->setMockResponse(file_get_contents('tests/fixtures/mapbox_response.json'));
Geofencing Use MapBox’s Geocoding API with bounding boxes:
$provider->setOptions([
'bbox' => [-74.2591, 40.4774, -73.7002, 40.9176] // NYC bounds
]);
Performance
geocodeBatch() for >50 addresses.Laravel\Bus\Queueable.How can I help you explore Laravel packages today?