Php 使用谷歌反向地理编码获取街道、城市和国家
我正在尝试从谷歌json获取$street、$city和$country字符串。 它适用于我的家庭地址: 但对于数组中包含更多数据的不同地址,如本例所示: 它不起作用,因为json数组中有更多的数据,这使该省成为了一个国家 如何选择所需的类型(长名称)Php 使用谷歌反向地理编码获取街道、城市和国家,php,json,google-maps,geocoding,Php,Json,Google Maps,Geocoding,我正在尝试从谷歌json获取$street、$city和$country字符串。 它适用于我的家庭地址: 但对于数组中包含更多数据的不同地址,如本例所示: 它不起作用,因为json数组中有更多的数据,这使该省成为了一个国家 如何选择所需的类型(长名称) 对于街道:long_名称,其中“类型”:[“路线”] 对于城市:long_名称,其中“类型”:[“地区”、“政治”] 对于国家:long_名称,其中“类型”:[“国家”,“政治”] 地理代码JSON的输出示例: { "results"
- 对于街道:long_名称,其中“类型”:[“路线”]
- 对于城市:long_名称,其中“类型”:[“地区”、“政治”]
- 对于国家:long_名称,其中“类型”:[“国家”,“政治”]
{
"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"];
}
}
}
您可以将数据转换为关联数组,并像
$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'];
您的代码非常好,但是在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;
}
}
如果您使用邮政编码查找地址,正如我最近使用Google MAP API生成的street、city、country,则代码为:
$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;
看起来像是JMESpath这样的集合解析器的工作 给定数组
{
"locations": [
{"name": "Seattle", "state": "WA"},
{"name": "New York", "state": "NY"},
{"name": "Bellevue", "state": "WA"},
{"name": "Olympia", "state": "WA"}
]
}
一个JMESPath:
locations[?state=='WA'].name | sort(@){WashingtonCities:join(',',@)}
屈服
{
"WashingtonCities": "Bellevue, Olympia, Seattle"
}
你必须重写你的案例,但是你知道这种语言有多强大。您可以使用
composer
为PHP安装JMESPath实现这不会起作用,因为第一个组件是最可靠的,只需使案例
,if
循环即可。
{
"WashingtonCities": "Bellevue, Olympia, Seattle"
}