I have a database with exact addresses (street, no, city, region/area, country). However, I was wondering if there was a way to use Google API to get the district of a city (e.g. "Manhattan") if we are in New York?
All the other information I have already in the database, so I would just need the district if there is one (of course this will be only in larger cities)...
UPDATE:
I found this function on http://www.techques.com/question/1-3151450/Google-geolocation-API---Use-longitude-and-latitude-to-get-address and tried to change formatted_address
to sublocality (even others like short_name etc.) but it does not return anything... any help would be highly appreciated! Thank you!!
function reverse_geocode($lat, $lon) {
$url = "http://maps.google.com/maps/api/geocode/json?latlng=$lat,$lon&sensor=false";
$data = json_decode(file_get_contents($url));
if (!isset($data->results[0]->formatted_address)){
return "unknown Place";
}
return $data->results[0]->formatted_address;
}
You can access the sublocality like this:
function reverse_geocode($lat, $lon) {
$url = "http://maps.google.com/maps/api/geocode/json?latlng=$lat,$lon&sensor=false";
$data = json_decode(file_get_contents($url));
if (!isset($data->results[0]->address_components)){
return "unknown Place";
}
if ($data->results[0]->address_components[2]->types[0]=="sublocality") {
$return_array['type']="sublocality";
$return_array['sublocality_long_name']=$data->results[0]->address_components[2]->long_name;
$return_array['sublocality_short_name']=$data->results[0]->address_components[2]->short_name;
return $return_array;
}
}
You'll find this information inside a geocode-request, when there exists a result with the types
set to
[ "sublocality", "political" ]
Example: 317 Madison Ave,New York City
Modification of the function above for easy access of the response-components:
/**
* @param $a mixed latitude or address
* @param $b mixed optional longitude when $a is latitude
* @return object geocoding-data
**/
function geocode($a, $b=null) {
$params=array('sensor'=>'false');
if(is_null($b))
{
$params['address']=$a;
}
else
{
$params['latlng']=implode(',',array($a,$b));
}
$url = 'http://maps.google.com/maps/api/geocode/json?'.http_build_query($params,'','&');
$result=@file_get_contents($url);
$response=new StdClass;
$response->street_address = null;
$response->route = null;
$response->country = null;
$response->administrative_area_level_1 = null;
$response->administrative_area_level_2 = null;
$response->administrative_area_level_3 = null;
$response->locality = null;
$response->sublocality = null;
$response->neighborhood = null;
$response->postal_code = null;
$response->formatted_address = null;
$response->latitude = null;
$response->longitude = null;
$response->status = 'ERROR';
if($result)
{
$json=json_decode($result);
$response->status=$json->status;
if($response->status=='OK')
{
$response->formatted_address=$json->results[0]->formatted_address;
$response->latitude=$json->results[0]->geometry->location->lat;
$response->longitude=$json->results[0]->geometry->location->lng;
foreach($json->results[0]->address_components as $value)
{
if(array_key_exists($value->types[0],$response))
{
$response->{$value->types[0]}=$value->long_name;
}
}
}
}
return $response;
}
//sample usage
echo '<hr/>'.geocode('317 Madison Ave,New York City')->sublocality;
//Manhattan
echo '<hr/>'.geocode('foobar')->status;
//ZERO_RESULTS
echo '<hr/>'.geocode('40.689758, -74.04513800000001')->formatted_address;
//1 Liberty Is, Brooklyn, NY 11231, USA
I came up with the following.
function geocode() {
var geocoder = new google.maps.Geocoder();
var lat = $('#latitude').val()
var lng = $('#longitude').val()
var latlng = {lat: parseFloat(lat), lng: parseFloat(lng)};
geocoder.geocode(
{'location': latlng},
function(results, status) {
if (status === 'OK') {
for (var i = 0; i < results[0].address_components.length; i++)
{
if (status == google.maps.GeocoderStatus.OK) {
if (results[0]) {
for (var i = 0; i < results.length; i++) {
//alert(results[i].types[0]+','+results[i].types[1]+','+results[i].address_components[0].long_name)
//district
if (results[i].types[0]=='political' && results[i].types[1]=='sublocality' ){
alert(results[i].address_components[0].long_name);
}
//City
if (results[i].types[0]=='locality' && results[i].types[1]=='political' ){
alert(results[i].address_components[0].long_name);
}
//country
if (results[i].types[0]=='country' && results[i].types[1]=='political' ){
alert(results[i].address_components[0].long_name);
}
}
}
else {console.log("No reverse geocode results.")}
}
else {console.log("Geocoder failed: " + status)}
}
}})
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>