maarheeze / geocode
addresses in, coordinates out — a tiny, typed geocoding wrapper
Requires
- php: ^8.3
- guzzlehttp/guzzle: ^7.12
- spatie/geocoder: ^4.0
Requires (Dev)
- fakerphp/faker: ^1.24
- maarheeze/phpcs: ^1.0
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^12
README
A tiny, typed geocoding wrapper.
Turn an address string into latitude/longitude coordinates behind a single, clean interface—no array digging, no magic numbers, just a typed result or null. Pick a backend by name: the worldwide Google Maps Geocoding API, or the key-free Dutch PDOK Locatieserver.
Why use it?
- Typed result: get a
Coordinatesobject withfloat $latitudeandfloat $longitude, not a loose array - Interface-first: depend on the
Geocodeinterface, swap implementations or mock it in tests - Pluggable drivers: choose a backend by name when you build the factory
- No surprises: returns
nullwhen an address can't be resolved instead of(0, 0)coordinates
Installation
composer require maarheeze/geocode
Drivers
Select a driver by passing its name to GeocodeFactory::create():
| Driver | Backend | Parameters | Coverage |
|---|---|---|---|
google |
Google Maps Geocoding API | apiKey |
Worldwide |
pdok |
PDOK Locatieserver | none | Netherlands only |
Note: the
pdokdriver is Netherlands-only — it resolves Dutch addresses without any API key, but returns nothing for addresses elsewhere. It's a convenient key-free option when you only geocode Dutch addresses; the
Usage
Build a Geocode instance with GeocodeFactory::create(), passing the driver name and its parameters. It wires up the underlying HTTP client and driver for you:
use Maarheeze\Geocode\GeocodeFactory; $geocode = GeocodeFactory::create('google', ['apiKey' => 'your-google-maps-api-key']); $result = $geocode->getCoordinatesForAddress('Stationsstraat 1, Maarheeze'); if ($result === null) { return; } echo $result->latitude; echo $result->longitude;
Distance between two addresses
Geocode two addresses and measure the distance between them:
use Maarheeze\Geocode\GeocodeFactory; $geocode = GeocodeFactory::create('pdok'); $eindhoven = $geocode->getCoordinatesForAddress('Eindhoven'); $maarheeze = $geocode->getCoordinatesForAddress('Maarheeze'); if ($eindhoven === null || $maarheeze === null) { return; } echo $eindhoven->distanceTo($maarheeze)->asKilometers(); // e.g. 18.7
API
Geocode::getCoordinatesForAddress(string $address): ?Coordinates
Resolves an address to coordinates. Returns a Coordinates object on success, or null when the address can't be geocoded.
Throws Maarheeze\Geocode\GeocodingFailed when the lookup itself fails—a transport error or an error returned by the geocoding service (e.g. an invalid API key or exceeded quota). A null result means "not found"; an exception means "could not look up".
Coordinates
A readonly value object holding the result:
float $latitudefloat $longitude
Coordinates::distanceTo(Coordinates $other): Distance
Returns the great-circle distance to another point (Haversine) as a Distance.
Distance
A readonly value object wrapping a distance, with unit-explicit accessors:
asMeters(): floatasKilometers(): float
License
MIT