kaya new
kaya new

Reputation: 123

get country, region and city name from longitude and latitude (PHP)

I would like to get country, pincode,state and city name from longitude and latitude over Google maps API - with PHP. but sometimes it works correct, but sometime it gets wrong information and many times it returns null values because the result comes is dynamic not fixed.

so anybody suggest me how to make this dynamic and check inside is country city pincode and state are available in any of the array index from result ....

below is my code...

$fromlat = $this->request->data['Order']['from_lat'];
            $fromlong = $this->request->data['Order']['from_long'];

            $geocode = file_get_contents('http://maps.googleapis.com/maps/api/geocode/json?latlng='.$fromlat.','.$fromlong.'&sensor=false');
            $json = json_decode($geocode);

            //print_r($geocode); 
            $country = $json->{'results'}[1]->{'address_components'}[3]->{'long_name'};
            $state = $json->{'results'}[1]->{'address_components'}[2]->{'long_name'};
            $city = $json->{'results'}[1]->{'address_components'}[1]->{'long_name'};            
            $locality = $json->{'results'}[1]->{'address_components'}[0]->{'long_name'};        
            $pincode = $json->{'results'}[1]->{'address_components'}[4]->{'long_name'};                 
            echo $locality."</br>".$country."</br>".$state."</br>".$city."</br>".$pincode;

i need to check types in address components like below in result forloop and if available then display result.

 types = country = country name;
            types = administrative_area_level_1 = state name ;
            types = administrative_area_level_2 = city name ;
            types = postal_code = pincode ;

below is my result array...

stdClass Object
(
    [results] => Array
        (
            [0] => stdClass Object
                (
                    [address_components] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [long_name] => Kurkheda - Wadsa - Bramhapuri - Nagpur Highway
                                    [short_name] => MH MSH 9
                                    [types] => Array
                                        (
                                            [0] => route
                                        )

                                )

                            [1] => stdClass Object
                                (
                                    [long_name] => Nagpur
                                    [short_name] => Nagpur
                                    [types] => Array
                                        (
                                            [0] => administrative_area_level_2
                                            [1] => political
                                        )

                                )

                            [2] => stdClass Object
                                (
                                    [long_name] => Maharashtra
                                    [short_name] => MH
                                    [types] => Array
                                        (
                                            [0] => administrative_area_level_1
                                            [1] => political
                                        )

                                )

                            [3] => stdClass Object
                                (
                                    [long_name] => India
                                    [short_name] => IN
                                    [types] => Array
                                        (
                                            [0] => country
                                            [1] => political
                                        )

                                )

                            [4] => stdClass Object
                                (
                                    [long_name] => 441204
                                    [short_name] => 441204
                                    [types] => Array
                                        (
                                            [0] => postal_code
                                        )

                                )

                        )

                    [formatted_address] => Kurkheda - Wadsa - Bramhapuri - Nagpur Hwy, Maharashtra 441204, India
                    [geometry] => stdClass Object
                        (
                            [bounds] => stdClass Object
                                (
                                    [northeast] => stdClass Object
                                        (
                                            [lat] => 21.0633475
                                            [lng] => 79.1652473
                                        )

                                    [southwest] => stdClass Object
                                        (
                                            [lat] => 21.0599518
                                            [lng] => 79.1646723
                                        )

                                )

                            [location] => stdClass Object
                                (
                                    [lat] => 21.0616013
                                    [lng] => 79.1647236
                                )

                            [location_type] => GEOMETRIC_CENTER
                            [viewport] => stdClass Object
                                (
                                    [northeast] => stdClass Object
                                        (
                                            [lat] => 21.0633475
                                            [lng] => 79.166308780291
                                        )

                                    [southwest] => stdClass Object
                                        (
                                            [lat] => 21.0599518
                                            [lng] => 79.163610819708
                                        )

                                )

                        )

                    [place_id] => ChIJj5wNX6O51DsRz53GLG9aZRM
                    [types] => Array
                        (
                            [0] => route
                        )

                )

            [1] => stdClass Object
                (
                    [address_components] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [long_name] => Kalamana
                                    [short_name] => Kalamana
                                    [types] => Array
                                        (
                                            [0] => locality
                                            [1] => political
                                        )

                                )

                            [1] => stdClass Object
                                (
                                    [long_name] => Nagpur
                                    [short_name] => Nagpur
                                    [types] => Array
                                        (
                                            [0] => administrative_area_level_2
                                            [1] => political
                                        )

                                )

                            [2] => stdClass Object
                                (
                                    [long_name] => Maharashtra
                                    [short_name] => MH
                                    [types] => Array
                                        (
                                            [0] => administrative_area_level_1
                                            [1] => political
                                        )

                                )

                            [3] => stdClass Object
                                (
                                    [long_name] => India
                                    [short_name] => IN
                                    [types] => Array
                                        (
                                            [0] => country
                                            [1] => political
                                        )

                                )

                            [4] => stdClass Object
                                (
                                    [long_name] => 441204
                                    [short_name] => 441204
                                    [types] => Array
                                        (
                                            [0] => postal_code
                                        )

                                )

                        )

                    [formatted_address] => Kalamana, Maharashtra 441204, India
                    [geometry] => stdClass Object
                        (
                            [bounds] => stdClass Object
                                (
                                    [northeast] => stdClass Object
                                        (
                                            [lat] => 21.0628156
                                            [lng] => 79.164412
                                        )

                                    [southwest] => stdClass Object
                                        (
                                            [lat] => 21.0589309
                                            [lng] => 79.1617083
                                        )

                                )

                            [location] => stdClass Object
                                (
                                    [lat] => 21.0605174
                                    [lng] => 79.1629662
                                )

                            [location_type] => APPROXIMATE
                            [viewport] => stdClass Object
                                (
                                    [northeast] => stdClass Object
                                        (
                                            [lat] => 21.0628156
                                            [lng] => 79.164412
                                        )

                                    [southwest] => stdClass Object
                                        (
                                            [lat] => 21.0589309
                                            [lng] => 79.1617083
                                        )

                                )

                        )

                    [place_id] => ChIJ2yhznKO51DsRGZWqNrtKBD4
                    [types] => Array
                        (
                            [0] => locality
                            [1] => political
                        )

                )

            [2] => stdClass Object
                (
                    [address_components] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [long_name] => 441204
                                    [short_name] => 441204
                                    [types] => Array
                                        (
                                            [0] => postal_code
                                        )

                                )

                            [1] => stdClass Object
                                (
                                    [long_name] => Nagpur
                                    [short_name] => Nagpur
                                    [types] => Array
                                        (
                                            [0] => administrative_area_level_2
                                            [1] => political
                                        )

                                )

                            [2] => stdClass Object
                                (
                                    [long_name] => Maharashtra
                                    [short_name] => MH
                                    [types] => Array
                                        (
                                            [0] => administrative_area_level_1
                                            [1] => political
                                        )

                                )

                            [3] => stdClass Object
                                (
                                    [long_name] => India
                                    [short_name] => IN
                                    [types] => Array
                                        (
                                            [0] => country
                                            [1] => political
                                        )

                                )

                        )

                    [formatted_address] => Maharashtra 441204, India
                    [geometry] => stdClass Object
                        (
                            [bounds] => stdClass Object
                                (
                                    [northeast] => stdClass Object
                                        (
                                            [lat] => 21.139709
                                            [lng] => 79.3452018
                                        )

                                    [southwest] => stdClass Object
                                        (
                                            [lat] => 20.8714046
                                            [lng] => 79.0962536
                                        )

                                )

                            [location] => stdClass Object
                                (
                                    [lat] => 20.9903768
                                    [lng] => 79.2451149
                                )

                            [location_type] => APPROXIMATE
                            [viewport] => stdClass Object
                                (
                                    [northeast] => stdClass Object
                                        (
                                            [lat] => 21.139709
                                            [lng] => 79.3452018
                                        )

                                    [southwest] => stdClass Object
                                        (
                                            [lat] => 20.8714046
                                            [lng] => 79.0962536
                                        )

                                )

                        )

                    [place_id] => ChIJKTHfbpOw1DsRGwYyMATAfU4
                    [types] => Array
                        (
                            [0] => postal_code
                        )

                )

            [3] => stdClass Object
                (
                    [address_components] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [long_name] => Nagpur
                                    [short_name] => Nagpur
                                    [types] => Array
                                        (
                                            [0] => administrative_area_level_2
                                            [1] => political
                                        )

                                )

                            [1] => stdClass Object
                                (
                                    [long_name] => Maharashtra
                                    [short_name] => MH
                                    [types] => Array
                                        (
                                            [0] => administrative_area_level_1
                                            [1] => political
                                        )

                                )

                            [2] => stdClass Object
                                (
                                    [long_name] => India
                                    [short_name] => IN
                                    [types] => Array
                                        (
                                            [0] => country
                                            [1] => political
                                        )

                                )

                        )

                    [formatted_address] => Nagpur, Maharashtra, India
                    [geometry] => stdClass Object
                        (
                            [bounds] => stdClass Object
                                (
                                    [northeast] => stdClass Object
                                        (
                                            [lat] => 21.713785
                                            [lng] => 79.65179
                                        )

                                    [southwest] => stdClass Object
                                        (
                                            [lat] => 20.5841799
                                            [lng] => 78.2515599
                                        )

                                )

                            [location] => stdClass Object
                                (
                                    [lat] => 21.3170198
                                    [lng] => 79.1999949
                                )

                            [location_type] => APPROXIMATE
                            [viewport] => stdClass Object
                                (
                                    [northeast] => stdClass Object
                                        (
                                            [lat] => 21.713785
                                            [lng] => 79.65179
                                        )

                                    [southwest] => stdClass Object
                                        (
                                            [lat] => 20.5841799
                                            [lng] => 78.2515599
                                        )

                                )

                        )

                    [place_id] => ChIJ691n-cTA1DsRh3HGEikxZ2E
                    [types] => Array
                        (
                            [0] => administrative_area_level_2
                            [1] => political
                        )

                )

            [4] => stdClass Object
                (
                    [address_components] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [long_name] => Maharashtra
                                    [short_name] => MH
                                    [types] => Array
                                        (
                                            [0] => administrative_area_level_1
                                            [1] => political
                                        )

                                )

                            [1] => stdClass Object
                                (
                                    [long_name] => India
                                    [short_name] => IN
                                    [types] => Array
                                        (
                                            [0] => country
                                            [1] => political
                                        )

                                )

                        )

                    [formatted_address] => Maharashtra, India
                    [geometry] => stdClass Object
                        (
                            [bounds] => stdClass Object
                                (
                                    [northeast] => stdClass Object
                                        (
                                            [lat] => 22.027909
                                            [lng] => 80.890924
                                        )

                                    [southwest] => stdClass Object
                                        (
                                            [lat] => 15.602412
                                            [lng] => 72.6593629
                                        )

                                )

                            [location] => stdClass Object
                                (
                                    [lat] => 19.7514798
                                    [lng] => 75.7138884
                                )

                            [location_type] => APPROXIMATE
                            [viewport] => stdClass Object
                                (
                                    [northeast] => stdClass Object
                                        (
                                            [lat] => 22.027909
                                            [lng] => 80.890924
                                        )

                                    [southwest] => stdClass Object
                                        (
                                            [lat] => 15.602412
                                            [lng] => 72.6593629
                                        )

                                )

                        )

                    [place_id] => ChIJ-dacnB7EzzsRtk_gS5IiLxs
                    [types] => Array
                        (
                            [0] => administrative_area_level_1
                            [1] => political
                        )

                )

            [5] => stdClass Object
                (
                    [address_components] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [long_name] => India
                                    [short_name] => IN
                                    [types] => Array
                                        (
                                            [0] => country
                                            [1] => political
                                        )

                                )

                        )

                    [formatted_address] => India
                    [geometry] => stdClass Object
                        (
                            [bounds] => stdClass Object
                                (
                                    [northeast] => stdClass Object
                                        (
                                            [lat] => 35.5087008
                                            [lng] => 97.395561
                                        )

                                    [southwest] => stdClass Object
                                        (
                                            [lat] => 6.7535159
                                            [lng] => 68.1623859
                                        )

                                )

                            [location] => stdClass Object
                                (
                                    [lat] => 20.593684
                                    [lng] => 78.96288
                                )

                            [location_type] => APPROXIMATE
                            [viewport] => stdClass Object
                                (
                                    [northeast] => stdClass Object
                                        (
                                            [lat] => 35.5087008
                                            [lng] => 97.395561
                                        )

                                    [southwest] => stdClass Object
                                        (
                                            [lat] => 6.7535159
                                            [lng] => 68.1633666
                                        )

                                )

                        )

                    [place_id] => ChIJkbeSa_BfYzARphNChaFPjNc
                    [types] => Array
                        (
                            [0] => country
                            [1] => political
                        )

                )

        )

    [status] => OK
)

Upvotes: 0

Views: 1661

Answers (2)

Hash
Hash

Reputation: 31

Proper way to extract values of address components is done as following :

    if (results[0]) {
            $("input[name=lat]").val(results[0].geometry.location.lat());
            $("input[name=lng]").val(results[0].geometry.location.lng());

            var addressArr = [];
            $.each(results[0].address_components, function (key, val) {
                if (!$.inArray("country", results[0].address_components[key].types)) {
                    addressArr['country'] = results[0].address_components[key].long_name;
                }
                if (!$.inArray("administrative_area_level_1", results[0].address_components[key].types)) {
                    addressArr['state'] = results[0].address_components[key].long_name;
                }
                if (!$.inArray("administrative_area_level_2", results[0].address_components[key].types)) {
                    addressArr['city'] = results[0].address_components[key].long_name;
                }
            });
            console.log(addressArr);
        }
    }

Upvotes: 2

cnizzardini
cnizzardini

Reputation: 1240

I have some similar code that is known to work. Basically it can return a results array if there are more than one results possible or just an object if only one result is found. My use-case is slightly different, but hopefully it helps. Try this:

    $ch = curl_init();
    $geoCodeUrl = 'https://maps.googleapis.com/maps/api/geocode/json?address=' . $zip . ',+United+States&key=' . $googleApiKey;
    curl_setopt($ch,CURLOPT_URL, $geoCodeUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    $result = curl_exec($ch);
    curl_close($ch);

    $GeoCode = json_decode($result);
    $GeoLocator = new \stdClass();

    if( isset($GeoCode->results[0]) ){
        $GeoLocator->lat = $GeoCode->results[0]->geometry->location->lat;
        $GeoLocator->lon = $GeoCode->results[0]->geometry->location->lng;
        foreach($GeoCode->results[0]->address_components as $comp){
            if( in_array('locality',$comp->types) ){
                $GeoLocator->city = trim($comp->short_name);
            }
            else if( in_array('administrative_area_level_1',$comp->types) ){
                $GeoLocator->state = strtoupper(trim(preg_replace('/\d/', '', $comp->short_name)));
            }
        }

    }
    else if( isset($GeoCode->results) && isset($GeoCode->results->geometry) ){
        $GeoLocator->lat = $GeoCode->results->geometry->location->lat;
        $GeoLocator->lon = $GeoCode->results->geometry->location->lng;
        foreach($GeoCode->results->address_components as $comp){
            if( in_array('locality',$comp->types) ){
                $GeoLocator->city = trim($comp->short_name);
            }
            else if( in_array('administrative_area_level_1',$comp->types) ){
                $GeoLocator->state = strtoupper(trim(preg_replace('/\d/', '', $comp->short_name)));
            }
        }
    }

Upvotes: 0

Related Questions