geocoder-php/bing-maps-provider
Bing Maps provider for PHP Geocoder. Adds forward and reverse geocoding using Microsoft Bing Maps APIs, returning standardized Geocoder results. Plug into geocoder-php with your Bing key for address lookup and coordinates.
Installation:
composer require geocoder-php/bing-maps-provider
Ensure geocoder-php/geocoder is also installed (required dependency).
First Use Case:
use Geocoder\Geocoder;
use Geocoder\Provider\BingMaps\BingMaps;
$geocoder = new Geocoder();
$geocoder->registerProvider(new BingMaps('YOUR_BING_MAPS_API_KEY'));
// Reverse geocode (lat/lng → address)
$results = $geocoder->reverseQuery('51.5074, -0.1278');
// Forward geocode (address → lat/lng)
$results = $geocoder->query('1600 Amphitheatre Parkway, Mountain View');
Where to Look First:
BingMaps::class source code (focus on createClient(), getApiKey(), and query() methods).geocoder-php/geocoder docs for provider-agnostic patterns (e.g., result handling, fallbacks).Provider Registration:
$geocoder = new Geocoder();
$geocoder->registerProvider(new BingMaps(config('services.bing.key')));
.env (e.g., BING_MAPS_API_KEY=your_key_here).$provider = new BingMaps($apiKey);
$geocoder->registerProvider($provider);
Result Handling:
Geocoder\Result\ResultSet:
foreach ($results as $result) {
$coordinates = $result->getCoordinates(); // \Geocoder\Result\Address::getCoordinates()
$formattedAddress = $result->getFormattedAddress();
}
ResultSet::getResults().Fallbacks and Caching:
$geocoder->registerProvider(new \Geocoder\Provider\GoogleMaps\GoogleMaps($googleKey));
$geocoder->registerProvider(new BingMaps($bingKey));
Geocoder\Cache\Cache (e.g., Redis):
$cache = new \Geocoder\Cache\RedisCache($redisClient, 3600);
$geocoder->registerCache($cache);
Batch Processing:
Geocoder\Provider\MultiProvider for bulk queries:
$multiProvider = new \Geocoder\Provider\MultiProvider([
new BingMaps($bingKey),
new \Geocoder\Provider\OpenStreetMap\OpenStreetMap(),
]);
$geocoder->registerProvider($multiProvider);
AppServiceProvider:
$this->app->singleton(Geocoder::class, function ($app) {
$geocoder = new Geocoder();
$geocoder->registerProvider(new BingMaps(config('services.bing.key')));
return $geocoder;
});
config('services.bing.key') to avoid hardcoding.use GuzzleHttp\Exception\RequestException;
try {
$results = $geocoder->query('...');
} catch (RequestException $e) {
if ($e->getCode() === 429) {
sleep(2); // Retry after delay
$results = $geocoder->query('...');
}
}
API Key Restrictions:
https://dev.virtualearth.net/REST/v1/).Rate Limits:
Response Parsing:
// Example: Accessing raw Bing data
$rawData = $result->getData(); // \stdClass object
$bounds = $rawData->ResourceSets[0]->Resources[0]->Bbox;
Timeouts:
$client = new \GuzzleHttp\Client(['timeout' => 60]);
$provider = new BingMaps($apiKey, $client);
Character Encoding:
Café) may fail. URL-encode queries:
$encodedQuery = urlencode('Café de la Paix, Paris');
$results = $geocoder->query($encodedQuery);
$client = new \GuzzleHttp\Client([
'debug' => fopen('bing_debug.log', 'w'),
]);
BingMaps::createClient() to log requests/responses:
$provider->setClient($client);
$provider->setLogger(new \Monolog\Logger('bing'));
Custom Endpoints: Override the base URL for testing/staging:
$provider = new BingMaps($apiKey, null, 'https://sandbox.dev.virtualearth.net/REST/v1/');
Result Transformers:
Extend Geocoder\Provider\BingMaps\BingMaps to modify responses:
class CustomBingMaps extends BingMaps {
protected function parseResults($data) {
// Custom logic (e.g., reformat addresses)
return parent::parseResults($data);
}
}
Fallback Logic:
Implement a custom Geocoder\Provider\ProviderInterface to chain Bing with other providers:
class BingFallbackProvider implements ProviderInterface {
public function query($query) {
try {
return $this->bingProvider->query($query);
} catch (Exception $e) {
return $this->fallbackProvider->query($query);
}
}
}
Testing: Use a mock client for unit tests:
$mock = Mockery::mock(\GuzzleHttp\Client::class);
$mock->shouldReceive('get')->andReturn(new \GuzzleHttp\Psr7\Response(200, [], file_get_contents('tests/fixtures/bing_response.json')));
$provider = new BingMaps($apiKey, $mock);
Address.Locality) may return mixed case. Normalize with:
$locality = strtolower($result->getLocality());
if (empty($results->getResults())) {
throw new \RuntimeException('No results found for query.');
}
$lat = round($coordinates->getLatitude(), 6);
How can I help you explore Laravel packages today?