A project I’m working on at the moment had a requirement for reverse geocoding (ie: taking a set of latitude / longitude co-ordinates and returning a placename) of some data coming from an iPhone application.
There’s plenty of information available for doing address to long/lat encoding using google maps and the like, but not much on going the other way.
Luckily, I found the GeoNames database, a freely accessible geographical database which offers an easy to use api.
The specific bit I’m interested in is accessed by calling this url (with your lat/long co-ordinates of course!)
http://ws.geonames.org/findNearbyPlaceNameJSON?lat=53.4978&lng=-2.5013
This returns some JSON encoded data as follows:
{"geonames":
[{
"countryName":"United Kingdom",
"adminCode1":"ENG",
"fclName":"city,village,...",
"countryCode":"GB",
"lng":-2.5166667,
"fcodeName":"populated place",
"distance":"1.90284",
"toponymName":"Leigh",
"fcl":"P",
"name":"Leigh",
"fcode":"PPL",
"geonameId":2644660,
"lat":53.4833333,
"adminName1":"England",
"population":43626}
]}
There’s a lot of info there, but the specific bits I was interested in are the placename and the country.
Here’s the code:
$url = "http://ws.geonames.org/findNearbyPlaceNameJSON?lat=$lat&lng=$long";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_PROXY, 'myproxy:800');
$json = curl_exec($ch);
curl_close($ch);
$data = json_decode($json, true);
foreach ($data["geonames"] as $key => $val) {
$placename = $val["name"];
$countryname = $val['countryName'];
$countrycode = $val["countryCode"];
}
As you can see, I’m sat behind a proxy so I have to use curl to get the page. If you’re not, you can replace all the curl stuff with a simple file_get_contents($url) (depending on your PHP config of course).
Also of note, if you live in the US you can get the nearest address instead of the nearest placename using a different GeoName api call. There’s a list of API calls available here