Created
December 16, 2024 15:04
-
-
Save adactio/9e2be381bbcd1fe82e7a8add1bdec782 to your computer and use it in GitHub Desktop.
A PHP script that uses a third-party provider to get latitude, longitude, and zoom level (for use in embedded maps).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Pass in a string: geocode("The Jolly Brewer, Brighton, East Sussex England") | |
The output is an array with keys for "latitude", "longitude", and "zoom". | |
*/ | |
function geocode($location, $provider = "mapquest") { | |
$return = array(); | |
$_CONFIG['api_key'] = array( | |
"google" => "YOUR_API_KEY_FOR_GOOGLE", | |
"mapquest" => "YOUR_API_KEY_FOR_MAPQUEST", | |
"geoapify" => "YOUR_API_KEY_FOR_GEOAPIFY", | |
"here" => "YOUR_API_KEY_FOR_HERE.COM", | |
"mapbox" => "YOUR_API_KEY_FOR_MAPBOX", | |
"bing" => "YOUR_API_KEY_FOR_BING", | |
"nominatim" => "YOUR_API_KEY_FOR_NOMINATIM", | |
"opencage" => "YOUR_API_KEY_FOR_OPENCAGE", | |
"positionstack" => "YOUR_API_KEY_FOR_POSITIONSTACK", | |
"tomtom" => "YOUR_API_KEY_FOR_TOMTOM", | |
"locationiq" => "YOUR_API_KEY_FOR_LOCATIONIQ", | |
"mapmaker" => "YOUR_API_KEY_FOR_MAPMAKER" | |
); | |
/* In order of accuracy */ | |
switch ($provider) { | |
case 'google': | |
$url = "https://maps.googleapis.com/maps/api/geocode/json?address=".urlencode($location)."&key=".$_CONFIG['apikey']['google']; | |
break; | |
case 'mapquest': | |
$url = "https://www.mapquestapi.com/geocoding/v1/address?location=".urlencode($location)."&key=".$_CONFIG['apikey']['mapquest']; | |
break; | |
case 'geoapify': | |
$url = "https://api.geoapify.com/v1/geocode/search?text=".urlencode($location)."&format=json&apiKey=".$_CONFIG['apikey']['geoapify']; | |
break; | |
case 'here': | |
$url = "https://geocode.search.hereapi.com/v1/geocode?q=".urlencode($location)."&apiKey=".$_CONFIG['apikey']['here']; | |
break; | |
case 'mapbox': | |
$url = "https://api.mapbox.com/geocoding/v5/mapbox.places/".urlencode($location).".json?proximity=ip&access_token=".$_CONFIG['apikey']['mapbox']; | |
break; | |
case 'bing': | |
$url = "http://dev.virtualearth.net/REST/v1/Locations?query=".urlencode($location)."&key=".$_CONFIG['apikey']['bing']; | |
break; | |
case 'nominatim': | |
$url = "https://nominatim.openstreetmap.org/search?q=".urlencode($location)."&format=json&addressdetails=1"; | |
break; | |
case 'opencage': | |
$url = "https://api.opencagedata.com/geocode/v1/json?q=".urlencode($location)."&key=".$_CONFIG['apikey']['opencage']; | |
break; | |
case 'positionstack': | |
$url = "https://api.positionstack.com/v1/forward?query=".urlencode($location)."&access_key=".$_CONFIG['apikey']['positionstack']; | |
break; | |
case 'tomtom': | |
$url = "https://api.tomtom.com/search/2/geocode/".urlencode($location).".json?key=".$_CONFIG['apikey']['tomtom']; | |
break; | |
case 'locationiq': | |
$url = "https://eu1.locationiq.com/v1/search?q=".urlencode($location)."&format=json&key=".$_CONFIG['apikey']['locationiq']; | |
break; | |
case 'mapmaker': | |
$url = "https://geocode.maps.co/search?q=".urlencode($location)."&api_key=".$_CONFIG['apikey']['mapmaker']; | |
break; | |
} | |
$context = stream_context_create( | |
array( | |
'http' => array( | |
'method' => "GET", | |
'user_agent' => "Your user agent string", | |
) | |
) | |
); | |
$json = file_get_contents($url, false, $context); | |
$result = json_decode($json,true); | |
switch ($provider) { | |
case 'google': | |
$accuracy = array( | |
"ROOFTOP" => 16, | |
"RANGE_INTERPOLATED" => 14, | |
"GEOMETRIC_CENTER" => 14, | |
"APPROXIMATE" => 12 | |
); | |
if (isset($result['results'][0]['geometry']['location'])) { | |
$return['latitude'] = $result['results'][0]['geometry']['location']['lat']; | |
$return['longitude'] = $result['results'][0]['geometry']['location']['lng']; | |
$return['zoom'] = $accuracy[$result['results'][0]['geometry']['location_type']]; | |
} | |
break; | |
case 'mapquest': | |
if (isset($result['results'][0])) { | |
$return['latitude'] = $result['results'][0]['locations'][0]['latLng']['lat']; | |
$return['longitude'] = $result['results'][0]['locations'][0]['latLng']['lng']; | |
$return['zoom'] = 12; | |
switch ($result['results'][0]['locations'][0]['geocodeQuality']) { | |
case 'ADDRESS': | |
case 'INTERSECTION': | |
$return['zoom'] = 16; | |
break; | |
case 'STREET': | |
case 'NEIGHBORHOOD': | |
$return['zoom'] = 14; | |
break; | |
} | |
} | |
break; | |
case 'geoapify': | |
if (isset($result['results'][0])) { | |
$return['latitude'] = $result['results'][0]['lat']; | |
$return['longitude'] = $result['results'][0]['lon']; | |
$return['zoom'] = 12; | |
if ($result['results'][0]['rank']['confidence'] > 0.4) { | |
$return['zoom'] = 14; | |
} | |
if ($result['results'][0]['rank']['confidence'] > 0.7) { | |
$return['zoom'] = 16; | |
} | |
} | |
break; | |
case 'here': | |
if (isset($result['items'])) { | |
$return['latitude'] = $result['items'][0]['position']['lat']; | |
$return['longitude'] = $result['items'][0]['position']['lng']; | |
$return['zoom'] = 12; | |
if ($result['items'][0]['scoring']['queryScore'] > 0.6) { | |
$return['zoom'] = 14; | |
} | |
if ($result['items'][0]['scoring']['queryScore'] > 0.9) { | |
$return['zoom'] = 16; | |
} | |
} | |
case 'mapbox': | |
if (isset($result['features'][0])) { | |
$return['latitude'] = $result['features'][0]['center'][1]; | |
$return['longitude'] = $result['features'][0]['center'][0]; | |
$accuracy = array( | |
"poi" => 16, | |
"address" => 16, | |
"neighbourhood" => 16, | |
"locality" => 14, | |
"place" => 12, | |
"district" => 12, | |
"postcode" => 12, | |
"region" => 12, | |
"country" => 12 | |
); | |
$return['zoom'] = $accuracy[$result['features'][0]['place_type']['0']]; | |
} | |
break; | |
case 'bing': | |
$accuracy = array( | |
"High" => 16, | |
"Medium" => 14, | |
"Low" => 12 | |
); | |
if (isset($result['resourceSets'][0]['resources'][0])) { | |
$return['latitude'] = $result['resourceSets'][0]['resources'][0]['point']['coordinates'][0]; | |
$return['longitude'] = $result['resourceSets'][0]['resources'][0]['point']['coordinates'][1]; | |
$return['zoom'] = $accuracy[$result['resourceSets'][0]['resources'][0]['confidence']]; | |
} | |
break; | |
case 'nominatim': | |
if (isset($result[0])) { | |
$return['latitude'] = $result[0]['lat']; | |
$return['longitude'] = $result[0]['lon']; | |
$return['zoom'] = 12; | |
if (isset($return[0]['address']['road'])) { | |
$return['zoom'] = 14; | |
} | |
if (isset($return[0]['address']['house_number'])) { | |
$return['zoom'] = 16; | |
} | |
} | |
break; | |
case 'opencage': | |
if (isset($result['results'][0])) { | |
$return['latitude'] = $result['results'][0]['geometry']['lat']; | |
$return['longitude'] = $result['results'][0]['geometry']['lng']; | |
$return['zoom'] = 12; | |
if ($result['results'][0]['confidence'] > 4) { | |
$return['zoom'] = 14; | |
} | |
if ($result['results'][0]['confidence'] > 7) { | |
$return['zoom'] = 16; | |
} | |
} | |
break; | |
case 'positionstack': | |
if (isset($result['data'][0])) { | |
$return['latitude'] = $result['data'][0]['latitude']; | |
$return['longitude'] = $result['data'][0]['longitude']; | |
$return['zoom'] = 12; | |
if ($result['data'][0]['confidence'] > 0.5) { | |
$return['zoom'] = 14; | |
} | |
if ($result['data'][0]['confidence'] > 0.8) { | |
$return['zoom'] = 16; | |
} | |
} | |
break; | |
case 'tomtom'; | |
if (isset($result['results'][0])) { | |
$return['latitude'] = $result['results'][0]['position']['lat']; | |
$return['longitude'] = $result['results'][0]['position']['lon']; | |
$return['zoom'] = 12; | |
if ($result['results'][0]['matchConfidence']['score'] > 0.5) { | |
$return['zoom'] = 14; | |
} | |
if ($result['results'][0]['matchConfidence']['score'] > 0.8) { | |
$return['zoom'] = 16; | |
} | |
} | |
break; | |
case 'locationiq': | |
if (isset($result[0])) { | |
$return['latitude'] = $result[0]['lat']; | |
$return['longitude'] = $result[0]['lon']; | |
$return['zoom'] = 12; | |
} | |
break; | |
case 'mapmaker': | |
if (isset($result[0])) { | |
$return['latitude'] = $result[0]['lat']; | |
$return['longitude'] = $result[0]['lon']; | |
$return['zoom'] = 16; | |
$accuracy = ($result[0]['boundingbox'][1] - $result[0]['boundingbox'][0]) * 1000; | |
if ($accuracy < 50) { | |
$return['zoom'] = 14; | |
} | |
if ($accuracy < 20) { | |
$return['zoom'] = 12; | |
} | |
} | |
break; | |
} | |
return $return; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment