geocoder-php/here-provider
HERE provider for the Geocoder PHP library. Adds forward and reverse geocoding via HERE APIs, returning consistent Geocoder results for addresses, places, and coordinates. Intended for use with geocoder-php adapters and your HERE credentials.
Installation
composer require geocoder-php/here-provider
Ensure geocoder-php/geocoder is also installed (required dependency).
First Use Case: Reverse Geocoding
use Geocoder\Geocoder;
use Geocoder\Provider\Here\HereProvider;
$geocoder = new Geocoder();
$geocoder->registerProvider(new HereProvider('YOUR_HERE_API_KEY'));
$result = $geocoder->reverseQuery('52.5170365,13.3888601');
dd($result->getCoordinates(), $result->getDescription());
Where to Look First
HereProvider class source: Focus on query(), reverseQuery(), and geocodeQuery() methods.Geocoding (Address → Coordinates)
$result = $geocoder->geocodeQuery('100 Broadway, New York, NY');
$coordinates = $result->getCoordinates(); // [lat, lng]
Reverse Geocoding (Coordinates → Address)
$result = $geocoder->reverseQuery('52.5170365,13.3888601');
$address = $result->getDescription(); // "Brandenburg Gate, Berlin, Germany"
Batch Processing
$addresses = ['100 Broadway', '221B Baker St'];
$results = $geocoder->batchGeocodeQuery($addresses);
Fallback Providers
$geocoder->registerProvider(new HereProvider('API_KEY'));
$geocoder->registerProvider(new \Geocoder\Provider\GoogleMaps\GoogleMapsProvider('GOOGLE_API_KEY'));
$result = $geocoder->geocodeQuery('Invalid Address'); // Falls back to Google if Here fails.
Caching Responses Use Laravel’s cache to avoid hitting API limits:
$cacheKey = 'here_geocode_' . md5($address);
$result = Cache::remember($cacheKey, now()->addHours(1), function () use ($geocoder, $address) {
return $geocoder->geocodeQuery($address);
});
Rate Limiting Here’s API has strict limits (e.g., 100,000 requests/month for free tier). Log requests and monitor usage:
$geocoder->registerProvider(new HereProvider('API_KEY', [
'logger' => new \Monolog\Logger('here'),
]));
Customizing HTTP Client Override the default Guzzle client for retries/timeouts:
$client = new \GuzzleHttp\Client([
'timeout' => 10,
'connect_timeout' => 5,
]);
$provider = new HereProvider('API_KEY', ['client' => $client]);
API Key Restrictions
*) in the allowed domains during development, then restrict to production domains.Response Parsing Errors
items array) can break parsing.$provider->getClient()->getConfig('debug');
Coordinate Order
[longitude, latitude] by default, but Geocoder expects [latitude, longitude].Geocoder\Provider\Normalizer\Normalizer to standardize coordinates.Rate Limit Headers
X-RateLimit-* headers can lead to sudden API failures.$response = $provider->getClient()->request('GET', $url);
$remainingRequests = $response->getHeader('X-RateLimit-Remaining')[0];
Enable Debug Mode
$provider = new HereProvider('API_KEY', ['debug' => true]);
Logs raw requests/responses to storage/logs/geocoder.log.
Common HTTP Errors
| Error Code | Cause | Solution |
|---|---|---|
| 401 | Invalid API key | Regenerate key in Here’s Developer Portal. |
| 403 | IP/domain not whitelisted | Update allowed domains in API settings. |
| 429 | Rate limit exceeded | Wait or upgrade plan. |
| 500 | Internal server error | Retry with exponential backoff. |
Custom Response Normalization
Extend HereProvider to handle non-standard responses:
class CustomHereProvider extends HereProvider {
protected function parseResponse($data) {
// Override to handle custom Here API response formats.
}
}
Adding Custom Fields
Extract additional fields from Here’s response (e.g., houseNumber, postalCode):
$result = $geocoder->reverseQuery('52.5170365,13.3888601');
$address = $result->getAddress();
$postalCode = $address->getPostalCode(); // Default
$houseNumber = $data['items'][0]['result']['address']['houseNumber']; // Custom
Mocking for Tests Use a mock HTTP client to avoid real API calls:
$mockHandler = new \GuzzleHttp\Handler\MockHandler([
new \GuzzleHttp\Psr7\Response(200, [], file_get_contents('tests/fixtures/here_response.json'))
]);
$client = new \GuzzleHttp\Client(['handler' => $mockHandler]);
$provider = new HereProvider('API_KEY', ['client' => $client]);
How can I help you explore Laravel packages today?