opencage / geocode
A PHP library for geocoding via the OpenCage Geocoder API
Requires
- php: >=8.2
- guzzlehttp/guzzle: ^7.0
Requires (Dev)
- phpstan/phpstan: ^2.0
- phpunit/phpunit: ^12.5.8
- squizlabs/php_codesniffer: ^3.7 || ^4.0
This package is auto-updated.
Last update: 2026-06-08 19:31:14 UTC
README
A PHP library to use the OpenCage geocoding API.
Build Status / Code Quality
Overview
This library uses Guzzle to access the OpenCage Geocoding API. Both synchronous and asynchronous requests are supported.
Authentication
You need an API key, which you can sign up for here.
Tutorial
You can find a comprehensive tutorial for using this module on the OpenCage site.
Working with AI / Agent Skill
There is an Agent Skill for working with the OpenCage Geocoding API which includes a reference file for developing in PHP using this library.
Installation
Requires PHP 8.2 or newer.
With Composer
The recommended - and easiest way - to install is via Composer.
Require the library in your project's composer.json file.
$ composer require opencage/geocode
Import the Geocoder class.
require "vendor/autoload.php";
The old fashioned way
See the file demo/geocode.php
Geocoding
$geocoder = new \OpenCage\Geocoder\Geocoder('YOUR-API-KEY'); $result = $geocoder->geocode('82 Clerkenwell Road, London'); print_r($result);
Reverse geocoding
$geocoder = new \OpenCage\Geocoder\Geocoder('YOUR-API-KEY'); $result = $geocoder->geocodeReverse(43.831, 4.360); # latitude, longitude print $result['results'][0]['formatted']; // 3 Rue de Rivarol, 30020 Nîmes, France
Set optional parameters
See the full list at: https://opencagedata.com/api#optional-params
$result = $geocoder->geocode('6 Rue Massillon, 30020 Nîmes, France', [ 'language' => 'fr', 'countrycode' => 'fr' ]); if ($result && $result['total_results'] > 0) { $first = $result['results'][0]; print $first['geometry']['lng'] . ';' . $first['geometry']['lat'] . ';' . $first['formatted'] . "\n"; // 4.360081;43.8316276;6 Rue Massillon, 30020 Nîmes, Frankreich }
Async geocoding
$geocoder = new \OpenCage\Geocoder\Geocoder('YOUR-API-KEY'); // single async request $promise = $geocoder->geocodeAsync('82 Clerkenwell Road, London'); $result = $promise->wait(); print_r($result); // concurrent requests $promises = [ 'london' => $geocoder->geocodeAsync('London'), 'paris' => $geocoder->geocodeAsync('Paris'), 'tokyo' => $geocoder->geocodeAsync('Tokyo'), ]; $results = \GuzzleHttp\Promise\Utils::unwrap($promises); print $results['london']['results'][0]['formatted']; print $results['paris']['results'][0]['formatted']; print $results['tokyo']['results'][0]['formatted']; // async reverse geocoding $promise = $geocoder->geocodeReverseAsync(43.831, 4.360); $result = $promise->wait(); print $result['results'][0]['formatted'];
Configuration
Set a timeout
$geocoder = new \OpenCage\Geocoder\Geocoder('YOUR-API-KEY'); $geocoder->setTimeout(5); // seconds, default is 10 $result = $geocoder->geocode('82 Clerkenwell Road, London');
Set a proxy URL
The proxy URL must include a scheme (http, https, or socks5) and a host.
$geocoder = new \OpenCage\Geocoder\Geocoder('YOUR-API-KEY'); $geocoder->setProxy('https://proxy.example.com:1234'); $result = $geocoder->geocode("Brandenburger Tor, Berlin"); print_r($result['results'][0]['formatted']); // Brandenburger Tor, Unter den Linden, 10117 Berlin, Germany print_r($result['results'][0]['geometry']); // Array // ( // [lat] => 52.5166047 // [lng] => 13.3809897 // )
Example results
Array ( [total_results] => 2 [status] => Array ( [message] => OK [code] => 200 ) [results] => Array ( [0] => Array ( [annotations] => Array ( [DMS] => Array ( [lat] => 51° 31' 21.60894'' N [lng] => 0° 6' 8.95198'' E ) [MGRS] => 30UYC0100511930 [Maidenhead] => IO91wm75qk [Mercator] => Array ( [x] => -11408.763 [y] => 6680801.955 ) [OSGB] => Array ( [easting] => 531628.199 [gridref] => TQ 316 821 [northing] => 182177.015 ) [OSM] => Array ( [url] => http://www.openstreetmap.org/?mlat=51.52267&mlon=-0.10249#map=17/51.52267/-0.10249 ) [callingcode] => 44 [geohash] => gcpvjemm7csmhczg9cvt [sun] => Array ( [rise] => Array ( [apparent] => 1452931140 [astronomical] => 1452923940 [civil] => 1452928800 [nautical] => 1452926280 ) [set] => Array ( [apparent] => 1452961320 [astronomical] => 1452968520 [civil] => 1452963660 [nautical] => 1452966120 ) ) [timezone] => Array ( [name] => Europe/London [now_in_dst] => 0 [offset_sec] => 0 [offset_string] => 0 [short_name] => GMT ) [what3words] => Array ( [words] => gallons.trim.tips ) ) [bounds] => Array ( [northeast] => Array ( [lat] => 51.5227563 [lng] => -0.1023801 ) [southwest] => Array ( [lat] => 51.5226042 [lng] => -0.1025907 ) ) [components] => Array ( [city] => London [country] => United Kingdom [country_code] => gb [house_number] => 82 [postcode] => EC1M 5RF [road] => Clerkenwell Road [state] => England [state_district] => Greater London [suburb] => Clerkenwell ) [confidence] => 10 [formatted] => 82 Clerkenwell Road, London EC1M 5RF, United Kingdom [geometry] => Array ( [lat] => 51.52266915 [lng] => -0.10248666188363 ) ) [1] => Array ( [annotations] => Array ( [DMS] => Array ( [lat] => 51° 30' 30.70800'' N [lng] => 0° 7' 32.66400'' E ) [MGRS] => 30UXC9945410295 [Maidenhead] => IO91wm42vb [Mercator] => Array ( [x] => -13997.313 [y] => 6678279.278 ) [OSGB] => Array ( [easting] => 530055.544 [gridref] => TQ 300 805 [northing] => 180563.298 ) [OSM] => Array ( [url] => http://www.openstreetmap.org/?mlat=51.50853&mlon=-0.12574#map=17/51.50853/-0.12574 ) [geohash] => gcpvj0u6yjcmwxz8bn43 [sun] => Array ( [rise] => Array ( [apparent] => 1452931140 [astronomical] => 1452923940 [civil] => 1452928800 [nautical] => 1452926340 ) [set] => Array ( [apparent] => 1452961320 [astronomical] => 1452968520 [civil] => 1452963660 [nautical] => 1452966120 ) ) [timezone] => Array ( [name] => Europe/London [now_in_dst] => 0 [offset_sec] => 0 [offset_string] => 0 [short_name] => GMT ) [what3words] => Array ( [words] => thing.then.link ) ) [bounds] => Array ( [northeast] => Array ( [lat] => 51.7202301025 [lng] => 0.336111992598 ) [southwest] => Array ( [lat] => 51.2786598206 [lng] => -0.523222982883 ) ) [components] => Array ( [country] => United Kingdom [county] => Greater London [state] => England [town] => London ) [confidence] => 1 [formatted] => London, Greater London, United Kingdom [geometry] => Array ( [lat] => 51.50853 [lng] => -0.12574 ) ) ) )
Copyright
Copyright (c) OpenCage GmbH. See LICENSE for details.
Who is OpenCage GmbH?
We run a worldwide geocoding API and geosearch service based on open data. Learn more about us.
We also run Geomob, a series of regular meetups for location based service creators, where we do our best to highlight geoinnovation. If you like geo stuff, you will probably enjoy the Geomob podcast.
-- end --
