简体   繁体   中英

How to get formatted address from reverse geocoding JSON result?

This is the JSON output: I want to get only the formatted_address value & long_name & short_name. I referred to questions people already asked but I don't get it right. refered to:

get city from geocoder results?

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "Jalan Sungai Chua",
               "short_name" : "B11",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Sungai Chua",
               "short_name" : "Sungai Chua",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "Kajang",
               "short_name" : "Kajang",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Selangor",
               "short_name" : "Selangor",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Malaysia",
               "short_name" : "MY",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "43000",
               "short_name" : "43000",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "Jalan Sungai Chua, Sungai Chua, 43000 Kajang, Selangor, Malaysia",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 2.9932816,
                  "lng" : 101.787477
               },
               "southwest" : {
                  "lat" : 2.9932814,
                  "lng" : 101.7873144
               }
            },
            "location" : {
               "lat" : 2.9932815,
               "lng" : 101.7873957
            },
            "location_type" : "GEOMETRIC_CENTER",
            "viewport" : {
               "northeast" : {
                  "lat" : 2.994630480291502,
                  "lng" : 101.7887446802915
               },
               "southwest" : {
                  "lat" : 2.991932519708498,
                  "lng" : 101.7860467197085
               }
            }
         },
         "place_id" : "ChIJcSMkCHjLzTERU6wXGzYy14I",
         "types" : [ "route" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "Petronas Jalan Enggang",
               "short_name" : "Petronas Jalan Enggang",
               "types" : [ "point_of_interest", "establishment" ]
            },
            {
               "long_name" : "Kajang",
               "short_name" : "Kajang",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "Kajang",
               "short_name" : "Kajang",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Selangor",
               "short_name" : "Selangor",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Malaysia",
               "short_name" : "MY",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "43000",
               "short_name" : "43000",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "Petronas Jalan Enggang, Kajang, 43000 Kajang, Selangor, Malaysia",
         "geometry" : {
            "location" : {
               "lat" : 2.994144,
               "lng" : 101.78781
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 2.995492980291502,
                  "lng" : 101.7891589802915
               },
               "southwest" : {
                  "lat" : 2.992795019708498,
                  "lng" : 101.7864610197085
               }
            }
         },
         "place_id" : "ChIJN5uCE3jLzTERpHUSvJFj5To",
         "types" : [
            "bus_station",
            "transit_station",
            "point_of_interest",
            "establishment"
         ]
      },
      {
         "address_components" : [
            {
               "long_name" : "Kajang",
               "short_name" : "Kajang",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "Kajang",
               "short_name" : "Kajang",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Kajang",
               "short_name" : "Kajang",
               "types" : [ "administrative_area_level_4", "political" ]
            },
            {
               "long_name" : "Hulu Langat",
               "short_name" : "Hulu Langat",
               "types" : [ "administrative_area_level_3", "political" ]
            },
            {
               "long_name" : "Selangor",
               "short_name" : "Selangor",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Malaysia",
               "short_name" : "MY",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "43000",
               "short_name" : "43000",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "Kajang, 43000 Kajang, Selangor, Malaysia",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 2.9980711,
                  "lng" : 101.79819
               },
               "southwest" : {
                  "lat" : 2.986342,
                  "lng" : 101.7843368
               }
            },
            "location" : {
               "lat" : 2.9919972,
               "lng" : 101.7908387
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 2.9980711,
                  "lng" : 101.79819
               },
               "southwest" : {
                  "lat" : 2.986342,
                  "lng" : 101.7843368
               }
            }
         },
         "place_id" : "ChIJsfCmp3jLzTERJuiZjvHEHSA",
         "types" : [ "sublocality_level_1", "sublocality", "political" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "Kajang",
               "short_name" : "Kajang",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Hulu Langat",
               "short_name" : "Hulu Langat",
               "types" : [ "administrative_area_level_3", "political" ]
            },
            {
               "long_name" : "Selangor",
               "short_name" : "Selangor",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Malaysia",
               "short_name" : "MY",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Kajang, Selangor, Malaysia",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 3.069515,
                  "lng" : 101.8336388
               },
               "southwest" : {
                  "lat" : 2.8684469,
                  "lng" : 101.69742
               }
            },
            "location" : {
               "lat" : 2.993518,
               "lng" : 101.7874058
            },

MY PHP function to get the reverse geocoding for the lat and lon given

public function get_location()
    {
        $this->location = $param;
         $location = file_get_contents('http://maps.googleapis.com/maps/api/geocode/json?latlng=2.993518,101.7874058&sensor=true');

         return $location;
    }

I tried parsing like this:

$search = new search();
$data = $search->get_location();//caries the JSON data
$return['json']= json_encode($data);
$data = json_decode($return['json'], true);

But how to target long_name,formatted address and so on?

The following example demonstrates how to parse and access Geocoding Service result long_name & short_name properties in PHP:

$json = file_get_contents('http://maps.googleapis.com/maps/api/geocode/json?latlng=2.993518,101.7874058&sensor=true');
$data = json_decode($json, true);


foreach ($data['results'] as $item) {
    if( !empty( $item['address_components'] ) ){
        $longName = $item['address_components'][0]['long_name']; 
        $shortName = $item['address_components'][0]['short_name']; 

        print_r('Long Name:' . $longName);
        print_r(' Short Name:' . $shortName);
    }

}

PhpFiddle

First, you can read all about the geocoder result types here -> https://developers.google.com/maps/documentation/geocoding/intro

I would convert the JSON to a stdClass for convenience :

$location = json_decode($location);

Then parse it like this :

$geoResults = [];
foreach($location->results as $result){
    $geoResult = [];    
    foreach ($result->address_components as $address) {
        if ($address->types[0] == 'country') {
            $geoResult['country'] = $address->long_name;
        }
        if ($address->types[0] == 'administrative_area_level_1') {
            $geoResult['state'] = $address->long_name;
        }
        if ($address->types[0] == 'administrative_area_level_2') {
            $geoResult['county'] = $address->long_name;
        }
        if ($address->types[0] == 'locality') {
            $geoResult['city'] = $address->long_name;
        }
        if ($address->types[0] == 'postal_code') {
            $geoResult['postal_code'] = $address->long_name;
        }       
        if ($address->types[0] == 'route') {
            $geoResult['route'] = $address->long_name;
        }       
    }
    $geoResults[] = $geoResult;
}

Now you have a $geoResults array with named properties :

Array
(
    [0] => Array
        (
            [route] => Jalan Sungai Chua
            [city] => Kajang
            [state] => Selangor
            [country] => Malaysia
            [postal_code] => 43000
        )

    [1] => Array
        (
            [city] => Kajang
            [state] => Selangor
            [country] => Malaysia
            [postal_code] => 43000
        )

    [2] => Array
        (
            [city] => Kajang
            [state] => Selangor
            [country] => Malaysia
            [postal_code] => 43000
        )

    [3] => Array
        (
            [city] => Kajang
            [state] => Selangor
            [country] => Malaysia
        )

    [4] => Array
        (
            [state] => Selangor
            [country] => Malaysia
        )

    [5] => Array
        (
            [postal_code] => 43000
            [state] => Selangor
            [country] => Malaysia
        )

    [6] => Array
        (
            [state] => Selangor
            [country] => Malaysia
        )

    [7] => Array
        (
            [state] => Selangor
            [country] => Malaysia
        )

    [8] => Array
        (
            [country] => Malaysia
        )

)

You can iterate over all found cities like this :

foreach($geoResults as $result) {
    echo isset($result['city']) ? $result['city'] : 'N/A';
    echo '<br>';
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM