2013-08-11 21 views
10

Googleストリート、$都市および$国の文字列をGoogle jsonから取得しようとしています。 それは私の自宅の住所のために働く:JSON配列でより多くのデータがあるので、 http://maps.googleapis.com/maps/api/geocode/json?latlng=52.154184,6.199592&sensor=true それは動作しません。 http://maps.googleapis.com/maps/api/geocode/json?latlng=52.108662,6.307370&sensor=trueGoogleを使用して逆ジオコーディングで道路、都市および国を取得する

$url = "http://maps.googleapis.com/maps/api/geocode/json?latlng=".$lat.",".$lng."&sensor=true"; 
    $data = @file_get_contents($url); 
    $jsondata = json_decode($data,true); 
    if(is_array($jsondata) && $jsondata['status'] == "OK") 
    { 
      $city = $jsondata['results']['0']['address_components']['2']['long_name']; 
      $country = $jsondata['results']['0']['address_components']['5']['long_name']; 
      $street = $jsondata['results']['0']['address_components']['1']['long_name']; 
    } 

しかし、この例のような配列で、より多くのデータと異なるアドレスのためにそれは州を国にします。

必要なタイプ(long_name)を選択するにはどうすればよいですか?ストリート用

  • :[ "ルート"]都市のための
  • :LONG_NAME "タイプ":[ "地域"、 "政治的"]国の
  • :LONG_NAME " "種類" LONG_NAMEタイプ」:[ "国"、 "政治的"]ジオコードJSONから

出力例:

{ 
    "results" : [ 
     { 
     "address_components" : [ 
      { 
       "long_name" : "89", 
       "short_name" : "89", 
       "types" : [ "street_number" ] 
      }, 
      { 
       "long_name" : "Wieck De", 
       "short_name" : "Wieck De", 
       "types" : [ "establishment" ] 
      }, 
      { 
       "long_name" : "Industrieweg", 
       "short_name" : "Industrieweg", 
       "types" : [ "route" ] 
      }, 
      { 
       "long_name" : "Zutphen", 
       "short_name" : "Zutphen", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Zutphen", 
       "short_name" : "Zutphen", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "Gelderland", 
       "short_name" : "GE", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "Nederland", 
       "short_name" : "NL", 
       "types" : [ "country", "political" ] 
      }, 
      { 
       "long_name" : "7202 CA", 
       "short_name" : "7202 CA", 
       "types" : [ "postal_code" ] 
      } 

は、私はここに、私はそれを修正自分自身を考えます私のコード:

// street 
foreach ($jsondata["results"] as $result) { 
    foreach ($result["address_components"] as $address) { 
     if (in_array("route", $address["types"])) { 
      $street = $address["long_name"]; 
     } 
    } 
} 
// city 
foreach ($jsondata["results"] as $result) { 
    foreach ($result["address_components"] as $address) { 
     if (in_array("locality", $address["types"])) { 
      $city = $address["long_name"]; 
     } 
    } 
} 
// country 
foreach ($jsondata["results"] as $result) { 
    foreach ($result["address_components"] as $address) { 
     if (in_array("country", $address["types"])) { 
      $country = $address["long_name"]; 
     } 
    } 
} 

答えて

6

あなたが連想配列にデータを変換し、

$data = array(); 
foreach($jsondata['results']['0']['address_components'] as $element){ 
    $data[ implode(' ',$element['types']) ] = $element['long_name']; 
} 
print_r($data); 

echo 'route: ' . $data['route'] . "\n"; 
echo 'country: ' . $data['country political']; 
3

あなたのコードが完全に良いですが、1の内部スイッチを使用するほうがよいのではないだろうようにそれで仕事ができます繰り返しforeachループの代わりにforeach?ここで私は正確に同じ配列を解析する方法である:

$location = array(); 

    foreach ($result['address_components'] as $component) { 

    switch ($component['types']) { 
     case in_array('street_number', $component['types']): 
     $location['street_number'] = $component['long_name']; 
     break; 
     case in_array('route', $component['types']): 
     $location['street'] = $component['long_name']; 
     break; 
     case in_array('sublocality', $component['types']): 
     $location['sublocality'] = $component['long_name']; 
     break; 
     case in_array('locality', $component['types']): 
     $location['locality'] = $component['long_name']; 
     break; 
     case in_array('administrative_area_level_2', $component['types']): 
     $location['admin_2'] = $component['long_name']; 
     break; 
     case in_array('administrative_area_level_1', $component['types']): 
     $location['admin_1'] = $component['long_name']; 
     break; 
     case in_array('postal_code', $component['types']): 
     $location['postal_code'] = $component['long_name']; 
     break; 
     case in_array('country', $component['types']): 
     $location['country'] = $component['long_name']; 
     break; 
    } 

    } 
+0

最初のコンポーネントが最も信頼性が高く、 'cases'、' if'ループを作成するだけで正常に動作するため、これは機能しません。 –

2

あなたは郵便番号コードがあるのGoogle MAP APIを使用して、私が最近生成したとして、通り、都市、国のアドレスを見つけるために使用する場合:

$search_code = urlencode($postcode); 
     $url = 'http://maps.googleapis.com/maps/api/geocode/json?address=' . $search_code . '&sensor=false'; 
     $json = json_decode(file_get_contents($url)); 
     if($json->results == []){ 
      return ''; 
     } 
     $lat = $json->results[0]->geometry->location->lat; 
     $lng = $json->results[0]->geometry->location->lng; 

     //Now build the actual lookup 
     $address_url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng=' . $lat . ',' . $lng . '&sensor=false'; 
     $address_json = json_decode(file_get_contents($address_url)); 

     $address_data = $address_json->results[0]->address_components; 
     //return $address_data = $address_json->results[0]->formatted_address; 

     $street = str_replace('Dr', 'Drive', $address_data[1]->long_name); 
     $town = $address_data[2]->long_name; 
     $county = $address_data[3]->long_name; 

     return $street.', '. $town. ', '.$county; 
関連する問題