Ich versuche, die $ street, $ city und $ country string von google json zu bekommen. Es funktioniert für meine Heimatadresse: http://maps.googleapis.com/maps /api/geocode/json?latlng=52.108662,6.307370&sensor=true
$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'];
}
Für eine andere Adresse mit mehr Daten in den Arrays wie diesem Beispiel: http://maps.googleapis.com/maps/api/geocode/json?latlng=52.154184,6.199592&sensor=true es funktioniert nicht, weil das json-Array mehr Daten enthält und die Provinz zum Land macht.
Wie kann ich den Typ auswählen, den ich brauche (long_name)?
Beispielausgabe aus dem Geocode-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" ]
}
Ich denke ich habe es selbst behoben, hiermit mein 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"];
}
}
}
Sie könnten die Daten in das assoziative Array umwandeln und damit arbeiten
$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'];
Ihr Code ist absolut gut, aber wäre es nicht besser, einen Schalter innerhalb von 1 foreach anstelle von wiederholten foreach-Schleifen zu verwenden? So analysiere ich genau das gleiche Array:
$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;
}
}
Wenn Sie die Postleitzahl verwenden, um die Adresse zu finden, da ich kürzlich Straße, Stadt und Land mithilfe der Google MAP API generiert habe, lautet der Code:
$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;
Sieht aus wie der Job für einen Set-Parser wie JMESpath http://jmespath.org/
Gegeben das Array
{
"locations": [
{"name": "Seattle", "state": "WA"},
{"name": "New York", "state": "NY"},
{"name": "Bellevue", "state": "WA"},
{"name": "Olympia", "state": "WA"}
]
}
Ein JMESPath von:
locations[?state == 'WA'].name | sort(@) | {WashingtonCities: join(', ', @)}
erträge
{
"WashingtonCities": "Bellevue, Olympia, Seattle"
}
Sie müssten für Ihren Fall umschreiben, aber Sie wissen, wie mächtig diese Sprache ist. Sie können composer
verwenden, um eine JMESPath-Implementierung für PHP zu installieren